Life Goes On

まあまあだけど楽しんでる方です

S コンビネータ = ap

よく考えたら、lambdabot パッケージを全部入れなくても、pointfree パッケージだけ入れればいいので、andLinux まで入れる必要はなかったのでした。
それはさておき、何をしたかったのかというと、S コンビネータがどういう風に表現されるのか知りたかったのです。
やっぱり (<*>) かな、だとしたらつまらないな、と思いながら実行。

C:\Haskell>pointfree "\ a -> a"
id
C:\Haskell>pointfree "\ a b -> a"
const
C:\Haskell>pointfree "\ a b c -> a c (b c)"
ap

え?ap?なにそれ。

Prelude Control.Monad> :t ap
ap :: (Monad m) => m (a -> b) -> m a -> m b

Prelude Control.Monad> let s a b c = a c (b c)
Prelude Control.Monad> :t s
s :: (t -> t1 -> t2) -> (t -> t1) -> t -> t2

そもそも (t -> t1 -> t2) -> (t -> t1) -> t -> t2 と m (a -> b) -> m a -> m b じゃ引数の数が合わないし。
あ、そうか。m を (t ->)、a を t1、b を t2 と読み換えれば、とりあえず型は一致するぞ。
ちょっとした例を考えてみよう。

Prelude Control.Monad> :t s (,) id
s (,) id :: t -> (t, t)
Prelude Control.Monad> s (,) id 1
(1,1)

Prelude Control.Monad> :t ap (,) id
ap (,) id :: (Monad ((->) a)) => a -> (a, a)
Prelude Control.Monad> ap (,) id 1
<interactive>:1:0:
    No instance for (Monad ((->) a))
      arising from a use of `ap' at <interactive>:1:0-10
    Possible fix: add an instance declaration for (Monad ((->) a))
    In the expression: ap (,) id 1
    In the definition of `it': it = ap (,) id 1

Monad ((->) a) ってどんな型?引数追加モナド
これをエラーにならないように実行することはできるんだろうか。う〜ん。