所以我有一个函数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是整数的表达式,它预期单位的表达式。我哪里出错了?
答案 0 :(得分:1)
map
函数将函数应用于列表的每个元素并返回结果列表。它总是返回与输入列表相等长度的列表。所以你的问题陈述并没有完全合理。
在较低级别,表达式if (p x) then x
仅在x具有类型单位时才合法。即,if b then e
的含义与if b then e else ()
相同,if
的两边必须是同一类型。
如果您想要返回与输入列表不同长度的列表,则需要使用折叠函数而不是map
。