(失敗)ArrowでYコンビネータを…作れませんでした OTL
先日の"ArrowによるHaskellプログラミングの基礎。…パイプ感覚で順次/分岐/繰返し - よくわかりません"で、「あとで書く」にしていた「名前を使わない再帰」の方法を試してみたけど、結果は駄目だった。
ちゃんと理解してる人や素養のある人には自明なのかもしれないけど、アホな自分は元論文の"Programming with Arrows"を読んで、「Arrow*1一般での適用があるなら、それでYコンビネータ書けばArrowレベルで再帰できるじゃんw」と思って
y f = f (y f)
のまねして、関数適用をappに置き換えて
ya::forall a b aa.(ArrowApply aa) => aa (aa (aa a b) (aa a b)) (aa a b) ya = arr (\ma -> (ma, (constA (ya,ma)>>>app))) >>> app where constA c = arr $ const c
こんなのを書いてみたけど駄目。
hoe.hs:2:51: Couldn't match expected type `aa a b' against inferred type `b' (a rigid variable) `b' is bound by the type signature for `ya' at hoe.hs:0:13 Expected type: aa (aa (aa a b) (aa a b), aa a (aa a b)) (aa a b) Inferred type: aa (aa (aa a b) (aa a b), aa a b) (aa a b) In the second argument of `(>>>)', namely `app' In the expression: (arr (\ ma -> (ma, ( (constA (ya, ma)) >>> app)))) >>> app
constに無理があるよなあとか思いつつ、どうすりゃいいんだとウンウン考えてたら、
関数は適用すれば型が簡約(?)されるけど、Arrowは適用しても型が簡約(?)されない!?
という事に気がついた。だから、yaにmaを適用した結果がmaの型に合うはずがない。あれ?だめなのこれ?*2
…なんか、これも自分の勘違いのような気がしてきた…
追記:改めて見てみると、お話にならないな…。そもそも、Arrowは>>>してなんぼなのにappベースでどうするんだ。ダメだこりゃ(。∀ ゚)アヒャ!