在Ocaml处理单位

时间:2015-04-21 23:22:25

标签: ocaml

所以我有一个函数r,它应该将函数应用于列表中的每个元素,只要它符合给定的谓词,并返回该列表。即。

let p x = x > 2;;
let f x = x+1;;

r p f [1;2] => []

我正在使用map函数将函数应用于列表中的每个元素,然后返回该列表。因此,r的实施如下

let r f p l = map f (map (fun x -> if (p x) then x) l );;

但如果我尝试像上面的例子中那样调用r,我会得到一个类型错误,因为f和p是整数的表达式,它预期单位的表达式。我哪里出错了?

1 个答案:

答案 0 :(得分:1)

map函数将函数应用于列表的每个元素并返回结果列表。它总是返回与输入列表相等长度的列表。所以你的问题陈述并没有完全合理。

在较低级别,表达式if (p x) then x仅在x具有类型单位时才合法。即,if b then e的含义与if b then e else ()相同,if的两边必须是同一类型。

如果您想要返回与输入列表不同长度的列表,则需要使用折叠函数而不是map