我有一个关于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)))))
我想知道这里的问题是什么以及如何修复它以便编译,我无法找到错误
答案 0 :(得分:2)
在“其他”部分,您执行something :: generic_map (...)
,这意味着generic_map
必须返回list
而不是generic_list
。
此外,我根本没有看到您处理seq
案件的位置。
总的来说,我强烈建议您使用模式匹配代替if
,List.hd
和朋友。特别是像lst = nil
这样的比较总是错误的,因为它将列表限制为具有相等类型的元素 - 使用模式匹配,或者至少是List.null
谓词。