0

我有一个关于 ML 中的映射列表的问题,这个问题似乎在重复,我定义了当前的数据类型:

datatype 'a seq = Nil | Cons of 'a * (unit -> 'a seq);
datatype 'a generic_list = List of 'a list
                          |Seq of 'a seq;

我现在正在尝试编写以下应该接收“'a generic_list”并返回“int generic_list”的函数:

val rec generic_map = fn (f,List(lst)) => if lst=nil then List([])                                             
      else List(f(List.hd(lst))::generic_map(f,List( List.drop(lst,1))));

该代码无法编译并出现以下错误: 子句的右侧不同意函数结果类型 [tycon mismatch] 表达式:

'Z generic_list
 result type:  'Z list
 in declaration:
   generic_map =
     (fn (f,List lst) =>
           if lst = nil
           then List nil
           else List
                  (f (List.hd lst) ::
                     generic_map (f,List (List.drop (lst,1)))))

我想知道这里有什么问题以及如何解决它以便编译,我找不到错误

4

1 回答 1

2

在 'else' 部分,你做something :: generic_map (...),这意味着generic_map必须返回 alist而不是 a generic_list

另外,我根本看不到你在哪里处理这个seq案子。

作为一般说明,我强烈建议使用模式匹配而不是if,List.hd和朋友。特别是比较喜欢lst = nil总是错误的,因为它将列表限制为具有相等类型的元素——使用模式匹配,或者至少使用List.null谓词。

于 2013-06-14T15:12:21.907 回答