재귀

2017-03-20 1 views
1

I'm brand new to SML/NJ and I'm trying to make a recursive function that makes a listOfLists. Ex: listOf([1,2,3,4]) will output [[1],[2],[3],[4]] . I've found a recursive merge in SML/NJ, and I'm trying to use it as kind've an outline:재귀

- fun merge(xs,nil) = xs 
= | merge(nil,ys) = ys 
= | merge(x::xs, y::ys) = 
= if (x < y) then x::merge(xs, y::ys) else y::merge(x::xs,ys); 

- fun listOf(xs) = xs 
= | listOf(x::xs) = [x]::listOf(xs); 

I'm trying to use pattern match and I'm a little confused on it. I'm pretty sure x is the head and then xs is the tail, but I could be wrong. So what I'm trying to do is use the head of the list, make it a list, and then add it to the rest of the list. But when trying to do this function, I get the error:

stdIn:15.19-15.34 Error: operator and operand don't agree [circularity] 
    operator domain: 'Z list * 'Z list list 
    operand:   'Z list * 'Z list 
    in expression: 
    (x :: nil) :: listOf xs 

This error is foreign to me because I don't have really any experience with sml/nj. How can I fix my listOf function?

답변

0

SML/NJ에서리스트의 목록을 만드는 방법 당신은 사실을 발견했습니다. 문제는 패턴 일치에서 xs (변수 만) 같은 패턴이 과 일치 할 수 있음을 나타냅니다.. s으로 끝내더라도 패턴이 목록의 꼬리와 일치한다는 것을 의미하지는 않습니다. 이런 방식으로 s을 사용하는 것은 SML의 프로그래머 대회 일뿐입니다.

따라서, 귀하의 정의 :

fun listOf(xs) = xs 
| listOf(x::xs) = [x]::listOf(xs); 

첫 번째 줄은 명확하게 의도하지 않은 변경되지 않은 모든 값을 반환 SML을 알려줍니다. SML은 이 값을 변경하려고 시도하는 인 두 번째 줄과 일치하지 않음을 감지합니다.

모든 것이 일치하지 않도록 첫 줄을 변경해야합니다. 그 merge 함수를 템플릿으로 보면, 기본 케이스와 일치하는 것이 필요합니다. 자연 기본 케이스는 nil ([]이라고도 쓰여질 수 있음)입니다. nil의 역할은 merge의 정의에 유의하십시오. 당신이 당신의 함수 정의의 첫 번째 줄에있는 패턴 nil 대신 xs를 사용하는 경우, 두 번째 라인은 당신이 원하는 정확히 무엇을 의도 한대로 기능이 작동합니다

fun listOf(nil) = nil 
| listOf(x::xs) = [x]::listOf(xs); 
+0

아, 그건 완벽한 의미가 있습니다. 도와 주셔서 감사합니다! – XXIV

+0

스택 오버플로는 질문에서 다른 질문을하는 것이 까다로울 수 있지만 간단한 질문이므로 문제가되지 않기를 바랍니다. 나는 [[1], [2], [3], [4]]와 같은 목록을 [[1,2], [3,4]]로 만들 필요가있다. 'x'가 첫 번째 값이고'xs'가리스트의 마지막 값이기 때문에 어떻게리스트의 다음 인덱스에 접근 할 수 있습니까? – XXIV

+0

인덱스를 전혀 사용하지 않는 대신 패턴 매칭을 사용하십시오. 힌트 :'[x] :: [y] :: zs는 최소한 두 개의 엘리먼트를 가진리스트의 패턴이다. 각각의 엘리먼트는 싱글 톤리스트이다. –