トップページtech
990コメント380KB

関数型プログラミング言語Haskell Part17

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2012/01/02(月) 22:19:28.26
haskell.org
ttp://www.haskell.org/

日本語サイト
ttp://www.sampou.org/cgi-bin/haskell.cgi
ttp://www.shido.info/hs/

過去ログ
関数型プログラミング言語Haskell
Part1 ttp://pc.2ch.net/tech/kako/996/996131288.html
Part2 ttp://pc2.2ch.net/test/read.cgi/tech/1013846140/
Part3 ttp://pc8.2ch.net/test/read.cgi/tech/1076418993/
Part4 ttp://pc8.2ch.net/test/read.cgi/tech/1140717775/
Part5 ttp://pc8.2ch.net/test/read.cgi/tech/1149263630/
Part6 ttp://pc11.2ch.net/test/read.cgi/tech/1162902266/
Part7 ttp://pc11.2ch.net/test/read.cgi/tech/1174211797/
Part8 ttp://pc11.2ch.net/test/read.cgi/tech/1193743693/
Part9 ttp://pc11.2ch.net/test/read.cgi/tech/1211010089/
Part10 ttp://pc12.2ch.net/test/read.cgi/tech/1231861873/
Part11 ttp://pc12.2ch.net/test/read.cgi/tech/1252382593/
Part12 ttp://hibari.2ch.net/test/read.cgi/tech/1272536128/
Part13 ttp://hibari.2ch.net/test/read.cgi/tech/1286706874/
Part14 ttp://hibari.2ch.net/test/read.cgi/tech/1299385928/
Part15 ttp://hibari.2ch.net/test/read.cgi/tech/1310199414/
Part16 ttp://toro.2ch.net/test/read.cgi/tech/1317958045/
0552デフォルトの名無しさん2012/02/11(土) 12:46:57.36
クライテリオンな

まぁ別にどっちでもいいことだけど
0553デフォルトの名無しさん2012/02/11(土) 13:56:27.61
超聖判規クライテリヲン
0554デフォルトの名無しさん2012/02/11(土) 19:24:57.36
あ、関節の病気か。
0555デフォルトの名無しさん2012/02/11(土) 23:32:33.40
2日に GHC のバージョンが 7.2.2 から 7.4.1 に上がってたのか

ghci 上で data や instance なんかの宣言ができるようになってた
これは便利

それはそうと、さっさと実行時に利用コア数を変えられるようにしてほしいものだ
0556デフォルトの名無しさん2012/02/11(土) 23:50:35.15
setNumCapabilities
増やせるだけで減らせないみたいだけど
0557デフォルトの名無しさん2012/02/11(土) 23:54:08.17
we recommend installing the Haskell Platform instead of GHC. The
current Haskell Platform release includes a recent GHC release as well
 as some other tools (such as cabal), and a larger set of libraries
that are known to work together.

と書いてるからさ、5月まで待ったほうがいいんじゃない? <7.4.1
0558デフォルトの名無しさん2012/02/11(土) 23:59:10.81
GHCの代わりにHaskell Platformをインストールするのを薦めとくわ。いまの
Haskell Platformは最近のGHCを含んでいて、おまけに、他のツール(cabalと
かね。)も動くし、よく使われてるライブラリも動くからさ。

だとさ、と意訳しとく。
0559デフォルトの名無しさん2012/02/12(日) 00:00:24.87
既存プロジェクトの移行はライブラリが7.4に対応するまで待つとしても、
普段は最新版使った方が楽しい
0560デフォルトの名無しさん2012/02/12(日) 00:03:51.27
Debian系統だとHaskell Platformは単なる仮想パッケージ。
0561デフォルトの名無しさん2012/02/12(日) 00:06:35.18
>>559
まあ、こなれた人ならそうかもしれない。でも、ここって、いろんな人が
いるから、一応書いといた。こなれた人ならトラブルに出会っても、解決
できるだろうし、それが楽しいもんな。

https://groups.google.com/forum/?fromgroups#!forum/haskell-jp
でも、しんさんがリリースのメールに注意書きがされているけどね。
0562デフォルトの名無しさん2012/02/12(日) 08:01:47.18
someRecord{someField = f $ someField someRecord}

haskellのレコード構文って何でこんなきもちわるいの
フィールド一つ書き換えただけの新しいレコードが欲しいだけなのに
0563デフォルトの名無しさん2012/02/12(日) 08:17:24.52
ご覧下さい
このクランケの症例では

・碌に調べもしない
・煽る事で住人達に答えさせようとしている

点が伺えます

これらは怠慢横柄病患者に共通に見られるのです
0564デフォルトの名無しさん2012/02/12(日) 08:37:41.32
バレたか・・・
いやまあ、自分で調べなかったわけでもないんだけどな
ほぼ無理なのは分かってる
0565デフォルトの名無しさん2012/02/12(日) 08:40:12.60
本当の地獄はレコードをネストさせてからだ…
0566デフォルトの名無しさん2012/02/12(日) 11:11:24.92
>>562
どういう書き方ができると良かったの?
0567デフォルトの名無しさん2012/02/12(日) 11:22:02.57
>>556
増加だけでもできるようになったのか
リリースノートを斜め読みしてたから見逃してた
0568デフォルトの名無しさん2012/02/12(日) 11:34:11.27
ネスとされたレコードの書き換えはdata-accessorとかlenseとか使うと少しは楽になるけど
これパフォーマンスどうなるんだろうという不安が出てくる
0569デフォルトの名無しさん2012/02/12(日) 11:35:43.98
>>568
神に従え
0570デフォルトの名無しさん2012/02/12(日) 12:17:15.85
>>566
SomeRecordとSomeFieldを二回も書きたくないというか
フィールドと同名のgetterを自動生成するような動きを許容したのなら
もっとはっちゃけて欲しかったというか
テンプレート? テンプレートなぁ・・・
0571デフォルトの名無しさん2012/02/12(日) 12:29:24.18
TemplateHaskellの有用性はlispが示している
0572デフォルトの名無しさん2012/02/12(日) 13:23:20.06
>>570
そうは言っても、「汎用的にするなら」 少なくとも

1. 何のデータ型の(値の)
2. 何のフィールドを
3. どう変えるのかを

この3つのは何らかの形で指定する必要があると思うが
05735722012/02/12(日) 13:31:17.15
>>570
すまん、不満点をちょっと勘違いしてたみたいだ

こういうことか

someRecord { someField = f $ someField someRecord }

{} 前の someRecord の部分が型構築子じゃなく値構築子の場合、
f $ someField someRecord の someRecord 部分は明白だから省略可能

こうなれば、幾分スッキリするな
0574デフォルトの名無しさん2012/02/12(日) 15:04:59.49
Cabal でライブラリをインストールする時、
オプションで library-profiling を有効にすると、
そのライブラリもプロファイリングの対象にできるよね

これって、プロファイリングしないで普通に使う時は
遅くなったりしない?
0575デフォルトの名無しさん2012/02/12(日) 15:11:00.59
-pを使うとパッケージを二通りコンパイルする
ので遅くならない
0576デフォルトの名無しさん2012/02/12(日) 15:31:06.20
>>575
そっか、安心した
ありがと
0577デフォルトの名無しさん2012/02/12(日) 19:23:37.68
Yampa の par 関数の型について質問です。
(他のパラレル系関数もですが、代表して par を選びました)

par :: Functor col => (forall sf. a -> col sf -> col (b, sf)) -> col (SF b c) -> SF a (col c)

このルーチン関数の sf という型変数には、SF b c 以外入ることは無いと思うのですが、
単純に a -> col (SF a b) -> col (b, SF a b) という型では何がいけなかったのでしょうか
0578デフォルトの名無しさん2012/02/12(日) 21:52:55.77
Cabal で --enable-documentation とやっていっしょにインストールされるドキュメントに、
ソースコードへのリンクが貼られるようにする方法はないのでしょうか?

HackageDB のサイトで見られるドキュメントみたいにしたいです
0579デフォルトの名無しさん2012/02/13(月) 10:41:10.37
>>577
スライドとか論文だと確かOpacity(透過性?)のためとか書いてあって、
俺も正確な意味はよくわからなかったんだけど、
SFを書き換えられるような関数を渡せるのを防止してるんじゃないかな。
route a xs = [(a, identity)]
みたいな、コレクションの中身を無視して出所不明のSFにしちゃうような。
0580デフォルトの名無しさん2012/02/16(木) 05:11:31.94
F#を始めたのだが、モナドで行き詰まっている。
F#の本にはモナドのことが書いていない。
で、ネットでモナドのことを収集すると、ハスケルのがほとんど。
F#での説明もあるが、なんか解りづらい。

で、モナドって何ですか?
関数型プログラミングをやるにはモナドが必須ですか?

どなたか教えてください _o_
05815802012/02/16(木) 05:15:46.89
ちなみに数学科出身ですが、圏論は知りません。
習った覚えがありませんし、仮に習っていても記憶にないのだから、習っていないのと同じです。
0582デフォルトの名無しさん2012/02/16(木) 05:48:37.15
モナドはモナド則そのもの。
使い方としてはモナド則を頭に入れてからListモナドとStateモナドを理解すれば後は大体類推が利く。
F#でどうなのかは知らないが、少なくともHaskellで何か書こうと思ったらモナドは必須。
まあ「モナドとは何か」みたいな話は過去スレ遡ればいくらでも出てくるよ。
0583デフォルトの名無しさん2012/02/16(木) 08:10:51.47
わかればわかるけど、モナドはモナド則そのものってのが禅問答みたいで
わかりにくいんだよなぁ。。

Haskellのクラスは、C++でいう抽象クラス見たいなもので、
Haskellのモナドがクラスでどう定義されてるか調べていけば、
意味はわからなくても、使い方はわかると思うよ。

モナドの意味は使っている内に、なんとなくわかるようになる、、、と思う。
0584デフォルトの名無しさん2012/02/16(木) 09:19:10.08
コンポーネントのようでコンポーネントでない
象のようで象のようでない
さてはモナドって南京弾簾だろ!
0585デフォルトの名無しさん2012/02/16(木) 09:37:41.55
Haskell 最大の失敗はモナドにモナドという名前をつけたことにある。
もっと「もこもこ」みたいな可愛い名前にすれば大流行していた。
とか講演でいってたな。
0586デフォルトの名無しさん2012/02/16(木) 09:48:34.02
名前はモナドのまま、バインド演算子を ( ´∀`)みたいなのにすれば良かったのではなかろうか
0587デフォルトの名無しさん2012/02/16(木) 09:51:36.68
ガンダムで頼む
0588デフォルトの名無しさん2012/02/16(木) 10:16:54.54
>>585
そのソースはどこよ?w
0589デフォルトの名無しさん2012/02/16(木) 13:28:49.11
>>588

元ネタはこれのはず。

Wearing the hair shirt: a retrospective on Haskell (2003)
Simon Peyton Jones, invited talk at POPL 2003.
http://research.microsoft.com/en-us/um/people/simonpj/papers/haskell-retrospective/

Our biggest mistake
Using the scary term "monad" rather than "warm fuzzy thing"
0590デフォルトの名無しさん2012/02/16(木) 14:37:03.09
2011年版はビデオで見られる。ちょっと重いけれど。
Escape from the Ivory Tower: The Haskell Journey, from 1990 to 2011
http://yow.eventer.com/events/1004/talks/1054

簡単だけど32分あたりに "warm fuzzy thing" が出てくる。

各銀行が秘密の Haskell 部隊を雇ってるって話はどこまで本当なんだろう。
0591デフォルトの名無しさん2012/02/16(木) 15:37:45.12
>>583
なんでこのなものが要るのか直感的に分からないってこと?
0592デフォルトの名無しさん2012/02/16(木) 15:56:24.13
>>585
そして処理が一本道だから
もこもこで一本道

略して もこみち とかどうよ?
0593デフォルトの名無しさん2012/02/16(木) 16:21:24.02
>>583
Haskellの型クラスはC++の抽象クラスとは全く違うよ。
オブジェクト指向の考え方は捨てるべき。
0594デフォルトの名無しさん2012/02/16(木) 18:14:54.42
Haskellとオブジェクト指向は根本的に違うから例えて考えるのは実際の処理挙動ぐらいにしたほうが……
0595デフォルトの名無しさん2012/02/16(木) 18:27:40.48
C++にはクラスという機能を用いて現実世界の概念を抽象化することに成功し、直感的な設計・実装が行えるようになった
Haskellでは、どのようなパラダイムがこれから出てくるのか
私はそれが楽しみでならないのです
って去年死んだおじいちゃんが死ぬ間際に言ってた
0596デフォルトの名無しさん2012/02/16(木) 18:49:29.40
ぷうぷう!
0597デフォルトの名無しさん2012/02/16(木) 19:05:35.61
もこもことかモコナとかそういうかわいいのはいらない
モサドにしよう
0598デフォルトの名無しさん2012/02/16(木) 19:24:01.77
>>595
Haskellは遅延評価という機能を用いて現実世界の手順を隠蔽することに成功し、
宣言的な設計・実装が行えるようになりました。
しかしHaskellは関数型言語からは踏み出さないだろうから、新しいパラダイムは
Ozのようなマルチパラダイム言語に期待すべきだろうと思えてならないのです。
って友達がさっき言ってた。

コンピュータプログラミングの概念・技法・モデル
http://toro.2ch.net/test/read.cgi/tech/1196257692/
0599デフォルトの名無しさん2012/02/16(木) 19:27:51.75
Ozはオワlan
0600餃子チョコレート ◆8X2XSCHEME 2012/02/16(木) 20:52:04.09
うまいな。
一瞬「終ったランゲージ」と思わせといて実は「終わらん」というダブルミーニングですね!!
0601デフォルトの名無しさん2012/02/16(木) 22:13:47.28
>>593
そう?
「Learn You a Haskell for Great Good!」には、JavaのInterfaceみたいなのと
考えたほうがいいって書いてるけど。
全く違うっていうならどう考えればいいか説明してほしいな。

0602デフォルトの名無しさん2012/02/16(木) 22:27:34.65
>>591
最初、(>>=)はただ関数に引数にして渡すだけじゃないか、なんで必要なんだとか思ってた。
他のもなんでこんなのが必要か理解できなかったよ。

変な型修飾付けるせいで、型が違うって怒られるし。

でもそうやって好き勝手書けないようにするのが狙いなんだな。
0603デフォルトの名無しさん2012/02/16(木) 22:46:41.67
デザインパターンみたいなもの、でいいと思うけどな > モナド
0604デフォルトの名無しさん2012/02/16(木) 22:56:34.58
私は >>593 ではないのですが、逆に訊きたいです

Haskell の型クラスと Java のインターフェイスにおいて、
考え方の共通点とは何でしょうか

それは、コンパイル時にどう解釈されるかというレベルの共通点でしょうか
それとも、アプリケーションを作る上での指針となるくらいのレベルの共通点でしょうか
06056042012/02/16(木) 22:57:13.58
>>604
すいません、>>601 に対しての質問です
0606デフォルトの名無しさん2012/02/17(金) 03:06:37.40
Haskellのclassはplatformに改名しろ
0607デフォルトの名無しさん2012/02/17(金) 04:24:56.80
型を集合だと考えれば型クラスって命名は自然
0608デフォルトの名無しさん2012/02/17(金) 04:41:03.84
型(type)のメタ概念として類(class)という名前を採用することは間違っていない
ただし、これだけオブジェクト指向の概念が普及しているのが現実なのだから、
それを配慮した命名が望ましかった(かもしれない)ということ

これをHaskellの傲慢さと見るか、それとも数学的に正しい命名であると見るかは
判断が分かれるところ
0609デフォルトの名無しさん2012/02/17(金) 04:50:13.16
オブジェクト指向のclassが類と無関係だと思ってるっつーか、
類をモデルにしているのはtype classだけだとか思ってるところが
Haskellerの傲慢さじゃないの?
0610デフォルトの名無しさん2012/02/17(金) 05:12:11.76
simula(I,67) http://staff.um.edu.mt/jskl1/talk.html
smalltalk(80) http://web.cecs.pdx.edu/~harry/musings/SmalltalkOverview.html#The%20Smalltalk%20Object%20Model
これ参考にCからC++とObjCができたのか。
0611デフォルトの名無しさん2012/02/17(金) 06:49:42.48
>>609
オブジェクト指向のclassって命名にケチつけてるなら
Haskellerは傲慢だけど、そうじゃないよね?
0612デフォルトの名無しさん2012/02/17(金) 07:36:36.25
オーバーロードは必要でオーバーライドは不要だと思ってるところが傲慢だ
0613デフォルトの名無しさん2012/02/17(金) 09:25:13.67
>>580
ここは読んだか?
http://www4.atwiki.jp/fsharpmaster/m/pages/13.html
0614デフォルトの名無しさん2012/02/17(金) 09:28:48.05
>>550
Johan TibellのHaskell Performance Patterns talkのスライドも
このリストに追加の資料になりそう。
0615デフォルトの名無しさん2012/02/17(金) 11:31:01.99
>>604
全く同じとまでは言わないけど、
Haskellのtype ≒ Javaのclass
と考えたときに、
Javaのinterfaceがclassにまたがって横断的に制約を作れるというところが、
Haskellの型クラスがデータ型を横断して共通の「クラス」を作れるところ
と似てるって言ってるんじゃないの。
とりあえず最初の入り口から何でも違う違う言ってたら、誰もHaskell始められないよ。
0616デフォルトの名無しさん2012/02/17(金) 11:43:00.28
>>615
このスレを見て面白そうなので僕は今日から始めました。
0617デフォルトの名無しさん2012/02/17(金) 12:42:29.71
>>615
ということは、それはコンパイル時の解釈の問題ですよね

>>593
> オブジェクト指向の考え方は捨てるべき
と言っており、これはアプリケーションを作る指針となる考え方において、
抽象クラスとは違うことを言っているように思えます

もしそうなら、それに対する反論としての >>593 は的外れだと思います

>>583 も、わかればわかるけど、モナドはモナド則そのものは解りにくいと言ってることから、
入門レベル(最初の入り口)は通り過ぎているものと思われます。


> とりあえず最初の入り口から何でも違う違う言ってたら、誰もHaskell始められないよ。

それはそうですが、それとは別問題として、話が噛み合っていないような気がします
0618はちみつ餃子 ◆8X2XSCHEME 2012/02/17(金) 13:03:38.71
俺もあんまり「××のようなもの」っていう解釈はしない方がいいと思ってる。
部分的に機能がかぶるだけで類似性を見出していたのではそれに引き摺られて根本的なパラダイムの理解に進み難い。
0619デフォルトの名無しさん2012/02/17(金) 13:25:22.45
type classってオーバーロードと型推論を両立するための妥協だから
パラダイムみたいな高尚な概念じゃないよ
0620デフォルトの名無しさん2012/02/17(金) 13:34:40.12
そんなこと言ったらOOPにだってパラダイムなんて高尚なもん
一つも無ぇっつーの
06216152012/02/17(金) 14:08:40.22
>>617
話の流れ見てなかった。すまんかった。
だからケンカしないで。
0622デフォルトの名無しさん2012/02/17(金) 14:17:39.16
>>617
横レスだけど、

・オブジェクト指向のクラスもHaskellの型クラスも
 「抽象データ型」の実現という意味では似ている(>>615)
・オブジェクト指向の「インヘリタンス」とHaskellの「アドホック型多相」とは
 型システム理論という意味では全く違う(>>593)

ということじゃないのかな?
各用語の意味は、自分で調べてね
0623デフォルトの名無しさん2012/02/17(金) 14:31:40.54
>>622
OOPの「継承」は部分型多相では?
0624デフォルトの名無しさん2012/02/17(金) 14:34:40.69
>>623
オーバーライトや疑似変数selfなんてのは、部分型多相には存在しない概念/理論
0625デフォルトの名無しさん2012/02/17(金) 14:46:11.83
>>623
なるほど。型理論勉強します。
06266252012/02/17(金) 14:46:38.91
>>624 だった
0627デフォルトの名無しさん2012/02/17(金) 14:58:14.86
>>619
型クラスにはアドホック型多相という理論的基盤があるから、
それはいわゆる「高尚」と表現してもかまわないんじゃまいかと思う

>>620
OOPの継承というのは直感的かつ曖昧なもので、その足場は非常に不安定
だからオブジェクト指向について10人に尋ねれば、10人それぞれが異なった解釈を返す
そんな代物を「高尚」とは、とても呼べないんじゃまいかと思う
06286272012/02/17(金) 15:10:40.81
訂正

X: OOPの継承というのは....
O: OOPというのは....
0629デフォルトの名無しさん2012/02/17(金) 15:18:03.49
>>624
概念/理論は存在したり存在しなかったりするんだな・・・
それなら概念/理論を教えるよりも実装を教える方が良い
0630デフォルトの名無しさん2012/02/17(金) 15:22:36.71
例えばC++で言うところのオブジェクト指向とは
・情報隠蔽
・継承
・ポリモーフィズム
でした
0631デフォルトの名無しさん2012/02/17(金) 15:26:42.34
オーバーロードをアドホック多相と言いかえると何か凄そうに見えるテクニックはテストに出ます
0632デフォルトの名無しさん2012/02/17(金) 15:39:17.02
>>629
>概念/理論は存在したり存在しなかったりするんだな・・・

え、オーバーライトや継承の概念を含む、いわゆる「継承の型システム」に関する理論は、
いくつか存在しているよ
足りないのは動的なメソッド結合(ダックタイピング)や動的な型付け(メタプログラミング)の理論

そんな完成した静的型付けな型システムの一つを実装したのがObjective-Caml
ただし、(Objective-CがOOとCのハイブリッド言語であるように)
部分型多相と継承は理論的に全く違うから、両者のハイブリッドになっている
結果として、残念ながら「関数型パラダイムにおけるオブジェクト指向」という理想には程遠い
06336322012/02/17(金) 15:41:17.07
また訂正

X: オーバーライトや継承の概念を含む、....
X: オーバーライトや疑似変数selfの概念を含む、....
0634はちみつ餃子 ◆8X2XSCHEME 2012/02/17(金) 15:48:26.21
>>633
また訂正ですね!!
06356322012/02/17(金) 16:17:42.90
>>634
...orz

すぐに分かってくれたようだから、あえて訂正しないw

>>631
MLやHaskellでは、JavaやC++のようなNullPointerExceptionやBusErrorは発生しない
型に関するミスは、コンパイル時にすべて検出できる
それが、理論的背景のある型システムの「凄さ」だと言える

次のテストに出すかもしれないから、よく復讐しておくように
0636デフォルトの名無しさん2012/02/17(金) 16:40:57.39
別に凄くない
むしろ、すべてに責任をもつことはできないから責任を限定する理論が必要になる
型に関するミス以外は管轄外だし
プログラマーが勝手に Nothing とか [] を使うのは自己責任
0637デフォルトの名無しさん2012/02/17(金) 16:47:11.46
言語の中でNullを扱わなくなっただけで、Nullみたいな値の濫用の余地は残るわけですよね。
昔のCOBOLはNULLが扱えなくて0000や9999などの値で成功失敗とか表現していましたし、そういうシステムはかなり多いと聞いています。
つまり、NULL無いんなら0000や9999でいいやと思うような人には型システムなんて意味ないんじゃないでしょうか?
0638デフォルトの名無しさん2012/02/17(金) 16:56:36.58
>>611
他パラダイムや他言語を矮小化する一方で、
「無秩序でいい加減な」という意味のアドホック多相を
あたかも高尚なものであるかのように
誇張しているだけだから、傲慢じゃなくて
滑稽だね。
0639デフォルトの名無しさん2012/02/17(金) 17:06:52.05
ad hoc
 adv., adj. (特に)このために[の], 特別に[の], この場限りで[の], その場限りで[の].
                        研究社 新英和大辞典 第6版
0640デフォルトの名無しさん2012/02/17(金) 17:20:15.57
http://www.youtube.com/watch?v=z5rRZdiu1UE
0641デフォルトの名無しさん2012/02/17(金) 17:21:05.17
カズヤマモトサンかっけー
0642デフォルトの名無しさん2012/02/17(金) 18:09:29.51
この流れで質問させてください
型クラスってのは代数的構造のことではないんでしょうか?
0643デフォルトの名無しさん2012/02/17(金) 18:48:32.83
>>642
そんなようなものだけどもうちょっと一般的
C aというインスタンスのメソッドの戻り値の型はa以外になり得る
OrdとかShowとか
0644デフォルトの名無しさん2012/02/17(金) 18:57:33.81
>>635
ヌルポは値に起因するバグで、型システムによる安全性の保証外なのはML系でも同じだよ。
MaybeはまんまC#のnullable<T>だし。
Haskellはパターンマッチでパターンを網羅してないとちゃんと警告出してくれたり、
Maybeモナドみたいな明示的にチェックを書かなくても済む仕組みその他諸々のおかげでバグりにくいって話で、
コンパイルで検出出来てるわけじゃないし、発生しないわけでもないよ。
0645デフォルトの名無しさん2012/02/17(金) 19:12:32.81
>>642
型クラスもデータ型もメモリ上のビットも代数的構造
0646デフォルトの名無しさん2012/02/17(金) 19:24:43.41
NullPointerExceptionはバグなの?
0647デフォルトの名無しさん2012/02/17(金) 19:29:54.49
>>644
Maybeはぬるぽがっされないような、、、
0648デフォルトの名無しさん2012/02/17(金) 19:43:26.86
>>645
そういう文脈で代数的構造と言った場合の「代数的」とはどういうものですか?
0649デフォルトの名無しさん2012/02/17(金) 20:02:36.22
>>648
代入可能なこと
定数以外は代数的構造
0650デフォルトの名無しさん2012/02/17(金) 20:55:05.10
>>647
トリビアルな例だけど、常にJustな事が期待されてる変数alwaysJust :: Maybe aがあったとして、
1)
case alwaysJust of --これは警告がでるけど
 Just x -> x

2)
let (Just x) = alwaysJust in x -- こんなドタコなコードは書かないけど…

3)
-- fooの使用者からは定義かドキュメントを見ない限り、例外が上がってくる可能性がある事は知りようがない
foo :: a -> a
foo v = fromJust $ do -- fromJustってどういうケースで使うんだろか…。
 x <- alwaysJust
 v' <- Just v
 ...
 return v'

もし、alwaysJustがバグっててNothingだったら、上の例は全部例外あげてくる。
特に3番目みたいな外からは一見安全に見える型の関数でも、ガッされない絶対の保証があるわけでも、検出できるわけでもないよ。
(1番目以外は警告すらでないし)

Maybeからそれると、Preludeの関数でもListのheadとか(!!)とか、Enumのsucc、predとかreadやArrayとか、
プログラマがちゃんと保証しなきゃいけない関数も結構あるし。
0651デフォルトの名無しさん2012/02/17(金) 21:29:13.08
Maybeからそれると、Intも危険だよね
オーバーフローして意図しない挙動をする危険性があるから
プログラマがちゃんと保証(ry
0652デフォルトの名無しさん2012/02/17(金) 21:31:32.72
RWHを買ってきました
あしたRWHを一日かけて読み切ります
何か注意点とかありますか
■ このスレッドは過去ログ倉庫に格納されています