Sコンビネータ
sharing combinator
$ S\equiv\lambda xyz.(xz)(yz)
zをシェアしている
通常のapの型は、
ap :: Monad m => m (a -> b) -> m a -> m b
関数モナドのapの型は、
mが(->) rなので
ap :: (r -> a -> b) -> (r -> a) -> (r -> b)
これは、以下のようにSコンビネータを定義したものと同じ
code:hs
s :: (r -> a -> b) -> (r -> a) -> r -> b
s x y z = x z (y z)