sml nj では、マップ関数を使用する場合、基本的x
にはリスト内の各要素に対して関数を適用しf
、新しい値のリストをf
返しますが、文字列を返し、f
比較が行われるとしましょう。比較が真の場合は文字列を返しますが、偽の場合は何も返さず、マップが現在構築しているリストには何も入れられません。
これは可能ですか?
sml nj では、マップ関数を使用する場合、基本的x
にはリスト内の各要素に対して関数を適用しf
、新しい値のリストをf
返しますが、文字列を返し、f
比較が行われるとしましょう。比較が真の場合は文字列を返しますが、偽の場合は何も返さず、マップが現在構築しているリストには何も入れられません。
これは可能ですか?
を使用する代わりに、 (または のいずれか)map
のバリアントの 1 つを使用します。もちろん、別のオプションは、 を実行する前に単に a を実行することです。fold
foldl
foldr
filter
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
少し長くなりますが、間違いなくより明確で、おそらくより効率的です。