ML中的映射列表

时间:2013-06-13 19:19:36

标签: list ml

我有一个关于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)))))

我想知道这里的问题是什么以及如何修复它以便编译,我无法找到错误

1 个答案:

答案 0 :(得分:2)

在“其他”部分,您执行something :: generic_map (...),这意味着generic_map必须返回list而不是generic_list

此外,我根本没有看到您处理seq案件的位置。

总的来说,我强烈建议您使用模式匹配代替ifList.hd和朋友。特别是像lst = nil这样的比较总是错误的,因为它将列表限制为具有相等类型的元素 - 使用模式匹配,或者至少是List.null谓词。