ここで私のコメントを拡大 - map
関数が自然に発生する理由は次のとおりです。 Haskellで
、リストの内包表記を行うためだけ糖衣構文です:
[ 2 * x | x <- [1..10] ]
は、順番に
do { x <- [1..10]; return (2 * x) }
に相当し、表記を行うことは単項バインドのためのシンタックスシュガーである - 上記は等価です〜
[1..10] >>= \x -> return (2 * x)
List
はモナド。モナドにList
を行うコードは、私たちがbind
への呼び出しを置き換える場合は、同等である、
concat (map (\x -> return (2 * x)) [1..10])
に
instance Monad [] where
return x = [x]
xs >>= f = concat (map f xs)
はそう上記>>=
の呼び出しは等価です(一部無関係なものを無視して)されます
concat (map (\x -> [2 * x]) [1..10])
にだから我々はリスト[1..10]
上で機能\x -> [2 * x]
をマッピングしてから呼び出します結果はconcat
になります。しかし、我々の関数は唯一、すべての1つの要素のリストを構築するために、我々は
map (\x -> 2 * x) [1..10]
でコードをCONCATと置き換えるために呼び出しをスキップすることができますので、それは、比較的単純なリストの内包表記はオーバー機能をマッピング伴う表現に変えることができることを自然なことです範囲。
範囲が悪いのか? – hammar
何もしていませんが、他のやり方があるかどうかを確認するだけです。 – drozzy