在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