結論からいうと次のようになります。
haskell
1(+) <$> (* 2) <*> (+ 10) ≡ \x -> (x * 2) + (x + 10)
ここからはなぜそうなるのかを見ていきます。
まず (<$>)
と (<*>)
の定義を見ましょう。
haskell
1-- https://hackage.haskell.org/package/base-4.14.0.0/docs/src/GHC.Base.html#line-973
2instance Applicative ((->) r) where
3 …
4 (<*>) f g x = f x (g x)
5 …
6infixl 4 <*>
7
8-- https://hackage.haskell.org/package/base-4.14.0.0/docs/src/Data.Functor.html#%3C%24%3E
9(<$>) :: Functor f => (a -> b) -> f a -> f b
10(<$>) = fmap
11infixl 4 $>
12
13-- https://hackage.haskell.org/package/base-4.14.0.0/docs/src/GHC.Base.html#line-973
14instance Functor ((->) r) where
15 fmap = (.)
この定義に沿って式変形をしていきます。
haskell
1 (+) <$> (* 2) <*> (+ 10)
2≡〈優先順位の括弧を明記〉-- (1)
3 ((+) <$> (* 2)) <*> (+ 10)
4≡〈(<*>) の定義を代入〉 -- (2)
5 \x -> ((+) <$> (* 2)) x ((+ 10) x)
6≡〈中置記法に変換〉 -- (3)
7 \x -> ((+) <$> (* 2)) x (x + 10)
8≡〈(<$>) の定義を代入〉
9 \x -> ((+) . (* 2)) x (x + 10)
10≡〈(.) の定義を代入〉
11 \x -> (\y -> (+) ((* 2) y)) x (x + 10)
12≡〈中置記法に変換〉
13 \x -> (\y -> (+) (y * 2)) x (x + 10)
14≡〈関数適用〉
15 \x -> ((+) (x * 2)) (x + 10)
16≡〈中置記法に変換〉
17 \x -> (x * 2) + (x + 10)
(<$>)
と (<*>)
はともに同じ優先順位の左結合です。
(<*>) f g x = f x (g x)
は (<*>) = \f -> \g -> \x -> f x (g x)
と同じです。
(+ 10) x
が x + 10
になります。
定義に沿ってひとつずつ変形してくと理解が深まると思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/26 04:30