Life Goes On

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

S コンビネータいろいろ

上のエントリでのプチ収穫。
モナドコンビネータ論理のコラボ!とか喜んでたら、既に先達が。
[Haskell-cafe] Point-free style
【オブジェクト倶楽部: 2008-33号】

import Control.Monad.Reader
s = flip (>>=) . flip
k = return


そういえばArrowでも書けるな。
毎日Haskell - FSWikiLite(2007-08-08)

import Control.Arrow
s = ((app .).).(&&&)


もちろんこれもある。でも Control.Applicative って、他の場面で使ったことない。
何のためのモジュール?

import Control.Applicative
s = (<*>)


でもやっぱり、いちいち import するのは嫌だ。Prelude の関数で書きたい。
とするとやっぱりこれか。
[Haskell-cafe] Point-free style

s = (((. head . uncurry zip . splitAt 1 . repeat) . uncurry) .) . (.) . flip

以前ほど変態だとは感じないけど、z から (z, z) を作る部分(head以降)は書けたとしても、uncurry (flip x . y) なんてとても思いつかない。頭いいな〜。

s x y z = uncurry (flip x . y) $ head $ uncurry zip $ splitAt 1 $ repeat z

B も C も K も I もあるんだから、 S コンビネータも Prelude に用意してほしいと思ったのですが、既にそういう議論はあったみたいです。
[Haskell-cafe] Point-free style