为什么我的F#map实现没有编译

时间:2014-05-14 14:23:48

标签: map f# tail-recursion

我开始学习F#,我想使用尾递归来编写自己的map函数。这就是我所拥有的

let my_map ff list =
    let rec mapAcc ff_inner list_inner acc =
        match list_inner with
        | [] -> acc
        | front::rest -> mapAcc( ff_inner rest (ff_inner(front) :: acc) ) //error
    mapAcc ff list []

它将被称为:

let list = my_map (fun x -> x * 2) [1;2;3;4;5] // expect [2;4;6;8;10]

我在第二个条件Type mismatch. Expecting a 'a but given a 'b list -> 'a -> 'a The resulting type would be infinite when unifying ''a' and ''b list -> 'a -> 'a'

上收到编译错误消息

我不知道此错误消息的含义。如果我在mapAcc的递归调用中传递rest,我不确定这是多么无限。

注意:我意识到我正在向后重建列表。我现在忽略了这一点。

1 个答案:

答案 0 :(得分:2)

当函数调用自身时,只需删除括号:

let my_map ff list =
    let rec mapAcc ff_inner list_inner acc =
        match list_inner with
        | [] -> acc
        | front::rest -> mapAcc ff_inner rest (ff_inner(front) :: acc)
    mapAcc ff list []

否则其中包含的所有内容都被解释为单个参数,ff_inner作为函数调用,其余作为参数。