在F#中为列表实现iter

时间:2014-11-10 04:23:01

标签: list f# functional-programming

我是函数式语言编程的新手。我正在尝试为列表实现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#来理解这个错误。如果有人能提出一些建议来指导我走向正确的方向,我会非常感激。 谢谢  `

1 个答案:

答案 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;;