トップページtech
1001コメント316KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2013/01/21(月) 02:16:16.07
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/
Part17 ttp://toro.2ch.net/test/read.cgi/tech/1325510368/
Part18 ttp://toro.2ch.net/test/read.cgi/tech/1331902463/
Part19 ttp://toro.2ch.net/test/read.cgi/tech/1340760070/
Part20 ttp://toro.2ch.net/test/read.cgi/tech/1350428908/
0554デフォルトの名無しさん2013/03/05(火) 01:45:00.19
>>553
できない
0555デフォルトの名無しさん2013/03/05(火) 01:58:32.92
>>551
>>524
0556デフォルトの名無しさん2013/03/05(火) 03:46:01.48
unsafe〜 を risky〜 に替えよう(提案)
0557デフォルトの名無しさん2013/03/05(火) 06:44:09.97
>>553
unsafePerformIOを使えばできる
が、これは通常使用されるべきものではない
0558デフォルトの名無しさん2013/03/05(火) 18:46:22.28
Haskellは参照透過だというのは納得している。
すべてを数学的な関数で表現しているという意味で。

だけど、Haskellには副作用がない・・とする主張は詭弁だと思う。

Haskellに副作用がないといえるなら、C言語もある意味で副作用ないといえると思う。
実際に動作する前までは・・。

DanoMoiの説明を見たときは、ケムにまかれたという感想でもなくて、単に「は?」だった。
0559デフォルトの名無しさん2013/03/05(火) 18:58:39.16
なにか高級な機構を「けむに巻くかのように」説明するかと思えば・・。

副作用の定義を慎重に狭く決めた上、C言語とHaskellの間の、
解釈から実行に至るまでの処理の違いを大げさに主張しただけ。

Haskellの処理と実行の間に、仮想の?プロセスを挟み込んで
そのプロセスをHaskellではないとみなすことで、
副作用とやらについて、やっとC言語と差別化できる。

まあ、偉そうなハスケラーには反感を持っていたので
最初から同意するつもりなかったけどね。
0560デフォルトの名無しさん2013/03/05(火) 18:58:42.24
わけわかめ
0561デフォルトの名無しさん2013/03/05(火) 19:02:10.79
>>535
モナド何読んでもわからないという話から始まっているんだこのスレッド。
0562デフォルトの名無しさん2013/03/05(火) 19:15:45.30
定期的に恨みつらみを述べてスレを埋めるお仕事乙です
0563デフォルトの名無しさん2013/03/05(火) 19:16:01.07
なぜHaskellとCが同じになるのかさっぱりわからん
0564デフォルトの名無しさん2013/03/05(火) 19:16:29.69
>>558
Cは問題ないが、クラスとコンストラクタがある言語が問題だ
static変数を初期化する段階ですでに副作用がある
そういう実行前の副作用をなくしたことは評価されるべき
0565デフォルトの名無しさん2013/03/05(火) 19:20:16.33
>>559
何を見ても偉そうに感じる人生なんて想像できない
もっと教えてください!
0566デフォルトの名無しさん2013/03/05(火) 20:05:34.24
>>559
もうちょい頭良かったら理解できたのにね
まあその日本語力からして無理か
0567デフォルトの名無しさん2013/03/05(火) 20:14:52.77
Cプログラマを下に見ているのは真のLisperぐらいだと思っていたが。
関数型プログラミングの流行で浅はかなHaskellerが増えたんだな。
0568デフォルトの名無しさん2013/03/05(火) 20:23:42.37
Cプログラマじゃなくて
このおっさんがバカだなって話だけどな
0569デフォルトの名無しさん2013/03/05(火) 20:24:39.28
ごめん、別スレでこのおっさんにそんなだからHaskellerに相手されないんだみたいなこと言ったの俺かもしれない。
0570デフォルトの名無しさん2013/03/05(火) 20:27:21.90
>>567
Cプログラマに失礼だろ、Cでガリガリプログラム組むようなやつは
Cの問題点もきっちり理解してるし
Haskellみたいなやり方があることも理解してる
0571デフォルトの名無しさん2013/03/05(火) 20:32:01.14
>>569
おまえか
おかげでここ数日アホみたいな質問で埋まってウンザリしたわ
長文で我慢強く答えてた人は天使だと思った
0572デフォルトの名無しさん2013/03/05(火) 20:32:03.85
いやHaskellをそれなりぐらいには理解してるCエキスパートって、まだそんなに多くないだろ
0573デフォルトの名無しさん2013/03/05(火) 20:41:59.59
Haskellのやり方が理解できないとか、Cのエキスパート以前にプログラマとしてダメダメやん
0574デフォルトの名無しさん2013/03/05(火) 20:47:58.77
>>570
さよう
0575デフォルトの名無しさん2013/03/05(火) 20:52:44.25
>>573
純粋関数型なのに、どうやって入出力を実現するの? というのが疑問、ってぐらいが普通だと思うけど。
まだそんなにはHaskellは普及してない。
0576デフォルトの名無しさん2013/03/05(火) 20:54:59.78
上の方にも副作用を分離してるって書いてあるだろ
分離できる(それを静的にチェックできる)だけで副作用はあるよ
0577デフォルトの名無しさん2013/03/05(火) 21:03:45.37
>>575
C言語のエキスパートなら、
関数型的なコードと入出力部分のコードを分離してみるなんて普通に試してみたりするもんだ
0578デフォルトの名無しさん2013/03/05(火) 21:04:35.35
C等命令型言語には副作用があって、Haskellには副作用はないと主張する立場から、
それなりに答えたのは、DanoMoiの例くらいだと思うよ。
他の「Haskellには副作用は存在しない」教信者は、「お前は理解してない」と言い張るのみだ。

なお、「Haskellには副作用は存在しない」教信者とHaskell信者は一致しない。
0579デフォルトの名無しさん2013/03/05(火) 21:09:58.41
このスレのほとんどの奴は副作用が無いんじゃなくて副作用を分離してるって言ってるだろw
0580デフォルトの名無しさん2013/03/05(火) 21:11:29.88
恐らく、Haskellを純粋関数型言語である
ということくらいしか知らない多くの他言語プログラマにとっては、
「Haskell = 副作用が無い」という認識なのだと思います。

それくらい、他言語プログラマにとって Haskell はまだまだ謎な言語で、
関わりの無い言語だと言うことなのでしょう。

もし、他言語プログラマにもHaskellに興味を持ってほしいと思っているのなら、
Haskell プログラマがもっと増えるといいなと思っているのなら、
根気よく丁寧に説明していくしか無いと思います。

そんなのはどうでもいい、という事なのでしたら、
せめて説明している人の邪魔だけはしないであげてほしいです。
勘違いの指摘は大歓迎だと思いますが。
0581デフォルトの名無しさん2013/03/05(火) 21:18:44.93
あんた偉いよ
どうでも良いとは思わんけど、ここ数日の質問者クラスのアホだと教える気なくすわ
0582デフォルトの名無しさん2013/03/05(火) 21:33:54.20
べつに丁寧に教えなくても
ヒントを少し書いてはい論破でいいんだよ
難しく考えすぎ
0583デフォルトの名無しさん2013/03/05(火) 21:42:17.34
こんなこともできるんだって興味持って貰えるような
GUIアプリとかゲームとかクライアントサーバ的なものとか作って世に出してかないと
関数型の(精神的な)敷居は高すぎる
0584デフォルトの名無しさん2013/03/05(火) 21:48:09.03
フロントエンドは.NETに頼るとして、Haskellをバックエンドとして使えないかな・・
と思っていますが・・。

シミュレーションゲーム作ろうとして挫折しているけど、思考部などをHaskellで作りたい。

Haskellに慣れるための練習として、パズル解答ソフト作成中です。
0585デフォルトの名無しさん2013/03/05(火) 21:49:50.13
みんなHaskellでどんなアプリ作ってるの?
0586デフォルトの名無しさん2013/03/05(火) 21:53:13.00
UIは入出力しかないしネットは文字列しかない
消去法でゲームが正解
0587デフォルトの名無しさん2013/03/05(火) 21:55:20.69
>>475 >>532

>Cコンパイラは次の関数ポインタを受け取る関数
>int twice(int (*f)(int), int x) {
> return f(f(x));
>}
>が副作用があるか無いかを、どうやって知れば良いの?
>渡される関数ポインタfがどんなものか分からないのに。

twiceが副作用のない関数であることは、"int twice"から自明だ。
そして*fで指されたfが本当にint->intであることをチェックしたいなら
twice呼び出し側の"int (*f)(int)"パラメータの素姓を辿っていけばよい。
それだけのことだ。

>それとも、関数ポインタが渡されるときは、常に副作用があると考えるの?

そんなことはしない。
0588デフォルトの名無しさん2013/03/05(火) 21:55:24.81
IOモナドのおかげで泥臭いIOがそれなりに安全に書ける
Haskell強力な手続き型言語だと思った
0589デフォルトの名無しさん2013/03/05(火) 21:58:20.39
>>587
"int twice"から自明であると思った根拠を述べてください
0590デフォルトの名無しさん2013/03/05(火) 22:03:57.07
>>587
int twiceから自明ってどういうこと?

int twice(int (*f)(int), int x){
static int n = 10;
return n = f(n);
}
0591デフォルトの名無しさん2013/03/05(火) 22:04:55.30
副作用はvoidを返す関数のことじゃない
0592デフォルトの名無しさん2013/03/05(火) 22:05:29.83
中でグローバル変数を更新してるかもしれないし、
Cでそれを型から確認する方法はないな。

GCCなら __attribute__ ((pure)); と書いて、プログラマの責任でコンパイラに対して
保証してやることはできるが。
0593デフォルトの名無しさん2013/03/05(火) 22:06:40.17
>>587
> twiceが副作用のない関数であることは、"int twice"から自明だ。
え?


int twice(int (*f)(int), int x) {
    static int n = 0;
    n += f(f(x));
    printf("%d\n", n);
    return n;
}
0594デフォルトの名無しさん2013/03/05(火) 22:13:34.88
だからバカなんだから相手すんなよ
まだ続けんのかよ
0595デフォルトの名無しさん2013/03/05(火) 22:15:33.03
unsafePerformIOを自粛することが自明であるのと同じだと思うよ
voidではない関数の中では副作用を自粛する
0596デフォルトの名無しさん2013/03/05(火) 22:17:21.80
>>595

int main(int argc, char* argv[]) {
}


副作用を自重してくださいね!
0597デフォルトの名無しさん2013/03/05(火) 22:23:46.83
>>593
なんでそんなややこしい例をだすんだよw
int twice(int (*f)(int), int x) {
printf("%d\x", x);
return x;
}
でいいんだろ
0598デフォルトの名無しさん2013/03/05(火) 22:24:48.69
int printf(const char*, ...)
なんか副作用ない気がしてきた
0599デフォルトの名無しさん2013/03/05(火) 22:26:49.85
>>595
unsafePerformIOはgotoレベルだからまた別だと思うの
0600デフォルトの名無しさん2013/03/05(火) 22:30:55.57
>>598
ようやく分かってきたか
それは副作用ないと判断すればいいんだよ
ほんとに分かってる?
0601デフォルトの名無しさん2013/03/05(火) 22:32:41.74
>>598
ライブラリを作り直す必要があるね
Haskellはライブラリのついでに言語も作り直したのだ
0602デフォルトの名無しさん2013/03/05(火) 22:36:28.74
printf系は副作用そのものを目的にしていると思うけど。
0603デフォルトの名無しさん2013/03/05(火) 22:41:51.97
C++でさえ、<stdio.h>等を無かったことにする風潮だからな
0604デフォルトの名無しさん2013/03/05(火) 22:42:54.23
>>597
static変数が使われたら自説が破綻するからややこしいということにしてstatic変数を消した
0605デフォルトの名無しさん2013/03/05(火) 23:08:35.21
OpenGL の GLUT で簡易GUI作ったけど、C言語で書いた場合より複雑になった
もうダメだわ
0606デフォルトの名無しさん2013/03/05(火) 23:14:14.74
>>605
何々をやってみたがダメだったとだけ言われても、
それがどうしたとしか言いようがない。

Haskellは使えんと言いたいのか?
それとも、何か質問や議論したいことがあるのか?
0607デフォルトの名無しさん2013/03/05(火) 23:21:40.78
少なくとも、GUIデザインする場合、「俺には」使えん
0608デフォルトの名無しさん2013/03/05(火) 23:23:10.41
だから、それがどうした

そんなもんツイッターにでも書いておけよ
0609デフォルトの名無しさん2013/03/05(火) 23:25:58.50
議題:Callbackを簡潔に書くには?
0610デフォルトの名無しさん2013/03/05(火) 23:28:54.79
それをクロージャがある言語に訊くか?馬鹿なのか?
0611デフォルトの名無しさん2013/03/05(火) 23:34:32.38
じゃあGUIなんか簡単だよな>>610
0612デフォルトの名無しさん2013/03/05(火) 23:36:09.19
私もglutはツールバーとかテキストフィールドで操作するのは発狂しそうになったから
マウスのクリックとドラッグ以外の操作は全部削除する方向で設計してる
細かい数値やテキストが必要になったら、起動時にファイル読み込み

http://www.dotup.org/uploda/www.dotup.org4010417.png
0613デフォルトの名無しさん2013/03/05(火) 23:37:11.30
GUIは言語あんまり関係無い
RADツール次第
0614デフォルトの名無しさん2013/03/05(火) 23:40:31.91
>>612
これ参考になりますか
http://www.cs.unc.edu/~rademach/glui/
0615デフォルトの名無しさん2013/03/05(火) 23:42:12.72
GLUTは設計がクソすぎだから分からなくても仕方ないと思う

これ使えよ
http://www.haskell.org/haskellwiki/GLFW
0616デフォルトの名無しさん2013/03/05(火) 23:43:07.77
>>611 はCallbackが簡潔に書ければGUIは簡単に書ける
と言っているように聞こえる。

そんな馬鹿なと言いたい。
0617デフォルトの名無しさん2013/03/05(火) 23:46:30.93
GLUTは分からんというか、分かった上で複雑すぎる気がする
0618デフォルトの名無しさん2013/03/05(火) 23:52:32.13
>>616
Callbackするフレームワーク
イベントキューを含めた話で
0619デフォルトの名無しさん2013/03/05(火) 23:56:07.89
GLUTは低水準でもフレームやキューやコールバックを使いまくってるから困る
0620デフォルトの名無しさん2013/03/05(火) 23:57:07.79
>>618
>>609 の時点で暗黙だったその前提が >>610 にちゃんと伝わってたと思ってるのか?
0621デフォルトの名無しさん2013/03/06(水) 00:12:47.20
>>620
>>それをクロージャがある言語に訊くか?馬鹿なのか?
この発言が出るくらいだから理解しているはず
0622デフォルトの名無しさん2013/03/06(水) 00:17:31.67
今日も微妙にかみあってないな、このスレ
0623デフォルトの名無しさん2013/03/06(水) 01:06:15.27
一緒にからみあおうぜ!
0624デフォルトの名無しさん2013/03/06(水) 02:26:45.23
外部APIなしでプラットフォームに付属してるモノだけでOpenGLのGLUTのメインウィンドウが表示されたときは少し感動したが
0625デフォルトの名無しさん2013/03/06(水) 06:58:07.99
>>621
それはお前の思い込みだ。

お前は会社や学校でもそうやって後足しして
仲間を苛つかせてないか?
0626デフォルトの名無しさん2013/03/06(水) 07:12:25.76
>>625
>後足しして

後出しして
0627デフォルトの名無しさん2013/03/06(水) 08:03:03.67
>>589
言うまでもないと思うが聞かれたから言うよ
"int twice"と書かれているからだよ
ほんとにそうかはtwiceのbody部を見ればよい
xがintでfがint->intなのだし他に何もないからほんとだとわかる
fがほんとにint->intかは...(同じことの繰返し)
0628デフォルトの名無しさん2013/03/06(水) 08:06:25.70
>>627
へー、じゃあコンパイラでチェックできますよね?
>>593のコードに警告かエラーを出すコンパイラ教えてください!
0629デフォルトの名無しさん2013/03/06(水) 08:19:04.13
>ほんとにそうかはtwiceのbody部を見ればよい
バーカバーカ
0630デフォルトの名無しさん2013/03/06(水) 09:07:50.97
>>628
君は>>589なのか。なのだろうな。もういいよ
0631デフォルトの名無しさん2013/03/06(水) 09:09:45.69
>>629
お前も>>589なのか
0632デフォルトの名無しさん2013/03/06(水) 09:33:07.68
>>627
副作用とは何かが全く分かってなさそう
0633デフォルトの名無しさん2013/03/06(水) 09:34:52.26
副作用とは何ですか?
0634デフォルトの名無しさん2013/03/06(水) 09:37:53.33
>>629
名言が生まれた瞬間だった
0635デフォルトの名無しさん2013/03/06(水) 09:44:26.43
100歩譲ってint twiceの副作用と渡された関数の副作用を分けて考えてるとしても、「見れば分かる」ってすごいなw
0636デフォルトの名無しさん2013/03/06(水) 09:56:04.04
いや、見てわからなきゃどうしろと?
0637デフォルトの名無しさん2013/03/06(水) 09:57:46.43
最終的には見なきゃ分からないのが問題
0638デフォルトの名無しさん2013/03/06(水) 09:59:36.88
モナドの話はどうなったのでしょうか?
IOや副作用の話ばっかりになったようなのですが。
0639デフォルトの名無しさん2013/03/06(水) 10:00:04.97
消えた
0640デフォルトの名無しさん2013/03/06(水) 10:07:09.97
>>637
見るのがコンパイラでも?
Haskellは見なくても分かるの?
0641デフォルトの名無しさん2013/03/06(水) 10:10:56.20
>>639
天使の君はどこへ行った?
0642デフォルトの名無しさん2013/03/06(水) 10:22:23.61
>>640
どのコンパイラの話をしているの?
Haskellは文法上書けないから見るまでもない
0643デフォルトの名無しさん2013/03/06(水) 10:26:49.28
>文法上書けないから
書いたらどうなるの?
0644デフォルトの名無しさん2013/03/06(水) 10:28:43.09
>>643
だから書くための文法がないんだってば
書きたくても書けない
「書いたら」なんてあり得ない
0645デフォルトの名無しさん2013/03/06(水) 10:38:20.10
書いた場合と書かなかった場合の両者を想定するのは動的型の発想
静的型は片方をあり得ないと想定し複雑度を下げようとするんだよな
0646デフォルトの名無しさん2013/03/06(水) 10:40:02.89
>>644
書けないのはコンパイラが文法の観点から 見 て いるからでしょ。
640の言うのも、単なる文法チェックでは済まないだろうけど機械が
見 れ ば分かるので、その意味では同じじゃないのと言ってるんじゃないの? 
0647デフォルトの名無しさん2013/03/06(水) 10:40:44.72
「文法上書けない」ってすごいな
どんな凄い文法なんだろう
0648デフォルトの名無しさん2013/03/06(水) 10:46:48.22
>>646
そりゃ当然どこかで副作用の無いことを保証しなくちゃいけないし、その保証のプロセスを「見る」というならそうかもしれない
でも、その保証が文法レベルで存在することって重要なことじゃない?

そして、それを「見て」くれるCコンパイラってどれのことを言ってるの?って聞いてるのに答えてくれないんだよ…
0649デフォルトの名無しさん2013/03/06(水) 10:53:36.87
若干話はそれるが、Haskellが関数に副作用がないのを保証したいのはなんでなの?
0650デフォルトの名無しさん2013/03/06(水) 10:56:47.89
副作用がないのを保証するというより、参照透明性を保証する
0651デフォルトの名無しさん2013/03/06(水) 11:02:28.68
副作用を認めると
引数や戻り値の型とは違う型のデータを、どこかに隠された変数に入れたり
例外として投げたりできるから
0652デフォルトの名無しさん2013/03/06(水) 11:12:58.29
x = yの時f x = f yが言えないと等式推論が役に立たないからプログラム運算関連の人の飯の種が減るという大変困ったことになる
0653デフォルトの名無しさん2013/03/06(水) 11:13:45.73
そりゃ大変だ
■ このスレッドは過去ログ倉庫に格納されています