2017-01-15 7 views
1

나는 다음과 같은 구현 SML에서 내가 얻을SML : 목록

fun reverse x y = 
     case x of 
     [] => y 
     | x::xs => reverse(xs, x::y) 
; 

오류 메시지 목록을 반대하려고에 항목을 추가하는 동안 이상한 오류를주는 형식 유추는 꿰 뚫을 :

trial.sml:1.6-4.35 Error: case object and rules don't agree [tycon mismatch] 
    rule domain: 'Z list * 'Z list 
    object: ('Z list * 'Z list) * 'Y 
    in expression: 
    (case (arg,arg) 
     of (x,y) => 
      (case x 
      of nil => y 
       | :: <pat> => reverse <exp>)) 
trial.sml:1.6-4.35 Error: right-hand-side of clause doesn't agree with function result type [tycon mismatch] 
    expression: 'Z -> _ 
    result type: 'Y list 
    in declaration: 
    reverse = (fn arg => (fn <pat> => <exp>)) 

그러나 내가 역방향으로 재미있는 기호 (x : '목록, y :'목록)를 바꾼다면 이것이 작동하는 이유는 무엇입니까? 이 형식을 쓸 수있는 방법이있어서 '형식 목록'을 작성해야 할 필요가 없습니까?

답변

1

(x,y)과 다릅니다. 정의의 첫 번째 줄에서

fun reverse x y = 

당신은 유형

fn: a' list -> a' list -> 'a list 

카레 함수를 작성하려고하지만, 재귀 호출 것 같다

reverse(xs, x::y) 

당신은 마치 reverse처럼 취급하고 있습니다. 했다 및 유형

FN의 uncurried 기능 :에 '목록 *는'목록 -> '목록

문제는 당신이 유형의 주석을 추가할지 여부와는 전혀 무관

대신 그것을 괄호를 넣는 곳 (쉼표가있는 경우)과 관련이 있습니다. 유형을 원하는대로 두 가지 유효한 수정 사항이 있습니다. 이것이 숙제 인 것 같습니다 (내장 된 rev을 피할 수있는 명확한 숙제가 아님), 세부 정보를 남겨 두겠습니다.

+0

오 !! noo 메신저 카레 함수를 쓰려고하지 않았습니다. 왜 혼란스러워하는지 봅니다. 나는 brackes와 쉼표가 차이를 만든다는 것을 몰랐다. 당신의 도움을 주셔서 감사합니다. – Har