私はリストを逆にする方法を知っていますが、foldlを使ってより効率的にしようとしています。私のコードは次の通りです:foldlを使用してHaskellのリストを逆転させない
GHCiで実行すると、入力と同じリストが返されます。何がうまくいかない?私もfoldrでそれを終了しようとするが、それは変更を表示しません。
私はリストを逆にする方法を知っていますが、foldlを使ってより効率的にしようとしています。私のコードは次の通りです:foldlを使用してHaskellのリストを逆転させない
GHCiで実行すると、入力と同じリストが返されます。何がうまくいかない?私もfoldrでそれを終了しようとするが、それは変更を表示しません。
foldl
は、ファンクションの最初の引数としてアキュムレータを渡します。 ++
は最初の引数を2番目の引数に連結しますが、リストを逆にするには2番目のものを最初のものに連結する必要があります。代わりに最初の、あなたは短所(:)
機能を使用することができます(同様に高価である)シングルトンリストにリストのすべての要素を変換するの
Prelude> let reverse list = foldl (flip (++)) [] (map (\x -> [x]) list)
Prelude> reverse [1..5]
[5,4,3,2,1]
"concatenates ... to"は無指向性です。混乱する。 "before"ははるかに良いでしょう。 –
:あなたはこのflip (++)
を使用して操作を行うことができ
reverse :: Foldable t => t a -> [a]
reverse = foldl (flip (:)) []
ので、ここでは折り畳み機能としてflip (:) :: [a] -> a -> [a]
を使用します。テールは[a]
と頭部はa
で、最初の要素として頭部を、最後の要素としてテールを持つリストを構成します。
だから何が起こるかです:
foldl (flip (:)) [] [1,4,2,5]
-> foldl (flip (:)) (1:[]) [4,2,5]
-> foldl (flip (:)) (4:1:[]) [2,5]
-> foldl (flip (:)) (2:4:1:[]) [5]
-> foldl (flip (:)) (5:2:4:1:[]) []
-> (5:2:4:1:[])
-> [5,2,4,1]
は[Haskellではリストをリバース](HTTPSのhttps://stackoverflow.com/questions/26847192/reverse-a-list-in-haskell – icc97
可能な複製を参照してください。 ://stackoverflow.com/questions/26847192/reverse-a-list-in-haskell) – icc97
@ icc97正しい 'foldl'解決法がその質問に与えられていますが、質問自体は実際にはそうではありません。それは重複していると言います。 – leftaroundabout