2017-01-15 12 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 отличается от (x,y).

В первой строке определения

fun reverse x y = 

Вы, кажется, пытается написать выделанной функцию типа

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

но в рекурсивном вызове

reverse(xs, x::y) 

вы лечите reverse, как будто это были и uncurried функция типа

Fn: а «список * а» список -> «список

Проблема не имеет ничего общего с действительно ли вы добавить аннотацию типа, но вместо этого его связано с тем, где вы помещаете скобки (и запятые, если таковые имеются). В зависимости от того, кем вы хотите, какой тип должен быть, есть два действительных исправления. Поскольку это, кажется, домашнее задание (нет очевидной причины, не связанной с домашней работой, чтобы избежать встроенного rev), я оставлю вам детали.

+0

oh !! noo im не собирался писать футлярную функцию, я вижу, почему она запутывается. Я не знал, что скобки и запятые сделали разницу. Спасибо за вашу помощь. – Har