在sml nj中,如果你使用map函数,你基本上对列表中的每个元素x
说,在它上面应用函数f
,并返回新值的列表,但是让我们说f
返回一个字符串,并在f
中进行比较,如果比较为真,那么它返回字符串,但如果它是假的,那么它不会返回任何内容,也没有被放入地图当前正在建立的列表中。
这可能吗?
答案 0 :(得分:2)
不使用map
,而是使用fold
的变体之一(foldl
或foldr
)。当然,另一个选择是在执行filter
之前简单地执行map
。
作为一个简单的例子,假设您想要返回一个平方的整数列表,但前提是原始整数是偶数。过滤后映射方法可能如下所示:
fun square_evens xs =
(List.map (fn x => x * x)) (List.filter (fn x => x mod 2 = 0) xs)
或者,您可以使用foldr
方法。
fun square_evens xs =
List.foldr (fn (x, xs') =>
if x mod 2 = 0
then (x * x) :: xs'
else xs') [] xs
稍长,但可以说更清晰,也可能更有效率。