タプル(a,a)
のリストをa
のリストに変換したいと思います。これは私が持っているもので、これまでタプルのリストをhaskellの正規リストに変換するには?
map (\(x,y) -> [x,y]) [(1,4),(2,5)]
> [[1,4],[2,5]]
しかし、私がしたいことはある
> [1,4,2,5]
タプル(a,a)
のリストをa
のリストに変換したいと思います。これは私が持っているもので、これまでタプルのリストをhaskellの正規リストに変換するには?
map (\(x,y) -> [x,y]) [(1,4),(2,5)]
> [[1,4],[2,5]]
しかし、私がしたいことはある
> [1,4,2,5]
あなたが取る必要がある唯一の余分なステップは、concat
にあるenateとリスト、:
concat (map (\(x,y) -> [x,y]) [(1,4),(2,5)])
ここでconcat :: [[a]] -> [a]
は、リストのリストをまとめて1つのリストにします。
このような構造が頻繁に発生するので、それがより便利になり機能があります:concatMap :: (a -> [b]) -> [a] -> [b]
:
concatMap (\(x,y) -> [x,y]) [(1,4),(2,5)]
ます。またlist comprehensionを使用し、それが好きで書くことができます:
data
がある
[z | (x,y) <- data, z <- [x,y]]
あなたの初期データのリスト。
あなたが記述しているのは、共通のHaskellパターンです!
、
、この関数の型が
[a] -> (a -> [a]) -> [a]
はのはm
は、コンテナ型であるa
のm a
のコンテナを呼ぼうことになります。この場合、私たちは持っています
m a -> (a -> m a) -> m a
この機能は>>=
です!これを中置演算子として使用します。
Prelude> [(1,4),(2,5)] >>= \(x,y) -> [x,y]
[1,4,2,5]
...ここで、コンテナは、2つのレイヤーを1つのレイヤーに「折りたたむ」ことをサポートする必要があります。これはモナドです。
a >>= f
は、Willem Van Onsemの示唆通り、concatMap f a
と同じです。
好奇心の邪魔をしています。 –
'' = 'は、[Learn You a Haskell](http://www.learnyouahaskell.com/a-fistful-of-monads)によると、通常_bind_と発音されます。私はそれを_stuff into_-operatorと考える傾向があります。 – Teodor
私はリストの理解力が良く、理解しやすいです。ありがとうございます –
@DavidAndvett:フランス語のように: "* desgoûtset des couleurs、ne discute pas *"ので、あなたにはもちろんです:) –