在 sml nj 中,如果您使用 map 函数,您基本上是对列表中的每个元素说,x
在其上应用该函数f
,并返回新值的列表,但可以说f
返回一个字符串,并f
完成比较,如果比较为真,则返回字符串,但如果为假,则不返回任何内容,并且不会将任何内容放入该地图当前正在构建的列表中。
这可能吗?
在 sml nj 中,如果您使用 map 函数,您基本上是对列表中的每个元素说,x
在其上应用该函数f
,并返回新值的列表,但可以说f
返回一个字符串,并f
完成比较,如果比较为真,则返回字符串,但如果为假,则不返回任何内容,并且不会将任何内容放入该地图当前正在构建的列表中。
这可能吗?
不要使用,而是使用(或)map
的变体之一。当然,另一种选择是在执行.fold
foldl
foldr
filter
map
举个简单的例子,假设您想要返回一个平方整数列表,但前提是原始整数是偶数。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
稍微长一点,但可以说更清晰,并且可能更有效。