Шаблон SML, соответствующий различным конструкторам - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть код ниже, и я не понимаю, почему он не компилируется. Я понял, что сопоставление с образцом можно использовать для сопоставления с различными типами конструкторов, и до тех пор, пока выражения с правой стороны возвращают один и тот же тип, все должно быть в порядке. Но это не происходит ниже. Может ли кто-нибудь объяснить это?

fun myfunc (s: string, lst: string list) = 
    let fun f (s, []) = NONE
      | f (s, x::xs') = SOME ["list"]
      | f (s, SOME(x::xs')) = SOME ["some"]
    in
       f(s, lst)
    end

При попытке запустить этот код, компилятор выдает ошибку, сообщающую

hw2provided.sml:25.13-27.46 Error: parameter or result constraints of clauses don't agree [tycon mismatch]
  this clause:      'Z * 'Y list option -> 'X
  previous clauses:      'Z * 'W list -> 'X
  in declaration:
    filter =
      (fn (s,nil) => NONE
        | (s,:: <pat>) => SOME (<exp> :: <exp>)
        | (s,SOME <pat>) => SOME (<exp> :: <exp>))

1 Ответ

0 голосов
/ 17 апреля 2020

Параметры также должны относиться к одному и тому же типу, но вы можете сопоставлять их с разными конструкторами того же типа.
Например, вы можете сопоставлять [] и ::, которые оба являются конструкторами списка, но Вы не можете добавить SOME к этому миксу, так как это не так.

...