我是函数式语言编程的新手。我正在尝试为列表实现F#iter。我认为它应该类似于列表中的收集,但不知道如何解决它。这是我尝试用于F#中的列表的函数:
let rec iter func list =
match list with
| [] -> []
| hd::tl -> func hd iter func tl;;
汇编错误是:Type mismatch. Expecting a 'a but given a ('b -> 'a -> 'c -> 'd -> 'e list) -> 'b list -> 'e list The resulting type would be infinite when unifying ''a' and '('b -> 'a -> 'c -> 'd -> 'e list) -> 'b list -> 'e list'
我不懂F#来理解这个错误。如果有人能提出一些建议来指导我走向正确的方向,我会非常感激。 谢谢 `
答案 0 :(得分:1)
iter
的类型是('T -> unit) -> 'T list -> unit
,即它仅用于函数的副作用。
主要问题是您向func
let rec iter func list =
match list with
| [] -> []
| hd::tl -> func hd iter func tl;;
^ ^ ^ ^
1 2 3 4
其中四个,但func
只需一个; func
的类型应为'T -> unit
。
在func hd
之后插入分号(用于排序),并确保空列表的结果类型为unit
,应该可以解决问题。
let rec iter func list =
match list with
| [] -> ()
| hd::tl -> func hd;
iter func tl;;