2012-09-20 5 views
0

그래프를 표현하고 정수리스트를 반환하는 간단한 함수를 쓰려고한다면 : 그래프의 모든 노드 예 : 입력이 [(1, 2) (3,4) (5,6) (1,5)] o/p는 [1,2,3,4,5,6,1,5]이어야합니다. 이 함수는 단순히 노드 목록을 반환합니다. , 반환 목록 값에서 위와 같이 반복 될 수 있습니다. 다음 함수를 작성했습니다.정수리스트를 반환하는 간단한 함수

fun listofnodes (x : int, y : int) :: xs = nil then [x :: y] else [[x :: y] @listofnodes (xs)]

표준 입력 : 15.12-15.18 오류 : 연산자 및 피연산자 TYCON 불일치 [ 오퍼레이터 도메인 동의하지 : INT의 *의 INT리스트 피연산자 : 식 INT * INT : X : Y한다.

무엇이 잘못되었는지를 알 수 없습니다.

답변

1

먼저 각 연산자가 무엇인지 알아야합니다. :: 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)을 튜플이라 부릅니다.

+0

고마워요 .. 어쨌든 당신이 대답하기 전에 나는 이것을 작성했고 그것도 효과가있었습니다.재미있는 getlistoftuples ((x, y) :: xs) = x :: [y] @getlistoftuples (xs) | getlistoftuples (nil) = nil; @Gnurgen – Rpant

+0

와우는 돌아 오기가 더디지 만, x :: [y]는 [x, y] =와 같은 목록 안에 두 요소를 정의하는 것과 같습니다. – Gnurgen

관련 문제