テストステ論

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

Applicativeの関数 調査

最近RWHを読み直しているのだが, 以前より理解が深いように思う. Parsecの章を読んでいると, Applicativeが便利であることに気がついた. Appilcativeを使うと良い略記が出来る.

純粋な関数を文脈に持ち上げて適用する(ap)ということはすなわち,

do
  e1 <- a1
  e2 <- a2
  ...
  en <- an
  return $ f e1 e2 ... en

と書くことを

f <$> a1 <*> a2 ... <*> an

と書けるということだ. 仮にモナドで一行で書くと, a1 >>= ¥e1 -> a2 >>= ¥e2 ... en -> return $ f e1 e2 ... enとなるのだが, Applicativeスタイルの方がはるかに分かりやすい.

さらに, (*>)などのパターンを使うと, 値を捨てることも可能となる.

つまり,

do
   a1
   e2 <- a2
   ...

のような書き方もApplicativeスタイルで書くことが出来る. 具体的には, f <$> (a1 *> a2) <*> ... のようにすればよい(と, 思う). 途中のアクションで前の計算を使うことが出来ないのがモナドより劣っているけど, 現実的には応用範囲が広いはず(だって純粋関数だけで色々楽しいこと出来ますから).

というわけで, Applicative関数をざっくりと調べる.

関数名 precedence
(<$>) (a->b) -> f a -> f b infixl 4
(<$) a -> f b -> f a infixl 4
(<*>) f (a->b) -> f a -> f b infixl 4
(<**>) f a -> f(a -> b) -> f b infixl 4
(*>) f a -> f b -> f b infixl 4
(<*) f a -> f b -> f a infixl 4
(<!>) f a -> f a -> f a infixl 3

最後のは, <|>. (markdownがバカだった)

<$というのは, fmap . constのようです. const :: a -> b -> aですから, a -> f b -> f aとなります. どういう場面で使うんでしょうか?


<$は, 恐らくだが, f <$ a1 <*> a2 ... のように使って, a1を捨てるためにある?

広告を非表示にする