カイの答えはどのようにconcatMap
作品をカバーし、私はあなたの疑問の一つに、特に焦点を当てる:
しかし、どのように我々は別のものと同等の機能を設定することができますか?
ハスケルの関数は、ほかの値と同じように値です。
GHCi> foo = "foo"
これは文字列であることを起こるfoo
の定義、次のとおりです。これはの定義です...同じように
GHCi> :t foo
foo :: [Char]
GHCi> putStrLn foo
foo
...
GHCi> add = (+)
add
、これは関数であることがあります。
GHCi> :t add
add :: Num a => a -> a -> a
GHCi> add 2 3
5
上記の定義では、値を定義していることを強調するために、add
のいずれのパラメータも明示的に記述しませんでした。
GHCi> add x y = (+) x y
(我々は通常、上記の定義の右辺を書くだろうかあるx + y
は、(+) x y
用の代替構文単に便利であることに注意してください。)
:しかし、これを行うには完全に罰金それをあります
定義を書くの別の方法は、最初のパラメータだけを言及する部分適用を利用しています:
GHCi> add x = (+) x
我々がすることもでき、ちょうどのためにそれのため(そしておそらく何が起こっているかを明確にする)、WHERE句で別の定義に(+) x
を移動...
GHCi> :{
GHCi| add x = plusX
GHCi| where
GHCi| plusX = (+) x
GHCi| :}
...と明示的に再び二番目のパラメータを記述します。
GHCi> :{
GHCi| add x = plusX
GHCi| where
GHCi| plusX y = (+) x y
GHCi| :}
plusX
は、引数をとり、x
に追加する関数です。 add
は、引数がx
であり、x
に対応する関数plusX
を返す関数です。 add 2 3
((add 2) 3
に相当)を実行すると、2番目の引数をadd
にするのはこの2番目の関数です。
は今、あなたのconcatMap
定義と上記の比較:
concatMap f = cmap where
cmap [] = []
cmap (x : xs) = accum (f x) where
accum [] = cmap xs
accum (y : ys) = y : accum ys
定義は、同様の方法でレイアウトされています。 cmap
は、リストを取り、concatMap
への引数であるconcatMap
を使用して、add
のx
引数を使用したのと同じように、結果を返します。だから、
、それを合計する:
我々はCMAPに等しいFの結果を設定している、あるいは我々がfのパラメータとしてCMAPを使用していますか?
どちらもありません。 f
を使用してcmap
を定義し、次にこれを使用してconcatMap
を全体として定義します。
そのコードは、初心者にはあまり馴染みのない、ポイントフリーのishで書かれています。'='の両側に 'ys'を追加します。 'concatMap f ys = cmap ys'です。また、 'concatMap f'の標準的な定義は' concat 'です。マップf '。 – Zeta
私はおそらくもう少し行くとコードが混乱していると言う。私は 'cmap(x:xs)= f x ++ cmap xs'を使うのではなく、奇妙な' accum'関数を書かなければならない理由はありません。 – dfeuer