テストステ論

高テス協会会長が, テストステロンに関する情報をお届けします.

リストのsequenceAを追ってみる

カーネルも一区切りという感じなのでHaskellに戻るかーということで, H本をさらーっと読み返している. リハビリしてから本腰入れてHaskellプログラマ目指す. 11章からが本番. 「リストのリストがリストのリストになる」と言われましても・・・と思ったので具体的に追ってみた.

まず定義,

sequenceA

sequenceA :: (Applicative f) => [f a] -> f [a]
sequenceA [ ] = pure [ ]
sequenceA (x:xs) = (:) <$> x <*> sequenceA xs

リスト

instance Applicative  where
  pure x = [x]
  fs <*> xs = [f x | f <- fs, x <- xs]
sequenceA [[1,2],[3,4]]
= (:) <$> [1,2] <*> sequenceA [[3,4]]
<*>より右
= (:) <$> [3,4] <*> sequenceA [ ]
= (:) <$> [3,4] <*> pure [ ]
= (:) <$> [3,4] <*> [[ ]]
= [[3],[4]]
元の式
= (:) <$> [1,2] <*> [[3],[4]]
= [[1,3],[1,4],[2,3],[2,4]]

何のことはなく, ただ追ってみただけだが, こういうのが大事なのだと思ったし二度と同じことはしたくないのでメモった.

ところで, 空リストがちゃんと表示されないのだが, 仕様なの?辛すぎ.

(追記)
[ ] という感じで中にスペース入れると表示されるね.
いれないと表示されない -> .