2013-02-10 253 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

相關問題