SML - несвязанная переменная или конструктор - PullRequest
6 голосов
/ 04 ноября 2011

У меня есть следующий код:

datatype expr = K of string| Number2 of expr * (expr list);
datatype number = Number1 of string | Number3 of int;
 fun append (nil, l2) = l2 
  | append (x::xs, l2) = x::append(xs, l2);
 fun map [] = []
    | map (h::t) = (What h)::(map t);
fun What (K x) = [Number1(x)]
    |What (Number2 (t,[])) = Number3(0)::What(t)
    |What (Number2 (y,a::b)) =  append(What(a), map(b));

Не распознает функцию «Что» (несвязанная переменная или конструктор). Как можно это исправить, чтобы он знал функцию «Что»?

Спасибо.

Ответы [ 2 ]

8 голосов
/ 04 ноября 2011

Объявления в SML работают сверху вниз, поэтому map не видит What. Переключение порядка не поможет, так как What не увидит map, выдав такую ​​же ошибку. Вместо этого вам нужно объявить взаимно рекурсивные функции одновременно, используя and:

fun map [] = []
  | map (h::t) = (What h)::(map t)
and What (K x) = [Number1(x)]
  | What (Number2 (t,[])) = Number3(0)::What(t)
  | What (Number2 (y,a::b)) =  append(What(a), map(b))
3 голосов
/ 04 ноября 2011

Вы должны использовать and для взаимной рекурсии. У вас есть другие проблемы, хотя в вашем коде. What явно означает expr -> number list, что означает, что map должно быть expr list -> (number list) list, поэтому в вашей последней строке вы пытаетесь добавить number list list к number list. Хотя не совсем понятно, для чего предназначен код, поэтому вам, возможно, придется выработать намеченную логику самостоятельно. Похоже, не существует очевидного способа написания функции с требуемым типом.

...