一度直接スタイルを使うとfoldrを使い、list comprehensionsを使ってconcatMapの関数を書く。concatMapの関数をHaskellに書く
次の関数は、私がfoldrで書いたが、それはいくつかの問題があります。**
concatMap' :: (a -> [b]) -> [a] ->[b]
concatMap' f []=[]
concatMap' f (x:xs)==foldr (\x acc->acc : f x) [] xs
一度直接スタイルを使うとfoldrを使い、list comprehensionsを使ってconcatMapの関数を書く。concatMapの関数をHaskellに書く
次の関数は、私がfoldrで書いたが、それはいくつかの問題があります。**
concatMap' :: (a -> [b]) -> [a] ->[b]
concatMap' f []=[]
concatMap' f (x:xs)==foldr (\x acc->acc : f x) [] xs
あなたがfoldr
を使用することになっているので、あなたはconcatMap'
の明示的な再帰的定義を書くことはありません。したがって、1つの定義だけが必要です。 foldr
を使用するには、アキュムレータに含まれるものについて考えてください。反復の間にどのような状態を保つ必要がありますか?その状態は各リスト要素に対してどのように更新されますか?最終的な価値が返されるべきものは何ですか?あなたは詳細な再帰を理解できるように、最初にfoldr
(そのソースコードはHaskell 98にあります)の定義にマッチさせるように、直接的なスタイルでコードを書くことができますまたはそれを検索することができます)。結果はconcatMap f [a, b, c, d, ..]
の期待される結果のように見えるようになりop
、z
、そして[ a', b', c', d', .. ]
のどのような値
foldr op z [ a', b', c', d', .. ]
== a' `op` b' `op` c' `op` d' `op` .. `op` z
?