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