在sml nj中,如果使用映射函数,基本上在列表中对每个元素x
说,对其应用函数f
,并返回新值的列表,但可以说f
返回一个字符串,并在f
比较完成后,如果比较结果为真,则返回字符串,但如果它是假的,那么它不会返回任何东西,也不会将任何东西放入该地图当前正在构建的列表中。如何让map函数不返回某些内容?
这可能吗?
在sml nj中,如果使用映射函数,基本上在列表中对每个元素x
说,对其应用函数f
,并返回新值的列表,但可以说f
返回一个字符串,并在f
比较完成后,如果比较结果为真,则返回字符串,但如果它是假的,那么它不会返回任何东西,也不会将任何东西放入该地图当前正在构建的列表中。如何让map函数不返回某些内容?
这可能吗?
而不是使用map
,使用fold
(或者foldl
或foldr
)的变体之一。另一种选择当然是在做map
之前简单地做一个filter
。
作为一个简单的例子,假设你想返回一个平方整数列表,但只有当原始整数是偶数时。过滤器,然后映射方法可能看上去像:
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
稍微长一点,但可以说更清楚,可能更有效。
你不能在SML中有一个函数不返回_anything_ - 但你可能有一个返回()或空列表或NONE。 – Tayacan 2013-02-11 09:15:12