#twitter を haskell でひっかかけるサービスって何でしたっけ? > nobsun
##haskell 出演者の方に質問。何も知らない人がHaskellスゲーって思える話を聞かせてください。
#shelarcy さん、ありがとう。> unsafeCoerce
#賢人鳥が実装できました。
#s x y z = x z (y z)
l x y = x (y (unsafeCoerce y))
y = s l l
#ですが、s と k から賢人鳥を積み上げると、エラーにはなりませんが、答えが表示されません。
#k x y = x -- aka const
s x y z = x z (y z)
i = s k k -- aka id
b = s (k s) k
w = s s (k i)
l = b w b
y = s l l
#i までは合っているのですが、w,lの辺りがあやしいです。
#どうしてでしょうね。
#あ、l は以下が意図したコードです。
#l = b w (unsafeCoerce b)
#*unsafe*Cource のせいだと思われます
#答が表示されないというのはどういうこと?
#> cut-sea
#文字通り
> fib 10
>
ということだと思います。
#l = ((s ((s (k s)) k)) (k (s i (unsafeCoerce i))))
#こっちの定義なら、きちんと答えを返してくれますよ。
#unsafeCoerce は強制的に型を合わせる(coerce)だけなので、型を合わせた結果の式が Haskell として正しく働くかどうかは保証しません(unsafe)。
#unsafeCoerce を使って書いた結果の式が Haskell として正しいかどうかは、また別に考える必要があります。なので、unsafeCoerce を使ってプログラムを書くことが出来たからといって、それが期待通りに動くとは考えてはいけません
#今回は賢人鳥を実装しようというだけなので、このあたりの問題について深く考える必要はないかもしれません。しかし、実際のプログラミングに unsafeCoerce を使いたくなったら、このあたりについてきちんと考える必要があると思います。
#と、nwn さんのコメントに補足しておきます。
#ああそういうこと。そりゃそうだよね。
#> unsafeCoerce id 1
#>
#結果の型がわかれば問題ないから
#> unsafeCoerce id 1 :: Int
#> 1
#すごーい。長年の喉のつっかえが取れた感じ。さっそく、ブログに書いちゃおう。
#あれ?でも、cut-sea の定義でも動くよ。
#s x y z = x z (y z)
l x y = x (y (unsafeCoerce y))
y = s l l
fib = y (\ f n -> if n < 2 then n else f (n-1) + f (n-2))
#> fib 10
#55
#問題なのは、 l = b w b の方です。
#> @nobsun
#l = c b m だとおもってたんだけど。
#なるほど。というわけでわたしも日記に書きますた。
#ああそうか。m からみちびくわけじぁなかったのか。
#今頃 :t ap fmap が ((a -> b) -> f a) -> (a -> b) -> f b が理解できた。ap に対応するモナドが ((->) (a -> b)) なのか。型が合うようなモナドのインスタンスが複数存在するようなことはない?
#:t zip.ap fmap はエラーになった。
#