먼저 각 연산자가 무엇인지 알아야합니다. :: 1 :: 2 :: 3 :: [] 1,2,3] @ puts 다음과 같이 개별 요소를 기존 목록에 넣습니다. 두 개의 목록이 함께 표시 될 수 있습니다. [1,2] @ [3,4] = [1,2,3,4]
다음을 사용하여 목록을 정리할 수도 있지만 다음과 같은 목록의 목록이됩니다. : [1,2] :: [3,4]] [[1,2], [3,4]]
그래서 [x :: y]를 쓰면 x와 y가 리스트 안에있는리스트.
과 문이 목록의 끝을 확인하는 경우 대신이 같은 그것을 할 패턴을 사용할 수를 사용 야해 :
fun listofnodes [] = []
| listofnodes ((x,y)::xs) = x :: y :: listofnodes(xs);
첫 번째 패턴은 보장이 우리의 끝에 도달 할 때 리스트에서 xs가 자신과 함께 호출하는 빈리스트에 바인드 된 마지막 튜플을 추출 할 때 모든 엘리먼트를 넣기위한 빈리스트를 남겨두기 때문에 [(1,2) (3,4) (5, 6) (1,5)]는 다음과 같이 평가할 수 있습니다.
1 :: 2 :: 3 :: 4 :: 5 :: 6 :: 1 :: 5 :: [] = [1,2,3 , 4,5,6,1,5].
fun listofnodes [] = []
| listofnodes ((x,y)::xs) = [x,y] @ listofnodes(xs);
이 방법은 각 튜플에서 작은 두 요소 목록을 확인한 다음 하나 개의 큰 목록에 모든 작은 목록을 병합 :
당신은이처럼 만들 수 있습니다. 당신은 실제로 빈리스트가 필요 없지만리스트의 끝에서 재귀가 멈추고 등호의 다른쪽에 뭔가를 두어야 만하는 유일한 방법입니다. 다음과 같이 평가합니다 :
[1,2] @ [3,4] @ [5,6] @ [1,5] @ [] = [1,2,3,4,5,6,1 , 5].
또한 x 및 y를 int로 변환하지만 실제로는 그렇지 않습니다. 만약 당신이 없다면, 타입 ("a * 'a)리스트 ->'리스트 '를 얻습니다. 이것은 int를 포함한 모든 입력 타입에 대해 작동한다는 것을 의미합니다 (tuple이 char 같은 상충되는 타입을 포함하지 않는 한 int). 당신이 이것을 알고 있다고 추측하고 있지만, 당신이 원하지 않는 경우를 대비해서 : 당신이 쌍이라고 부르는 것 (1,2)을 튜플이라 부릅니다.
고마워요 .. 어쨌든 당신이 대답하기 전에 나는 이것을 작성했고 그것도 효과가있었습니다.재미있는 getlistoftuples ((x, y) :: xs) = x :: [y] @getlistoftuples (xs) | getlistoftuples (nil) = nil; @Gnurgen – Rpant
와우는 돌아 오기가 더디지 만, x :: [y]는 [x, y] =와 같은 목록 안에 두 요소를 정의하는 것과 같습니다. – Gnurgen