我开始学习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
,我不确定这是多么无限。
注意:我意识到我正在向后重建列表。我现在忽略了这一点。
答案 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
作为函数调用,其余作为参数。