1

sml nj では、マップ関数を使用する場合、基本的xにはリスト内の各要素に対して関数を適用しf、新しい値のリストをf返しますが、文字列を返し、f比較が行われるとしましょう。比較が真の場合は文字列を返しますが、偽の場合は何も返さず、マップが現在構築しているリストには何も入れられません。

これは可能ですか?

4

1 に答える 1

2

を使用する代わりに、 (または のいずれか)mapのバリアントの 1 つを使用します。もちろん、別のオプションは、 を実行する前に単に a を実行することです。foldfoldlfoldrfiltermap

簡単な例として、元の整数が偶数である場合にのみ、二乗整数のリストを返したいとします。フィルターしてからマップするアプローチは次のようになります。

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

少し長くなりますが、間違いなくより明確で、おそらくより効率的です。

于 2013-02-11T00:31:33.667 に答える