如何让map函数不返回?

时间:2013-02-10 23:22:03

标签: iteration sml smlnj currying higher-order-functions

在sml nj中,如果你使用map函数,你基本上对列表中的每个元素x说,在它上面应用函数f,并返回新值的列表,但是让我们说f返回一个字符串,并在f中进行比较,如果比较为真,那么它返回字符串,但如果它是假的,那么它不会返回任何内容,也没有被放入地图当前正在建立的列表中。

这可能吗?

1 个答案:

答案 0 :(得分:2)

不使用map,而是使用fold的变体之一(foldlfoldr)。当然,另一个选择是在执行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

稍长,但可以说更清晰,也可能更有效率。