Haskellでのエラーの扱い方。あるいはApplicative, Monad等とliftが多くなることについての考え。

@tanakh 師と @nushio による会話を横からメモしたもの。 - Haskellではエラーは型に追い出すのが正攻法。Pureな計算からErrorが飛び出てくるのは対処しようがないので避けるべき。 - 型に追いだすと最終的にすべての操作が例えばMonadの中で行われることになる。それをどう考えるか。 続きを読む
13
nushio @nushio

@tanakh エラーといえば、IOじゃないんですけどerror :: String->a でモナドじゃないとこからでもエラーを投げられるのがありますよね、あれは使っていいもんなんでしょうか?

2011-04-14 16:05:15
Hideyuki Tanaka @tanakh

Haskell的には、エラーを例外で投げるというのはやはり美しくない。エラーを投げるというコンテクストが型によって明示されているべきであって、IOが何でもありなのはともかく、purelyに投げられるのはほんと良くない。

2011-04-17 10:04:55
nushio @nushio

@tanakh ぬー、やっぱerror::String->aは禁じ手ですか

2011-04-17 10:07:07
Hideyuki Tanaka @tanakh

@nushio 禁じ手というか、purelyに拾う手段がないのでいけない。

2011-04-17 10:07:38
nushio @nushio

@tanakh head []とかerrorになりますよね。

2011-04-17 10:09:41
Hideyuki Tanaka @tanakh

@nushio はい。良くないと思ってます。

2011-04-17 10:10:11
nushio @nushio

errorは使いたくないです。どこでなに経由してエラーがでたかさっぱり分からなくなるし。じゃあ、型エラーでそもそもはじくか、エラーをきちんと分別回収できるようにしておくかだけど、どっちも荷が重そう。とくに型は限られた場合にしか使えなさそう。

2011-04-17 10:13:01
nushio @nushio

@tanakh たとえばhead [] すら、errorつかわないで書けるのでしょうか?僕にはまだどうするのか想像できないですがなったらすばらしいと思います

2011-04-17 10:14:20
nushio @nushio

Maybeつかうとしても、そのあとfromJustしたら同じ事だよなあ

2011-04-17 10:15:50
Hideyuki Tanaka @tanakh

その場合、ヘッダの型が [a] -> m a になって、mは何らかのエラーを含むことのできるコンテキストのモナドの型クラスになるでしょう。それが利便性に影響を与えないかという危惧もあると思いますけど、今や我々は数多くのモナドを操るための手段を持っているので、苦労はないと思っている

2011-04-17 10:17:38
nushio @nushio

@tanakh Maybeに限らないのか。そういえばモナドにはfailというのがありましたね

2011-04-17 10:19:10
Hideyuki Tanaka @tanakh

普通な値と普通な関数は、スペースというとても簡単なものでapplyできるので、とてもそれを使いたくなってしまうのだけど、リフトした値だってHaskellでは簡単にapplyできるのだから、好きなだけリフトすべきだと最近は思う。

2011-04-17 10:19:15
Hideyuki Tanaka @tanakh

@nushio モナドのfailはMonadErrorとか別のクラスにくくり出すべきですね

2011-04-17 10:20:35
nushio @nushio

一度不確定計算に入ったらずっとMaybeを書き続けるなんて悪夢のようだとおもっていたけど、よく考えたら一度不確定になったものはずっと不確定であるべきだし、きっとGreat Goodをこの先読んでいけば自然に使えるようになるはず

2011-04-17 10:21:23
Hideyuki Tanaka @tanakh

@nushio Great GoodはほんとGreatなのでよもう!

2011-04-17 10:22:05
nushio @nushio

@tanakh きっとモナドを扱う手段は豊富に準備されているだろうと思っているので、はやく習得したいです><

2011-04-17 10:22:36
Hideyuki Tanaka @tanakh

関数型言語の”関数”ってホントはなんだったのかってのが、最近になってようやく分かりつつある。

2011-04-17 10:22:49
nushio @nushio

@tanakh 好きなだけliftできる体になりたい!

2011-04-17 10:22:55
Hideyuki Tanaka @tanakh

@nushio はい。そして、リフトさあれた値を扱う手段はモナドだけじゃないということもわかると思います

2011-04-17 10:23:13
nushio @nushio

@tanakh なんだったのでしょう?(osoruosoru

2011-04-17 10:23:21
Hideyuki Tanaka @tanakh

@nushio a -> b なる値、ではなくて、値を適用(手段は選ばず)できる物全般だということですね

2011-04-17 10:25:07
nushio @nushio

@tanakh (->)が型コンストラクタだったと言われたときには目が飛び出しそうになりましたよ…

2011-04-17 10:26:41
Hideyuki Tanaka @tanakh

@nushio それとおなじで、IO使うと全体をIOにしないといけないから嫌という意見もあったりするけど、これもよく考えればずっとIOになるのはあたりまえだということがわかると思います

2011-04-17 10:27:04