2013-02-10 254 views
1

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

这可能吗?

+0

你不能在SML中有一个函数不返回_anything_ - 但你可能有一个返回()或空列表或NONE。 – Tayacan 2013-02-11 09:15:12

回答

2

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

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

+0

这是一个咖喱饭功能吗? (使用foldr) – omega 2013-02-11 00:48:56

+0

@omega:是的。你可以在这里找到它的文档(http://standardml.org/Basis/list.html#SIG:LIST.foldr:VAL)。 – voithos 2013-02-11 01:47:56

相关问题