1

在 sml nj 中,如果您使用 map 函数,您基本上是对列表中的每个元素说,x在其上应用该函数f,并返回新值的列表,但可以说f返回一个字符串,并f完成比较,如果比较为真,则返回字符串,但如果为假,则不返回任何内容,并且不会将任何内容放入该地图当前正在构建的列表中。

这可能吗?

4

1 回答 1

2

不要使用,而是使用(或)map的变体之一。当然,另一种选择是在执行.foldfoldlfoldrfiltermap

举个简单的例子,假设您想要返回一个平方整数列表,但前提是原始整数是偶数。filter-then-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

稍微长一点,但可以说更清晰,并且可能更有效。

于 2013-02-11T00:31:33.667 回答