2017-10-30 6 views

答えて

3

あなたが取る必要がある唯一の余分なステップは、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]] 

あなたの初期データのリスト。

+0

私はリストの理解力が良く、理解しやすいです。ありがとうございます –

+0

@DavidAndvett:フランス語のように: "* desgoûtset des couleurs、ne discute pas *"ので、あなたにはもちろんです:) –

5

あなたが記述しているのは、共通のHaskellパターンです!

  1. 各要素
  2. のためのリストを生成する関数を使用して、リスト
  3. を取るには、1つのリストに参加します。それはリストである必要はありません

  1. は、各要素
  2. のための新たなコンテナを生成する関数を使用した容器
  3. を取り、容器に参加。リストのケースについては

、この関数の型が

[a] -> (a -> [a]) -> [a] 

はのはmは、コンテナ型であるam 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と同じです。

+0

好奇心の邪魔をしています。 –

+2

'' = 'は、[Learn You a Haskell](http://www.learnyouahaskell.com/a-fistful-of-monads)によると、通常_bind_と発音されます。私はそれを_stuff into_-operatorと考える傾向があります。 – Teodor

関連する問題