C/C++>>>>(越えられない壁)>>>Haskell
2
そもそもC/C++とHaskellを同列に比較しようという時点で
>>1は池沼。
4 :
デフォルトの名無しさん:2005/09/30(金) 01:46:03
親が4様かっこいいとか言ってる(泣き
5 :
デフォルトの名無しさん:2005/09/30(金) 04:40:27
すげー直感的に意味不明。
qsort [] = []
qsort (x:xs) = qsort elts_lt_x ++ [x] ++ qsort elts_greq_x
where
elts_lt_x = [y | y <- xs, y < x]
elts_greq_x = [y | y <- xs, y >= x]
6 :
デフォルトの名無しさん:2005/09/30(金) 07:48:30
単位もらえずに逆恨みかい?プゲラ
名スレ
>>5 それが直観的に理解できないということは素養が足りない。かなりやばい。
日本語にすると理解できたりする?
qsort [] = []
qsort (x:xs) = qsort x未満の要素 ++ [x] ++ qsort x以上の要素
ここで
x未満の要素 = [y | y <- xs, y < x]
x以上の要素 = [y | y <- xs, y >= x]
クイックソート自体を知らない奴でもこれで理解できるだろうというくらい
わかりやすいと思うが。
C/C++で実装されているperl6は近年最強のベイパーウェアと化していたが、
Haskellで実装されたperl6は既に動いている。
よってHaskell>>>超えられない壁>>>C/C++
アホの言う「直感的」=「自分の知ってるものに似ている」
>>9 じゃなんでゲームプログラマーはHaskell使わずにC/C++使うの?
なんで突然「ゲームプログラマー」がでてくるんだろう。
ゲーム→ウェブブラウザ上で動くゲーム→CGI == Perl
~~~
ウェブブラウザ上で動くゲームといえば
爆裂ブロック崩し→Java
脱出系ゲーム→Flash == ActionScript
じゃないのか
っていうか、俺、Javaってほぼそのためだけにインストールしているような希ガス(w
haskellってどんな用途で使われているの?
銀行業務とかの大量バッチとかでは使わないよね。
>>16 素因数分解とか...
なんか数学者がアルゴリズムを思いついてパッと評価したいときに
使われるような言語というイメージを持っているんだけど..
>>17 スレタイ通り、数学者に特化しか言語ってことですか。
おれみたいなデジドカに縁は無さそうだ。。。
(勉強すれば世界は広がるだろうがね)
19 :
18:2005/10/01(土) 21:45:55
まぁこういうスレたてる奴はC/C++自体まともにつかえるのかね?
すこし疑問だ。
まともプログラム組めないのに中途半端に手を出してる気がする。
haskellは美しい言語だと思うが
それを"Cで実装すると予想される遅さ"程度に遅い
>>20 デジドカにとって最もすばらしいのはどんなに変に書いてもバグがでず、なおかつ理由は良く解らないが難しいという事で単価の上がる言語の事
・・・COBOLか
>>12 C/C++と比較して遅い、メモリ食いすぎだからゲームには不向きなんだろうな。
そしてなによりプログラマの絶対数が少ないのがネック。
一方でPagsの例しかり、言語処理系の実装には最強?
>>20 むしろ1はHaskellerで、この優れたマイナー言語に目をひくように
あえて煽るようなスレを立てたような希ガス
最近Haskellを学び始めたC++プログラマの俺に言わせると、
Haskellはとかく宣伝でモナドが強調されるのがネガティブキャンペーンに
なってるとしか思えん。
C++のテンプレートライブラリで入り組んでくるとconstやら参照やらが
足引っ張るのとかxxx_typeをtypedefするお約束やらがあったりとか
templateでmetaprogrammingやっちゃったりとかよりはマシな厄介さ
だと思う。
そういうC++のアドホックな仕組みの積み重ねよりはHaskellの論理的に
まとまったものの方がちゃんと相手をするには楽だし、
コンストラクタの例外安全とかC++のとかく落とし穴の多さを考えると
ずっと楽と言えるかも知れん。
>>5 [y | y <- xs, y < x]
これは、数学で言うところの
{ y | y ∈ xs で y < x }
という集合のこと。ただし集合でなくてリスト(重複OK, 順序あり)。
>>24 > xxx_typeをtypedefするお約束やらがあったりとか
お約束というかtypetraitsのcheck実行機構としてtypedefを使っている。
C/C++>>>>(越えられない壁)>>>Haskell>>>>(越えられない壁)>>> >>1
28 :
1:2005/10/12(水) 09:46:26
>>25 ごめんなさい。これで大体わかりました
なるほど、確かにわかりやすいかもしれません
[x | x^2 + x + 2, x > 20]
とかかけちゃうわけですか、こりゃすごいかも...
かけないお
30 :
デフォルトの名無しさん:2005/10/17(月) 16:38:41
>1それ以前に初耳
31 :
デフォルトの名無しさん:2005/10/22(土) 10:51:01
こういうスレが伸びるようになればHaskellも市民権を得たと言えるだろうな
ぐぐって頭のほうに出てくるやつで十分?
よく知らんからお勧めのリンクあったらはってくれ
Z = [1..]
[x^2 + x + 2 | x <- Z, x > 20]
配列のSWAPとか素晴らしい性能を持ってるお ^ ^
妖怪図鑑 其の百三十六
_,,..i'"':, 妖怪 箱ティッシュ
|\`、: i'、
\ \`_',..-i オナニーして逝きそうになると
\|_,. -┘ ティッシュが手元に無い。
タタタッ _ノ ) ノ それは妖怪箱ティッシュの仕業です。
ノ ///
_// | (_ 弱点は水に濡れると死ぬこと。
>>33 [x^2 + x + 2 | x <- [21..]]
>>33 N=[1..]
[x^2 + x + 2| x<-N, x>20]
言語処理系にしか使えない言語・゚・(ノД`)・゚・。
>>24 Haskellでもfundepsでメタプログラミングができるよ。
もちろん画面を埋めつくすエラーメッセージ付きだ。
Haskellは10年後の言語です
10年後も10年後なんだよな。
>>5 間違ってるよ
[x] と [x 以上の要素] を連結してるから
ソート後のリストに x が2つ入っちゃう
>>40 間違ってないよ xとxsに分離されてるから
x以上になってないと[1,3,1,4]をqsortしたとき要素が減ってしまう
そうだった
スマソ
44 :
デフォルトの名無しさん:2005/11/19(土) 12:28:18
45 :
デフォルトの名無しさん:2005/11/22(火) 00:44:19
手続きコード無闇に繋いでも今は無駄だよ
大抵の処理は 高階関数一つで終わりさ
関数型のIOを守るためお前は考え 便利さ見失った
手続き忘れた インターフェース<かお>など見たくはないさ
IO 取り戻せ
46 :
デフォルトの名無しさん:2005/11/22(火) 07:51:08
僕はようやくスレをageた。やれやれ。
本スレが余りに学術的で居心地が悪くなった
Haskellネタ師の溜り場はここですか?
しかし、数学者からみたら他の言語よりはマシだが、まだまだ不満はあるよな。
49 :
デフォルトの名無しさん:2005/11/23(水) 00:56:10
理論的な見地でもまだまだ。処理系の実装においても、
C,C++とはまだ吐き出されるコードに雲泥の差がある。
まだまだ中途半端な存在なんだね。
50 :
デフォルトの名無しさん:2005/11/26(土) 22:20:52
本スレが余りに過疎で居心地が悪くなった
Haskellネタ師の溜り場はここですか?
入門書がでるってはなしはどうなりましたかね?
入門書出すことに意味があるのかどうか。。
そんなに一般人に媚び売ってどうすんの?
53 :
デフォルトの名無しさん:2006/01/27(金) 19:33:12
あげ
Haskellの是非は置いといて
>>8には全く同意できない。
>>54 たしかに++とか:とかの意味を知らないと
>>8では理解しようがないけど、
Haskellを知っていてクイックソートを知らない奴がかりにいたとすると
やっぱりそいつは
>>5を見て即座にクイックソートを理解すると思う。
その意味で、
>>8が言ってることもそんなに外れてないような気がする。
関係ないが、Rubyあたりでクイックソートを書いても似たようなものになるはずなのに
なんでHaskellの特徴みたいに扱われてるんだろう…
プログラムとしては全然直感的じゃないな。
数式に近い
手続き型言語じゃないからね。
58 :
デフォルトの名無しさん:2006/01/29(日) 07:12:15
高学歴用言語ですかね
>>56 俺にはむしろ手続き型のほうが直感的に思えない
それは、抽象化された物が直感的と考えるか、具象化された物を直感的と考えるかの違いじゃないかな。
やっぱり Haskeller は、Haskell のコードからどんなアセンブラが生成されるか直ぐに分かるの?
62 :
デフォルトの名無しさん:2006/01/29(日) 11:32:42
アルゴリズム的
C に変換して gcc でコンパイルしてるけど
どんなコードになるのかわかりません(⊃д`)
64 :
デフォルトの名無しさん:2006/01/31(火) 10:05:43
もっと議論しろ
そもそも「直感的」という言葉じたいが曖昧で主観的なものだから
議論の土台としてふさわしくない。みたいな?
66 :
デフォルトの名無しさん:2006/01/31(火) 18:50:26
では話題を変えてもよいぞ
何か聞きたいことがあるなら素直に質問しろよw
68 :
デフォルトの名無しさん:2006/01/31(火) 20:16:46
取敢えず俺ははすけるの事をまるで知らないので、
このプログラミング言語の良さを自慢して俺をワクワクさせろ。
Haskellの素晴らしさは
>>68みたいな馬鹿には使いこなせないところだ。
どうだ、魅力的だろ。
ぱっと思い付くのはこんなところだな。
・高級言語の基本的な特徴を備えている。
メモリ操作はほとんど意識する必要がない。全部GC任せにできる。
そもそもGCの存在すら意識しなくてもいいくらいだ。オブジェクトは全部(参照やポインタでなく)値。
関数も値。手続きも値。
・代数的データ型
「タグつき共用体」とか「バリアント」とか呼ばれる奴だ。
これ一つでstructにもunionにもenumにもなる。萌え。
うまく言えないが、とても素晴らしい。
・美しい構文
予約語よりも記号を多用した簡潔な構文だ。とくにwhere節(
>>5にもあるように、
ローカル変数を関数本体の後で定義する機能)は手放しがたい。
・モナド
CやPascalのセミコロンを多重定義できる機構だと思ってくれ。文が実行される文脈を定義することができる。
非決定モナドを使えば複数の選択肢から一つを決定するたびに世界の方が分裂する計算を表現できるし、
継続モナドを使えばgotoすらかわいく見える邪悪な制御構造を使うことができる。
誰にも読めないソースをつくり出すには絶好の道具だ。
・強力な静的型システム
多重定義と総称性(generics)が自然に統合されたそれなりに単純な型システムがある。
特に、型推論があって、こまごまとした指定をせずとも型に頼ったプログラミングができる。
総称的な関数はそうでない関数と同じように書けるし扱える。
ワクワクしたか?したらとっとと勉強しろ。
71 :
デフォルトの名無しさん:2006/01/31(火) 21:37:53
そうだな、なかなかワクワクしてきた。
では俺様に参考書を薦めるがよい。
Haskellは今年中にマスターしてみせる
>>71 Haskell: The Craft of Function Programming
はとても良い本だが、俺はこれ以外に入門書を読んでいないので比較はできない。他には、
Introduction to Functional Programming using Haskell
あるいは、
The Haskell School of Expression
が有名なようだ。
webで学ぶなら、Yet Another Haskell Tutorialがほとんど唯一のまとまった入門書だと思う。
74 :
デフォルトの名無しさん:2006/02/01(水) 22:34:44
限量子使えるバージョンもあるよ0うだが、、、
なんか面白いことできる ∀x∀y ∃z
顔文字にしか見えない → (∀
76 :
デフォルトの名無しさん:2006/02/13(月) 20:56:42
役立ちそう、じゃなくて実際にいいか悪いか教えて欲しい。
文書はとにかくあれば何でもおーけーみたいのはちょっと。
78 :
デフォルトの名無しさん:2006/02/14(火) 03:03:11
2番目は何もわかんない状態で役立つ。
3番目は2番目が半分以上わかるぐらいで役立つ。
4番目はGHCは読めないけどもっと普通のなら読めるぐらいになったら役立つ。
1番目はモナドがわかんない時に役立つ。
スレタイに反して、良スレだな、ここは。
>>78 本当に役立つのかどうか不安なレスだな。
効用: 読んだことに満足する、だったりして。
>>77 俺は
>>76じゃないけど、正直なところ、今日本語で読める文章で
Haskellを学び始めるのに適したものはないと思う。
一ヶ月ほどで本が出ると思われるのでそれを待つか、
MLの入門文書を読んで関数型言語に慣れてから「やさしいHaskell入門」を読むのが
近道なんじゃないだろうか。
82 :
デフォルトの名無しさん:2006/02/14(火) 07:23:10
76だが、
>>81に激しく同意。俺は
>>76の2番目を半分ぐらい読んだ状態。
後はコード読んでHaskellの世界を開拓(Hack)してゆくしかないと思う。
Hackell
84 :
デフォルトの名無しさん:2006/02/14(火) 09:45:31
オライリーから
Haskell hacks
が出るのはいつの日のことですか
85 :
デフォルトの名無しさん:2006/02/15(水) 04:54:51
>>84 オライリーの中の人にもオナニーと思われてる予感
>>85 そだね。近所なんだからよく相談するようにね。
87 :
デフォルトの名無しさん:2006/03/05(日) 06:14:03
age
オライリーとオナニーって似てるよね。
89 :
デフォルトの名無しさん:2006/03/15(水) 02:08:50
オナイニー
TextSS のWindowsXP(Professional)64bit化おながいします
もしくは64bitにネイティブ対応したテキスト置換ソフトありますか?
92 :
デフォルトの名無しさん:2006/03/23(木) 17:07:28
ハスケル学んでて報われるかな?
10年以内に
言語はNEED TO KNOW
入門本の評判は?
発売ってまだだっけ?
>>92 言語を覚えているかどうかなんて些細な問題でしかない。
君が勉強すべきなのは数学だ。
さもなくば、ゲームが作りたいというならAPIやらライブラリやらの仕様書でも読んでろ。
96 :
デフォルトの名無しさん:2006/03/27(月) 17:42:46
1流の2chブラウザを作ってWindowsからamigaまで制覇するのが夢です。
まずは一流と表記することからはじめるか
言語について解説した本がほしい
あの三冊ともSICPと同じことやらされて飽きる
>>98 そんなあなたにGentle introduction to Haskell
↑まだ届いてない
102 :
デフォルトの名無しさん:2006/03/29(水) 20:13:54
Haskell製2chブラウザマダー?
103 :
デフォルトの名無しさん:2006/04/06(木) 06:05:36
Haskellの59%は真空で出来ています
Haskellの23%は鍛錬で出来ています
Haskellの8%は気の迷いで出来ています
Haskellの7%はミスリルで出来ています
Haskellの3%は成功の鍵で出来ています
成功の度合いは低い…
それ入門書だよね。ネットに分かりやすいチュートリアルあるのに本買うのはもったいなくないか?
プログラミング初めてってんならいいかも知れんけど。
わかりやすいチュートリアルってYAHTのこと?
やさし(くな)いHaskell入門かも
Gentle
紳士的なHaskell入門
そのうち萌えるHaskell入門とか出てきそうだ。
応用Haskell入門
応用は本気で欲しいな。
>>100 読みました。
一言で言うと、トイレットペーパーの方がマシでした。
まあ、理解できなかったらただの紙切れだわな
転職に有利ってことはないんだろうな。
>>5 単に名前の付けかたがまずいだけのような...
>>8 は分かりやすい。
何でこんなマイナー言語スレ同時進行してんの?
叩きネタが一瞬で尽きたのに誰も削除依頼しないから
118 :
デフォルトの名無しさん:2006/04/14(金) 16:19:39
プログラム言語界を席巻するのは時間の問題だから。
削除依頼しようと思う人がいないほどマイナーだから
どんなに凄くても研究用じゃ実用にならないよな。
いつ根本から変わるかもわからんし。
Haskellはたしかに一番美しいと思うが
どの本も最初にエレガントな解を見せておいて
実用的には別解が必要ですと来る。
その解説がものすごく手続き的。
Haskellの初心者向け本出てたな。
迷わず買ったが、むずくて即挫折です
>>123 MLあたりから始めて遠回りしてみたら?
125 :
デフォルトの名無しさん:2006/04/20(木) 21:17:08
最強を目指すならばすべからく遠回りせよ
126 :
デフォルトの名無しさん:2006/04/22(土) 08:52:33
はすけらーって延々と議論ばかりやってて一向に動くものを作らなさそう。
現場で役に立たないタイプの典型。
127 :
デフォルトの名無しさん:2006/04/22(土) 12:00:55
若林 史江さんは、19歳で株を始められたそうです。
http://www.fumie-w.com/ http://be-dream.jp/200/05/205_1.php 高校を卒業するまでの私の人生はまさに順風満帆。
そんな時、突然告げられたのが父の会社の倒産。
ようやく私も事の次第がわかってきて、暗い将来を考えると涙が止まらなくて……。
「看護大に行くのはもうあきらめよう」と泣いていると、兄がこう言ってくれたんです。
「夢だった看護師をあきらめなきゃならないのはかわいそうだと思う。
でも、どんな仕事に就こうが、その世界で成功すればいいだけだよ。
……自分が置かれている分野でトップになれた人が成功者だと思う」
と慰めてくれたんです。
救われましたね〜、この言葉で。
「よし!頑張るしかない。
妹もいるし、家にお金を入れなきゃいけないんだから働こう!」
と気持ちを切り替えることができたんです。
同じ19歳でも、人生いろいろですね。
若林 史江さんの成分解析結果 :
若林 史江さんの36%は夢で出来ています。
若林 史江さんの24%は乙女心で出来ています。
若林 史江さんの14%は毒電波で出来ています。
若林 史江さんの11%は花崗岩で出来ています。
若林 史江さんの8%は鍛錬で出来ています。
若林 史江さんの5%は根性で出来ています。
若林 史江さんの1%は真空で出来ています。
若林 史江さんの1%は株で出来ています。
そのコピペシリーズってよく見るけど、何が面白いのかサッパリ分からんのだ。
>129
コピペじゃない。
っ【成分解析 カドルコア】
へえ。
占いツール(?)なのか。
ググッたけど、激しく落とす気しねーw
132 :
デフォルトの名無しさん:2006/04/23(日) 14:00:21
芸人が腰を振りながら変なポーズで叫ぶ新手のネタか何かと思ってたよ。
テレビ見ている人は、その状況が勝手に脳内補完されるから面白い(流行っている)のかな、と。
まあ、俺はテレビ見ないからな。
あなたの生活なんてだれも聞いてません。
>>132 最近の芸人はどれもコンセプトは一緒でつまらん。
ちょうど、他人のレポートを写して書き方をちょこっと変えて提出する学生と同じ。
>>134 芸人はバラエティー番組の部品だから。
usefulな部品が同じようなインターフェイスを持つようなもの。
>>135 そういう環境に最適化しちゃったやつは環境の変化になかなかついてこれないから淘汰されるよ。ついてこれるのは変化に対応できたやつだけ。
テレビ屋も視聴者も
今の芸人に移植性なんて期待してないんだよ
それ違う
>はすけらーって延々と議論ばかりやってて一向に動くものを作らなさそう。
>現場で役に立たないタイプの典型。
会社入れば、こういうことを仰る輩の実力が痛い程味わえますね。
>>134 >最近の芸人はどれもコンセプトは一緒でつまらん。
ああ、
>>134 も成長したんだな。良かった良かった。
あと一つ教えてやる事があるとすると、
何もそれは「最近」に限ったことではない。
昔から同じ。
単に
>>134 が昔の芸人を知らなかっただけ。
芸人はどうでもいいよ
142 :
デフォルトの名無しさん:2006/04/30(日) 17:11:43
質問です。
Haskellと芸人のつながりを教えてください。
だからどうでもいいっていってんだろ。
144 :
デフォルトの名無しさん:2006/04/30(日) 17:19:26
>>143 あなたは私ですか?
私が気にしているのに、なぜどうでもいいという答えが出てくるんですか。
まじめに考えなさい。
黙れ小僧!それが人にものを訊ねる態度か!
数学的だと美しいの?主観の問題じゃ?
ククク…混沌こそが美しい
>>146 数学的つーより、定義を書き下すスタイルが美しいと思う。
149 :
デフォルトの名無しさん:2006/04/30(日) 21:20:51
シンプルな計算モデルに基づいてすべてを記述できるのが美しい
美しいの計算モデルなのさ!!!
妖星は二度と輝かぬ!
わが生涯に一片の副作用なし!
観察可能な副作用のない人生のなんと矮小なことか。
無駄がないのが美しく感じる。
表面上は副作用無いけど、
ぶっちゃけ実質的には副作用ある。
実質的にはあるものを、表面上は無いように見せかけようとしてきたのが
プログラミング言語の歴史だ。
副作用に実質も糞もないだろ。
副作用って言葉自体が言語レベルの(表面上の)概念なんだから。
haskellに副作用はありません。
副作用があるとかなんとか、馬鹿が鳴いてるだけですから無視してください。
確かに main の返す値は常に等しいが・・・。
宣言的プログラミングってやつとは全然違う?近い?
違います
164 :
デフォルトの名無しさん:2006/06/02(金) 19:25:52
諸君、議論したまえ。
>>64か?
そろそろ勉強始めろよ。和書も出たんだし。
Haskellって、アルゴリズムを書くには便利そうだけど、
それだけで完結するようなプログラムもありえないので、
ビジネスロジックだけをこれで書いて、ほかの言語から
呼び出せってモノなんでしょ?
もっといえば、ストアドみたいな。
>>166 そういう使いかたもあるけど、そのための言語と言う訳ではない。
宣伝文句は「general purpose programming language」だし、
ライブラリの整備もかなりの部分は「全部Haskellで書く」方向に向かっている。
そもそも、なんでロジック以外を書くにはHaskellは不便だと思うんだ?
168 :
167:2006/06/03(土) 19:46:36
自己レス
>そもそも、なんでロジック以外を書くにはHaskellは不便だと思うんだ?
いや、実際不便なんだが、それは主にライブラリの不備のせいであって、
言語がそっちを指向してる訳じゃないと思うがどうよ。
169 :
デフォルトの名無しさん:2006/06/03(土) 20:44:04
>168
簡単な解説ページしかみてないので今ひとつ自信はないんだけど、
I/O関係でムリを通そうとしてる雰囲気がほのかに・・・。
そんなんだったら、ほかの言語から呼び出すのにとどめたほうが、
みんな幸せになれそう。
正規表現を拡張して独立したプログラム言語にしようとしてるような、
ミョーな意固地さを感じる・・・。
Haskell.NETで何とかならんかな、その辺は。
Haskell.NETは間違いなくベーパーウェアのまま終わる
173 :
デフォルトの名無しさん:2006/06/04(日) 16:13:06
C++のメソッドに対するconstってあるでしょ。
あれは、オブジェクトの状態を変えないって意味がある(実際はちょっと違うけど)
SICPにもあるけど、副作用や参照のせいで出てくるバグ(side-effect bug)も、
結構無視できない。
私の場合だけど、
副作用がある部分と、副作用が無い部分を切り分けられないかと思い
様々な言語を探していたらHaskellとかCleanとか(*)に突き当たった。
そのように見れば、IOモナドで副作用を切り分けるのもそんなに違和感が無いんじゃないかな。
(*)研究用の(実用的でない)言語なら他にもあるみたい。
http://computing-dictionary.thefreedictionary.com/Euclid
174 :
デフォルトの名無しさん:2006/06/04(日) 18:11:25
はやくおまいら実用的なライブラリこさえてください。
GHCはOpenGL+GLUTがついてるぜ
サンプルコードぐぐってやる気なくしたけど
>>170 たぶんIOモナドの事を言ってるんだと思うが、IOをモナドで表すのは
どっちかというと言語の詳細であって、それほどプログラミングのスタイルが
影響を受ける訳じゃない。
たとえ内部が正規表現で出来ていようと、その上で普通にコードがかけるなら
問題ないんじゃないだろうか。
という訳で、別に無理をしていても良いと思うんだが、個人的には
HaskellのIOがすごく無理をしているようには感じられない。うまく言えないけど。
しかし、純粋関数的に書いていたコードに副作用を加えたい場合、
let x = ...を
x <- ...
に書き換えたり、
戻り型を a から IO a や State s a に書き換えなければならない事を思うと、
Haskellで書いたプログラムのモジュール性が低いと言えなくもない。
ただ、元々副作用無しで書こうと思っていたコードに、
副作用を加えるというのは、そもそも設計段階で間違っていたとも言える。
ここで言う副作用の例は、性能評価コードや、ロギング等のための、
呼び出しカウント、ファイル出力などを考えている。
でもこういうのは他の代替可能な手段があるかもしれない。
始めからIdモナドで書けばいい、と言ってしまえばそれまでだけど。
この辺の議論ってどっかに書いてないかな。
178 :
デフォルトの名無しさん:2006/06/12(月) 06:41:11
諸君、さらに議論を続けたまえ。
そうやって話の腰を揉むのはよせ
俺のおっぱい揉んでよ。
氏ねデブ
182 :
デフォルトの名無しさん:2006/06/12(月) 11:30:40
議論を再会したまえ。
お前ら面白すぎ
べつに面白くはないでしょ
185 :
デフォルトの名無しさん:2006/06/14(水) 21:56:33
議論を展開したまえ。
おっぱいもまれたい男はデブかどうか。
ピザには間違いない。
187 :
デフォルトの名無しさん:2006/06/17(土) 07:48:34
その議論は終了したまえ。
学者様は議論の開始・展開・終了がノンコストで行われると考えてるらしい。
実際の開発では、プログラムの開始・展開・終了の間で
作業者間でのコミュニケーションが行われ、そこのコストがもっとも大きいというのに。
じゃあトップが一人で全部設計してあとはコーディングだけすれば
ノンコストだろ。コミュニケーションにコストがかかるとか言ってる
>>188方がDQNだろ
190 :
デフォルトの名無しさん:2006/06/17(土) 14:25:09
>>189 俺にはこのボケに対するうまいツッコミが思いつかない
今北んだが、何でコミュニケーションのコストの話になったんだ?
誰が学者様なんだ?
コミュニケーションにコストがかかるのは承知だが、
なんでそれをHaskellのスレで議論する必要が?
もっとテクニカルな話しようや
俺はテクニックの話はどうでもいい。
研究的内容について議論してくれ。
研究的内容って?何を求めているの?
このスレで?w
んな高尚なもの求められても。。そういうのは大学のお友達とたっぷり議論するといいよ。
第一こんな所に降りてくるネタなんぞに新規なものなど存在しない。
何かHaskellの新しい機能を触ろう、ってんならagreeだが。
arrowってモナドと何が違うの?
やっとアローズまでたどり着いたか。遅かったね。
200 :
デフォルトの名無しさん:2006/06/19(月) 23:18:19
頭の回転の速さよりもセレンディピティの方が重要だと思う。
クソスレでまじめな議論に飢える情報弱者www
新しいものとか、テクニカルなもの、セレンディピティはおおいに結構。
Haskellの超絶技巧なテクニックだとか、こんなアプリをHaskellで書いた!とか、
こんな新しいプログラムの書き方がある!とか
そういう内容でいいんじゃないの
204 :
デフォルトの名無しさん:2006/06/24(土) 15:40:43
議論をレジュームしたまえ。
Haskell使える人ってこれからどんどん増えて行くというのに、選民もクソもないでしょ。
Haskellは流行りません。研究者の一人として断言します。
>>206 理由をぜひ聞きたかったりするんだが…。
これから勉強しようかと思ってるけど、ひょっとして無駄?
>>207 自分の「ものの考え方」のバリエーションが広がるだけでも
全く無駄ではないよ
209 :
207:2006/06/28(水) 08:35:59
>>208 あっ、いや、ある程度はもう知ってるのだけど、
Haskellは実用的にも使えるのではないかと思って
標準的な関数の使い方を全て勉強しようかという
矢先に
>>206 を見たので…。
Haskell は面白いけど、あんまり実用的ではないように見えるなあ。
それほど効率が求められないものや、
あるいはそれほど効率に影響のないプログラムなら問題ないけど、
効率上、副作用は必要悪だと思うなあ。
Haskellが遅いのは遅延評価のせいであって、副作用は関係ないだろ。
別に商用になるかどうかと流行るかどうかは関係ないでしょ。
書籍も出たことだし、Smalltalkやlisp/schemeに迫る程度には「流行る」かと。
あまり理由も示さずに間抜けな断言をするのは研究者としてどうなんだろう。
あと、副作用があれば参照が使えるので例えば再帰の代わりにforループが書ける。
Cみたいなクイックソートが書ける。副作用は、Haskell自体の遅さというより、
効率的なプログラムが書けるかどうかに掛かってくる、ということを
>>210は言いたかったんでは。
「Haskellは流行りません」って、Haskellを知らずに言ってるならただの馬鹿だし、
Haskellの利点を踏まえた上でそんなことを軽々しく断言されても…ちょっとアレな人な気がする
どこの馬の骨ともわからん(プログラミング言語の?)研究者が何と言おうと、流行るもんは流行るし。
俺も馬の骨だが、Haskell は一般向けには流行らないと思うなぁ。
そもそも流行っている事が最も重要な人は使っていないんじゃないかな。
流行らないと「思う」には同意。ただ断言できるほど物を知らないorz
>そもそも流行っている事が最も重要な人は使っていない
これの日本語的な意味がわからん。読めん。
「はやっている == もっとも じゅうようなこと」だと かんがえる ひとは つかっていないんじゃないかな。
絶対流行らない。
仕様を理解してもらえないと思う。
でもさ、むかし、Lispすげー流行ったじゃん?
>>212 forループと(効率的に)同等なものは破壊的代入を使わなくても書ける。
Haskellでも破壊的クイックソートは書ける。
リストに対しては書けないけど、これはむしろ当然だろう。
副作用があることと、代入スタイルのプログラミングができることを混同しているように見える。
「必要悪」とされるべきは代入スタイルのプログラミング。
Haskellには副作用は無いけど、代入スタイルのプログラミングをサポートしているから、
これをHaskellが遅い理由にするのはおかしい。
便乗質問で申し訳ないんですが、
100MB を超えるような巨大配列を取り扱うような
科学技術計算でも大丈夫ですか?
参照透明性ということで、配列要素を一部分変更するたび毎に
配列の全コピーし直してるのかと思っているのですが大きな誤解ですか?
どうしても副作用のあるコードを書きたくなってしまいます。
>>220 Haskellの配列は二系統あって、一つが変更毎に完全なコピーを作るIArrayインタフェースで、
もう一つがコピーなしで破壊的操作ができる代わりにモナドを通した操作しか認めないMArrayインタフェース。
だから、この点に関しては問題ない。科学技術計算をする上で他に障害が無いかは保障しかねるけど。
>>221 MArray インターフェースですか。
そういうのが有ったんですね。それで勇気が出ました。とっても重要な情報です。
多分、他には根源的な支障はないと思います。
あともう一つ高速化手法として
最近流行の並列プログラミングもしたいのですが、
こっちは Haskell ではまだまだの段階なのかな?と勝手に思っています。
>副作用があることと、代入スタイルのプログラミングができることを混同しているように見える。
IORef等への参照セルへの代入は「副作用」として知られていますが何か?
少なくとも空間効率を意識したプログラミングは副作用がないとできない。と思う。
時間効率についてはオーダーの議論で逃げればいいけど。
>絶対流行らない。
>仕様を理解してもらえないと思う。
C++のバッドノウハウ集や、Javaの複雑なgenericsを理解できるなら、
Haskellの多相型や型クラスを理解するのはそう難しくはないでしょ。
GoFのVisitorやMementoパターンが理解できるなら、高階関数を使いこなすのも特に問題ないかと。
どれも一時期流行したもの。
Haskellが凡人に理解できないと思うのは、それこそ選民意識じゃない?
>IORef等への参照セルへの代入は「副作用」として知られていますが何か?
言葉遣いの問題だが、副作用ってのは「関数適用や式の評価に際して計算以外のことを行うこと」
であって、IORefの操作はこの定義に当てはまらないので副作用とはいえないと思う。
そのためにわざわざ「代入的プログラミング」という言い方をしたんだが。
>少なくとも空間効率を意識したプログラミングは副作用がないとできない。と思う。
>時間効率についてはオーダーの議論で逃げればいいけど。
言葉の問題を除いて、同意。
IORef とかって、IORef とかを取り除く時にコピーが発生するんじゃないの?
でもまあ、Haskellで科学技術計算なんてCに比べると10倍以上遅いんで、
する気にならないですけどね。
>>227 あ〜。いいんですよ。とりあえず速度は。
最終的にどんな感じのプログラムになるか実際に見てみたいんですから。
それに計算対象や入力によって速度をそれほど気にしない場合もありますし。
C言語でカリカリにチューニングした速い実装を書いて、
Haskellでさくっとかいた実装の出力と比較して検算する (Nバージョンプログラミング)
というのはアリかもしれないね。
>言葉遣いの問題だが、副作用ってのは「関数適用や式の評価に際して計算以外のことを行うこと」 であって、
わざわざ反論するのも面倒だけど、言葉使いの話をするならば、反論させてもらう。
何度も書くが、副作用(side effect)ってのはIORefへの代入も含むと一般に考えられている。
例えばSICPで、Schemeに代入の機能を入れる所で、side effect bugという言葉が出てくるし、
何より IORefを扱うモナド IOモナドは「副作用」を扱うモナドじゃないか。
IOモナドやState使わないと代入は純粋関数的に書けないでしょ。
適当にぐぐっただけでも(Cleanのマニュアルだが)
http://sky.zero.ad.jp/〜zaa54437/programming/concepts/index3.htm#a6
>代入は、純粋な関数型言語では排除されている。というのも、代入演算子は副作用(side effect)を
>伴う為、参照透明性(referential transparency)が破壊されてしまうからである。
「狭義の副作用」という言葉があるのかどうかは知らないが、一般には代入も副作用と考えられている。
>>230 誤解を招く言い方だったが、俺が指摘したかったのはそこじゃない。
>何より IORefを扱うモナド IOモナドは「副作用」を扱うモナドじゃないか。
違う。「入出力」を「副作用なしで」扱うモナドだ。
ここで言う「入出力」にはIORefの操作なんかも含める。
なんでこの区別にこだわるかというと、
・
>>210は「Haskellに副作用が無い」という前提で話している。
だから少なくともこの文脈ではHaskellのIOを副作用と呼ぶのは不適切。
・unsafePerformIOなどによって導入される本物の副作用との区別ができたほうが良い。
という理由から。
ああ、言いたいことは分かったよ。
IOモナドは副作用を陽に扱わない。
Haskellは、副作用を表現するIOモナドを純粋関数的に「繋いで」、mainとして定義するスタイル。
繋いだアクションが逐次実行されることで、実行形式は副作用を伴うプログラムとして動作する。
一方、unsafePerformIO はIOモナドとは違い、Haskellの遅延評価のステップの途中で
本当に「副作用的に」評価される(純粋関数の枠を壊している)。
それを言いたいのは分かった。
>・
>>210は「Haskellに副作用が無い」という前提で話している。
> だから少なくともこの文脈ではHaskellのIOを副作用と呼ぶのは不適切。
どうしてその前提が読み取れるのか分からんけど。
というか明らかに IOモナドを副作用を扱うモナドでそ。unsafePerformIOと区別したいのは分かったが。
Haskellで副作用を表現できることはもはや常識なわけで、
「Haskellは副作用を(表面上)追い出した為にIOモナドというややこしい形でしか扱えない。しかし副作用は効率的なプログラムを扱う上で必要悪だよな。もっと簡単にならんのか?」
という風に読んだ。
・形式的にはHaskellのソースコードの中に副作用を伴う要素は無いものとみなせる。
・副作用をいわば「ランタイム側に追い出す」ための仕組みがIOモナド。
そういう意味でIOは副作用を扱っているといえる。
(・でも本当に副作用を持つ禁断の関数も実はある。)
ってことでFA?
状態機械の仕様をフローチャート的にではなく構成的に
定義できるのってキモチイイな
do構文使ってると普通の逐次処理言語とあまり変わらないけど。
まあ気分の問題で。
>do構文使ってると普通の逐次処理言語とあまり変わらないけど。
そう。というかlet文も考えようによっては逐次型っぽい。
for文やwhile文がなくて、オブジェクトのアップデートができない事を除けば、
手続き型言語も関数型言語もそんなに変わらない。
更にHaskellは純粋関数的なので順序を気にしなくていいんだけどね。
fib = 1:1:zipWith (+) fib (tail fib)
= 1:1:2:3:5:8:12 ....
これはおなじみHaskell版フィボナッチ数列
遅延評価の例として一度はお目にかかるという。
これはリストのある要素の値を
遅延評価を利用して
同じリストの手前の要素から構成しているのがミソ。
#解説は「フィボナッチ Haskell」 でググるといっぱいでてくるので略
で話かわってmain関数の値の話。
これって要するに最終的には
main = (IO a) >>= (IO b) >>= (IO c) >>= (IO d) ......
というふうに(IO x)を>>=でつないだ数珠繋がりに簡約されるわけで。
(IO x)中にはキー入力とか、画面出力とか、メモリの上書きとか
逐次処理言語の命令コードやサブルーチンのようなものが詰まってる。
>>232とかで言ってるアクションてやつ
ちなみに(return x)で作った(IO x)はNOP(何もしない)が入ってるとみなす。
>>236のミソは
ループや分岐に相当する(IO x)は無いってこと。
なぜそれでこまらないのかというと、
フィボナッチ数列のときに
ある要素を決定するのにそれより前の要素の値を利用したように
条件分岐で次の処理として(IO y)を繋げようか(IO z)を繋げようか決めるのに
それより前の(IO x)の値をみて決める事ができるから。
あるいはそこで打ち切ってプログラムを終了してもいい。
つまり、Haskellで副作用のあるプログラムを書くってことは
フィボナッチ数列を定義するように
コマンド列を定義しているようなもの
とまあ
そういう風にオイラは理解したわけです。
合ってると思うっす。
>>232 >どうしてその前提が読み取れるのか分からんけど。
>「Haskellは副作用を(表面上)追い出した為にIOモナドというややこしい形でしか扱えない。しかし副作用は効率的なプログラムを扱う上で必要悪だよな。もっと簡単にならんのか?」
>という風に読んだ。
そう読めるのに気付かなかった。
入出力のことを副作用と呼んでるようだが、副作用とは式の簡約の過程で入出力を行うことであって、
入出力そのもののことではないだろ。
それとも、「副作用」という言葉をそういう意味で使うことを支持する典拠があったりするのか?
多くの言語では、入出力を扱う唯一の方法が副作用なわけで、入出力と副作用を混同してもさして問題はないだろうが、
そうでない言語(たとえばHaskellやClean)の話をするときはちゃんと区別して話したほうが良いと思う。
>というか明らかに IOモナドを副作用を扱うモナドでそ。
>>231に書いたように「副作用なしで」IOを扱うためのモナド、とするのが普通だと思う。
How to declare an imperativeから引用
>This section relates the monad approach to input-output to four other widely used
>approaches: synchronised streams, as used in earlier versions of Haskell; continua-
>tions, as used in Hope; linear types, as used in Clean; and side effects, as used in
>SML.
手続き型言語の代入でも、裏で全メモリの値を渡してると考えれば副作用ではないな
>そうでない言語(たとえばHaskellやClean)の話をするときはちゃんと区別して話したほうが良いと思う。
なるほど、完全に同意しましたです。すまない。
更に How to declare an imperative の文がとてもわかりやすい。ありがとう。
入出力、といえば副作用と思っていたけど、同期ストリームもそうだよな。
自分ではhGetContentsくらいしか使わないけど。
linear typeで入出力ができるのもCleanのマニュアルの序章で分かる(world as value)。
しかし。。。continuationでどうやって入出力するのか??
>それとも、「副作用」という言葉をそういう意味で使うことを支持する典拠があったりするのか?
あなたが言うように、副作用と入出力を混同していた。典拠はない。
243 :
242:2006/07/02(日) 00:15:21
誤解を招くと悪いので少し書くと、hGetContents自体の型は Handle -> IO StringなのでIOモナド。
ただ、hGetContentsから得たStringは遅延評価の度にファイルやネットワークデバイスから読み出される。
(データがなければブロックする)
この「遅延読みString」を処理する部分は旧来のストリーム・プログラミングっぽい(よね?
C言語だと言語仕様として再帰は32回までしか保証しない(だっけ)とかだから、
再帰による33回目の関数呼び出しとそうでない呼び出しで意味が大きく変わってくる。
245 :
デフォルトの名無しさん:2006/07/06(木) 23:06:29
>>244 うそつけ。Cの仕様書にそんなこと書いてないぞ。
何かそういう類いのあった気がするよ。
for のネストの回数とか意外なものに、
最低保証回数が仕様として決められている。
つ[5.2.4 Environmental limits]
だが、再帰回数はない。
そうなのか。
>>244 少し考えれば、再帰を32回まで完全保証する事が不可能だって分かるだろ。
へ?不可能なの?スタックさえ確保しておけばいいんじゃねーの?
>>250 ローカル変数がスタックに取得される仕様だと
消費されるスタックの量が予測できないだろ。
ローカル変数と配列の最大数×配列サイズの制限?から再帰の
最大数を決めてもあまり意味があるとも思えない。
ローカル変数をスタックに取らないといけない決まりも無いけど
ほとんどの実装で受け入れられないモノを標準仕様を
するわけにはいかなかったんだろう。
ってスレ違いごめん
ローカル変数のスタック上のサイズは固定でしょ。言語にもよるけどCやC++ならそう。
そんなことも分からんやつしか居ないの?
もっと優しく言ってくれ
おれにはツンデレでお願い
し、Cの言語仕様にスタックなんて概念は規定されてないんだからねっ!
>>253 だからその固定の変数を最大いくつ宣言できるか判らないでしょ
さらにC99だとスタック上の配列のサイズは実行時に決定できる。
すれ違いなのでこの辺までにしとこう。
>>259 偉そうに大嘘で締めないように。無能はしゃしゃり出ちゃいやん。
ま、スレ違いだからやめとくか。
ここは一応 Haskell 本スレじゃないから、
少々脱線した所でどうでもいい気もするけどね。
少々なら良いけど3日も続くとね…。
面白い話でもないしw
>>260 細かいな。記憶クラスが auto の配列って言えばいいのか?
>>261 C99のマニュアル読んでね。
げ。知らなかった。
int a[hoge()];
なんてやっても動くじゃん。
いままで関数内で捨てちゃう配列にmalloc使っていたのは無駄だったのか。
HaskellとRubyばっかり使っていたせいで、Cはメモリ管理がめんどくさい言語
だとばかり思っててちゃんと調べてなかった。
C99 じゃないと無理だけどな。
Cは99なのにHaskellはまだ98なのかー
>>264 しかしそう言い直した途端にスタックの話じゃなくなる罠。
いつまでもひきずってもつまらんので、Haskellの豆知識でも。
GHCでコンパイルされたプログラムがスタックをどのように使うかはわかりにくい。
再帰呼び出しでスタックが深くなっているようにも見えないのにオーバーフローを起こしたりする。
これは、スタックの消費が、呼び出しの深さではなく正格な関数の適用のネストの深さに比例するためだ。
例えばg x = x + 1 - 1 + 1 - ..たくさん.. - 1という関数を定義すると、呼び出しの深さは一であるにも関わらず
スタックを大量に消費する。正格な関数である(+)と(-)の適用が深くネストされているからである。
スタックが足りなくなったら適当に評価を行って遅延してるのを減らすとか
できないの?
>>264 嘘を拡大するためだけに前言撤回で復活しなくてよろしい。
>>269 未評価の式はヒープに保存されているので、それ自身はスタックを消費しない。
スタックが溢れるのは式を評価しようとしたとき。
>>271 スタックあふれた時はヒープ上にスタックを移動して計算したりできないの?
>>272 なんで俺らがそこまでしなきゃいけないわけ?お前何か勘違いしてない?
スタックが溢れそうなのにヒープに余裕があるなどと思ってる素人はモノ喋んな。
・・・
頭が良くない人ほどすぐ怒る
>274は50年前の世界からやってきた時空の旅人
>>277 ♪ぼくらは たびびと
ときの たびびと♪
Haskellは、お利口さんに見られたいけど誰もそう見てくれない
哀れな人たちの嫉妬を一身に買って出てるよね。
嫉妬というか、そういう奴らがすがるための言語。
知的な奴は、そういうことを考えずに自己拡張しまくりのLispを使う。
281 :
デフォルトの名無しさん:2006/07/18(火) 13:14:51
諸君議論しているかね?
282 :
デフォルトの名無しさん:2006/07/19(水) 01:50:46
Haskell 面白そうなので調べていたら、Clean にたどり着いた。
両方とも、ちょっとしか解ってないが、現時点ではClean の方が良さげに思える。
でも、一般的にはHaskell の方が流行ってるみたい…。
なぜなんでしょう?
Haskell の方が良い!という人の意見が聞きたいです。
ま、素人はそう考えるわな。
285 :
デフォルトの名無しさん:2006/07/19(水) 03:58:51
286 :
デフォルトの名無しさん:2006/07/19(水) 05:09:41
みなさんやっぱり頭がいいんですね。
>>285 数学オリンピックでは中国とか凄いんだけどねえ。
なぜか欧米の方が偉大な数学者は多いよね。
インドだってラマヌジャンっていう大天才がいたし。
288 :
デフォルトの名無しさん:2006/07/19(水) 10:28:12
だって数学オリンピックって数時間で処理できるような、簡単な問題を
いかに処理しきるかっていう官僚的作業だろ?
それでも俺には逆立しても解けないが。
ノーベル賞フィールズ賞取る様な何年もかけて倒す仕事とはスケールが違い過ぎるから
1kmレースを3速ギアでトップで駆け抜けたからといって
そのマシンが300kmレースを6・7速ギアでトップでゴールできるわけじゃない。
>> 284
非素人の見解披露希望。
290 :
282:2006/07/20(木) 02:58:24
>>283 英語、苦手でして…。
単語を拾い読みしてみましたが、Haskell は研究用で Clean は実用言語という所でしょうか?
>>284 ぜひ、具体的意見をお聞かせ下さい。
Cleanは実行速度速いよ
メモリも食わない
Haskellは遅い
292 :
デフォルトの名無しさん:2006/07/21(金) 00:42:59
Cleanで
echo 'main = readFile "b.txt" >>= putStr . show . (\x->x*x*x) . read'> c.hs && echo 4 > b.txt && runghc.exe c.hs
これと同じことやってみ。
293 :
デフォルトの名無しさん:2006/07/21(金) 09:36:40
>>288 は、数学オリンピックについて何も知らない。
294 :
デフォルトの名無しさん:2006/07/21(金) 09:39:46
Microsoftが開発中の新しいシェル「Windows PowerShell」は、RC1版以前は
「Microsoft Command Shell(開発コード名:Monad)」という名称が付けられていた。
英語が苦手だとHaskellやCleanの新しい機能をすぐに使えないので楽しさ半減だろうと思う。
nobsunみたいに和訳してくれる人は普通とても少ないし。
296 :
282:2006/07/22(土) 03:36:21
>>292 なる程、Haskell の利点としては
@スクリプト言語的な使い方ができる
AIOモナドだと簡潔に書ける
といった所でしょうか。
@の使い方は面白いかもしれませんね。
Aはどうなんでしょう?
エラー処理とかを考慮したプログラムも簡潔に書けるのでしょうか?
297 :
282:2006/07/22(土) 03:38:17
>>295 今の所、基本的な事を覚えるだけで、アップアップですw
Haskell
関数型言語のスタンダードという役割を担うために作られた言語。
だから、関わっている人が多いし、ライブラリも多い。
Clean
関わっている人が少なく、ライブラリも少ない。
異端であるがゆえに、最新の話題がCleanから出てくることはほとんどない。
という違いもある。
勉強目的ならHaskellだな。
Haskellといえばモナドだけど、Cleanでも同じようなロジックで書ける。
両者の違いは構文糖衣的な違いで、中身は似たようなもの。
Cleanで書くと、たらい回す変数を山のように書いて、文字数が2倍ぐらいになる。
Haskellはプログラムが美しい、Cleanは実行速度が速い、と言える。
299 :
デフォルトの名無しさん:2006/07/23(日) 00:13:15
もっと最適化しろよハスクル
300 :
デフォルトの名無しさん:2006/07/23(日) 00:15:44
カレー食いたくなった
コンパイル時間をもっと短くしろよハスクル
あらいぐまハスクル
303 :
282:2006/07/23(日) 02:53:12
>>298 なるほど…。
なぜ、Haskell の方が一般的なのか、解ったような気がします。
ありがとうございました。
ヒアドキュメント無いんだったらクソ認定
確かに欠陥だ。
次版で入らんかな。
306 :
デフォルトの名無しさん:2006/07/31(月) 18:40:18
自己記述してるからコンパイラが低速なんだろ?
307 :
デフォルトの名無しさん:2006/08/02(水) 17:42:50
諸君議論したまえ
308 :
デフォルトの名無しさん:2006/08/03(木) 20:24:15
諸君怠けてはいないか?
309 :
デフォルトの名無しさん:2006/08/04(金) 16:48:43
諸君夏休みかね
> 最後にこの連載のタイトルの由来を紹介しておきましょう。
> 「本物のプログラマはHaskellを使う」というタイトルは
> 「本物のプログラマはFORTRANを使う」や「本物のプログラマはPascalを使わない」
> といった有名なフレーズをもじったものです。
って書いてあるじゃんか。自分が知らない読んでない理解できないからって
不当に他人を卑しめるのは止めような。
そういうもじりが安直だって言ってんじゃないの?
そんなに悪いとは思わないけどな…
「本物のプログラマはHaskellを使わない」のほうがしっくりくると言われればそうかもしれないが。
「本物のプログラマはPascalを使わない」で語られる本物は、
決してHaskellなどという"軟弱な"言語なぞ使わんと思うんだが?
310のリンク先の情報処理学会のページ、おもろいな
まだ少ししか読めてないけど
この人のサイトが痛いのは本人の趣味嗜好の問題だから放っておくとして、
一昔前のgauche-devel-jpでのshiroタンとのやりとりを見る限りコンピュータの
アーキテクチャの根本が理解できていない人としか思えなかったんだが。
まぁHaskellと戯れているうちはデータがメモリ上でどう表現されているかなんて
知らなくても生きていけるってことかな。
ハードに近いことは良くわかってないけど何となくプログラミングできている、ってのは文系出プログラマの得意技。
Haskellの美しさにあてられら未熟な若者だ。
優しく見守ってやれ。
>>317 似た名前だと思っていたら、あれと同一人物なのかよ……。
同一人物、なんだろうねぇ…。
偶然一致するようなハンドル名なのかどうか判断できないから確証はないけど。
未踏にも顔出してたと思ったけど、どんな成果だったのかな。
323 :
デフォルトの名無しさん:2006/08/10(木) 09:03:14
だれかヒアドキュメントの機能をcommitしてきてください。
324 :
デフォルトの名無しさん:2006/08/10(木) 18:39:34
グラスゴウスケールって医療用語であるけど
グラスゴウハスケルと似てるね
>>324 うわぁっ、すごぉっ、すげぇー!って、日常用語にあるけど、
グラスゴウスケールと似てるね。
326 :
デフォルトの名無しさん:2006/08/11(金) 07:51:06
ということは
うわぁっ、すごぉっ、すげぇー!
と
グラスゴウハスケルは似てるわけか
問1
「うわぁっ、すごぉっ、すげぇー!」を使って
長文を作りなさい
それを見て、あるいは、変なものだ。うわぁっ、すごぉっ、すげぇー!
むやが及ん、すべてが、と思った。うわぁっ、すごぉっ、すげぇー!
不要なら、それが、それを出してきたところでもないのなのだ。うわぁっ、すごぉっ、すげぇー!
まだ比べできて、この本にもある。うわぁっ、すごぉっ、すげぇー!
すでに、人を手をするのを出している、バカな気が、この本のせいと、一歩だと思うんだ。うわぁっ、すごぉっ、すげぇー!
0001200-ROM人は、もう一つの問題になるので、ついにこれには、ホントには、下の時代にはその時のせいをつくるなものを読んでいるのも、それはそれを92020202/1創作連中所持とかの時代にもある。うわぁっ、すごぉっ、すげぇー!
あるいは物語もあった。うわぁっ、すごぉっ、すげぇー!
なお、その号のこともずっとさておきけれど、感じ。うわぁっ、すごぉっ、すげぇー!
プロットをすると、という感じ。うわぁっ、すごぉっ、すげぇー!
で、すでにシャープに、ほとんど無節操ないのかな。うわぁっ、すごぉっ、すげぇー!
短距離では、その戦時のお解釈年前の大解決冷や汗指標はほとんど開かかとかを手をもらった芸ばかり。うわぁっ、すごぉっ、すげぇー!
ちょwww
解読できたらごほうびをあげるわ
332 :
デフォルトの名無しさん:2006/08/19(土) 05:42:40
諸君そろそろ議論に戻りたまえ。
|┃三 _________
|┃ /
|┃ ≡ _、_ < 話は全部聞かせて貰ったぞ!
____.|ミ\___( <_,` ) _ \
|┃=___ \  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
|┃ ≡ ) 人 \ ガラッ
入門Haskellの1章目で既に挫折しそうなわけだが。
やはり、アホな俺にはjavaが似合ってるのかもしれん。
>>334 一章からわりと技巧的なことをやっているので無理もないと思う。
とにかく慣れが重要なので、サンプルコードをコピペしていじりながら
慣れるのが良いんじゃないか。
意味の分からないところは2chで聞けばいいし。
>>335 アドバイスありがと。
とにかく触りながら地道にやってみるか。
ふつけるのほうが
入門書としては
出来がいいようなキガスルな
だまれカス
カスケル
>>341 すげー
Haskoreってやつを使っているのかな。
>>341 最後の別のムービー紹介で
リーリ・カル・マジーロがトップに来てるのにワロタw
>> 341,342,343
いまサウンドボードがイカれてて何がおもしろいのかサーッパリわからなかったんで
何を紹介しているムービーなのか解説してもらえないでせうか。
>>345 音楽のリズムパート(って正しい表現?)を記述したHaskellのコードがあって、それがBGMとして流れている。
コードを編集してロードしなおすとそれに連動して音楽も変わる。
よく考えればMMLとあんまりは変わらないとも言えるけど…
348 :
345:2006/09/05(火) 01:10:24
>> 346
遅ればせながらサンクス。週末にでもサウンドボード調達してこよ。
349 :
345:2006/09/14(木) 00:06:08
音付きで拝見しました。あまりよく知らないんだけどあんなのもHaskellが標準で
持ってる範囲内での記述なんですか?Lisp屋さんだとそれ専用のミニ言語平気で
作っちゃったりしてるけど似たようなものなのかな。
328はpseudo-yamagata
このスレにはイスラエルの工作員が紛れ込んでると聞きましたが。
オッス オラ モサド
祖国がやべえ状態だってのに
なんだかすっげえワクワクしてきたぞ!
syntax sugar
cons :: a -> [a] -> [a]
cons a b = a : b
諸君、議論したまえ。(プヒョゲラ)
闇夜に仕事人の目がギロンギロン
359 :
デフォルトの名無しさん:2006/10/21(土) 02:35:42
ありがとーおー ぼくのー とーもだちー
ハスカァール にー あわせてー くぅー れー ぇーてぇー
360 :
デフォルトの名無しさん:2006/10/21(土) 18:26:29
良スレage
なにこの流れw
次スレこれでいこうぜ
【Haskell】あらいぐまハスケル【関数型言語】
363 :
デフォルトの名無しさん:2006/10/24(火) 00:08:44
この言語は何で人気なの?
別に大して人気はないと思う。
単に話題になることが多いだけじゃないかと。
ネタにし易いからかな。
module Qsort where
qsort _ [] = []
qsort f (x:xs) = before ++ (x : after)
where before = qsort f $ filter (not . (f x)) xs
after = qsort f $ filter (f x) xs
moduleってなによ
whereってなによ
module Qsort where
ってのは、これからQsortという名前のモジュールを定義する、
詳細は以下である、と言う意味。(whereは「ただし」とでも読むべし)
モジュールというのは、おおざっぱに言うと、
一つのファイル中で定義されたものたちをひとまとめにして名前をつけたもの。
この場合はQsortモジュールはただ一個の定義(qsort)だけからなる。
プログラムの他の部分からqsortを使いたいときは、
import Qsort
として、Qsortモジュールの定義を使うことを宣言する。
モジュール・・・機能単位、交換可能な構成部分という意味の英単語(e-wordより)
なるほど。Javaでいうところのクラスみたいな感じか
import文もJavaといっしょだな
モジュール ≒ Javaのパッケージ
定義 ≒ Javaのクラス
関数 = Javaのメソッド
ここで疑問点が発生
下のような2行だけ書いたファイルでもOKのはずだけど
これはなんで module とか where とか 定義名 がいらないの?
foo x y = x + y
hoge = 2
>>369 >これはなんで module とか where とか 定義名 がいらないの?
module ... whereの部分は省略することができて、その場合
module Main(main) where
と書かれているとみなされる。
(main)という括弧書きは、モジュール中の定義のうち、mainだけを外部に公開する、
という意味。括弧書きがないときは、全ての定義が公開される。
デフォルトではprivate(不可視)にしてるということか
次2行目
qsort _ [] = []
これは qsort が 定義名 でいいのかな
_(アンダースコア) は 変数名っぽいけどそんなわけないよな
そして、 [ ] (配列) = [ ] (配列)
???
わからない
>>371 []は空リスト。
_は厳密には変数名じゃないけど、そう考えても大して問題はない。
この行では、_がqsortの第一引数、[]が第二引数になっている。
qsort _ [] = []
は、qsortの第二引数が空リストのとき、第一引数に関係なく、結果は空リストである、と読む。
ここで定義しようとしているqsortは、第一引数として比較関数、第二引数としてリストを取り、
ソートされたリストを返す関数だから、この行は、「空リストをどんな比較関数を使ってソートしても結果は空リスト」と
言っていることになる。
比較関数っていうのがよくわかんない
Webで探したらこんな文章発見
>でも比較関数って何?って思いますよね。
>比較関数とは2つの引数を持ち、
>引数1が引数2より小さい場合は負の整数、
>同じ場合は0、
>引数1が引数2より大きい場合は正の整数を返します。
うーん・・・
_ (アンダースコア)がどういう役割なのかな、この場合 _(アンダースコア)以外はダメ?
例えば -(ハイフン)とか、ふつうのアルファベットとか
>>373 >比較関数っていうのがよくわかんない
ここでは、引数を二つとって、第一引数が第二引数より「小さい」ときのみTrue、
そうでなければFalseを返す関数の事。
普通の意味での大小関係にしたがってTrue/Falseを返す関数を比較関数として与えれば
qsortは昇順のソートをするし、逆に数値が大きいほど「小さい」と判断する
関数を与えればqsortは降順のソートをする。さらに、例えば引数の絶対値を比べる関数を
渡せば、絶対値が小さい順にソートすることができる。
> _ (アンダースコア)がどういう役割なのかな、この場合 _(アンダースコア)以外はダメ?
仮引数の名前なので、アルファベットからなる名前を好きにつけても良い。
qsort comparer [] = []
とか。ハイフンは演算子とみなされるのでだめ。
お札もえいないのか
お礼を期待して2chで書くのは不毛な行為だとオモタ。
>>375 「お札萌え居ないのか」?
巫女萌えならここに居るが何か。
昨日はねちゃってたよ
サンクス
また明日とかよろ
おれい?
∩___∩
| ノ|||,,.ノ ヽ、,,ヽ
/ ● ● | このスレは俺がもらうクマ
| ( _●_) ミ 以後、「AAでHaskellのお勉強」クマ
彡、 ,、、|∪| ,,,ノ
/ . ヽノ ヽ
| _r'゚lニニニl]_ ____/l
fニニニニllニニ| \[ l===ニニl]}||||||||ll]}コl|====iニコ
|l_,,=-'''~ | \... ヽ'''ニ「_,,,l⌒l。__。_]三i三三iF
| 〈,,/ヽ___)|ll [`ー'
∩∩ ; とりあえずHelloWorld書いてみるクマ
;|ノ||` ┬-‖
__,/●●| __ | | ‖
| ; |`(_●)/ ミ . Y ‖
| .彡|∪||、 , .| | ‖
/:~ ̄ ̄ ̄ ̄:/.| | ‖
,|:::::. .......::/>> / ‖
/.::::: .. ...::::::|'(/\_/ ‖
../:.::: .. :.:::/.:/ /‖\
/.:::. ....:::..:::/.:/
' ̄ ̄ ̄ ̄ ̄ _/
|_| ̄ ̄ ̄ ̄|_|
main = putStrLn "Hello, World!"
∩___∩
| ノ ヽ
/ ● ● | こうですか!?わかりません!
| ( _●_) ミ
彡、 |∪| 、`\
/ __ ヽノ /´> )
(___) / (_/
| /
| /\ \
| / ) )
∪ ( \
\_)
できてんじゃねーかよ!
.,. -──-、 __
/. : : : : : : : : :\ 〈〈〈〈 ヽ
/.┛┗: : : : : : : : : :ヽ 〈⊃ ノ
. !.::┓┏,-…-…-ミ: ::', | | ∩___∩
{::: : : : :i '⌒' '⌒'i: : ::}ノ ! | ノ --‐' 、_\
{:: : : : : | ェェ ェェ |: : :} / 、 / ,_;:;:;ノ、 ● |
. { : : : : :| ,. |:: :;! / , ,,・_ | ( _●_) ミ
. ヾ: : :: :i r‐-ニ-┐| ::ノ/ , ’,∴ ・ ¨彡、 |∪| ミ
ゞイ! ヽ 二゙ノイゞ 、・∵ ’ / ヽノ ̄ヽ
/ _ ` ー一'´ ̄/ / /\ 〉
(___) / / /
,..-──- 、
/. : : : : : : : : : \ Haskellはmainアクションからはじまるようになっている
/.: : : : : : : : : : : : : : ヽ
.,!::: : : :,-…-…-ミ: : : : :', 決まりごとだから深く考えちゃダメさ
{:: : : : :i '⌒' '⌒' i: : : : :}
{:: : : : | ェェ ェェ |: : : : :} そうそう、Haskellは大文字と小文字を区別するよ
. { : : : :| ,.、 |:: : : :;!
.ヾ: :: :i r‐-ニ-┐ | : : :ノ MainでもMAINでもない、mainじゃないといけない
ゞイ! ヽ 二゙ノ イゞ‐′
,.、-  ̄/ 入.` ー一'´ |` ┬-、 クマくん わかるかい?
/ ヽ. / ト-` 、ノ- | l l ヽ.
/ ∨ l |! | `> | i
/ |`二^> l. | | <__,| |
_| |.|-< \ i / ,イ____!/ \
.| {.| ` - 、 ,.---ァ^! | | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄l
__{ ___|└―ー/  ̄´ |ヽ |___ノ____________|
}/ -= ヽ__ - 'ヽ -‐ ,r'゙ l |
__f゙// ̄ ̄ _ -' |_____ ,. -  ̄ \____|
| | -  ̄ / | _ | ̄ ̄ ̄ ̄ / \  ̄|
___`\ __ / _l - ̄ l___ / , / ヽi___.|
 ̄ ̄ ̄ | _ 二 =〒  ̄ } ̄ / l | ! ̄ ̄|
_______l -ヾ ̄ l/ l| |___|
_ /- イ、_
簡単クマ __ /: : : : : : : : : : : (
〈〈〈〈 ヽ /: : : : ::;:;: ;: ;:;: ; : : : ::ゝ
〈⊃ } {:: : : :ノ --‐' 、_\: : ::}
∩___∩ | | {:: : :ノ ,_;:;:;ノ、 ェェ ヾ: :::}
| ノ ヽ ! ! 、 l: :ノ /二―-、 |: ::ノ
/ ● ● | / ,,・_ | //  ̄7/ /::ノ
| ( _●_) ミ/ , ’,∴ ・ ¨ 〉(_二─-┘{/
彡、 |∪| / 、・∵ ’ /、//|  ̄ ̄ヽ
/ __ ヽノ / / // |//\ 〉
(___) / / // /\ /
_ /- イ、_
∩___∩ あぁたたたたたたたたたたたた /: : : : : : : : : : : (
| ノ ヽ /: : : : ::;:;: ;: ;:;: ; : : : ::ゝ
/ ● | r‐っ'つ _,rノ´) {:: : : :ノ --‐' 、_\: : ::}
| ( _●) ーニ三、_,Eノ‐_r' {:: : :ノ ,_;:;:;ノ、 ェェ ヾ: :::}
彡、 |∪|| r'´)  ̄-一ーt_j'´ 、 l: :ノ /二―-、 |: ::ノ
ゝ ヽノ _三 'ー'´) _,∩ ,,・_ | //  ̄7/ /::ノ
/ ー-−ニ ̄‐ヽ  ̄,_)' 一(´,__) `! , ’,∴ ・ ¨ 〉(_二─-┘{/
一 - ―゙ゝ_,.) ニ(__,.)-''l-‐、・∵ ’ /、//|  ̄ ̄ヽ
一‐--(_) ノ` / // |//\ 〉
(__)' / // /\ /
putStrLnってなんだクマ?
関数名だボケ!!
,..||-ノ─ソ彡〈〈〈〈 ヽ
&. : : : : : : : : : ミ〈⊃ }
ミ.: : : : : : : : : : : : : : | |
,!::: : : :,-…-…-ミ: : : :| | ∩___∩
三 : : : :i ;;;/:' '⌒' i: : : | | | ノ --‐' 、_\
.{:: : : : |:::+;;; ェェ .|: : : : ニ ! ,,・,_ / ,_;:;:;ノ、 ● |
{ : : : :|ヾ ,.、 |:: : : :; ! / ’,∴ ・ ¨ | ( _●_) ミ
/ ヾ: :: :i r‐- ┃┐.| : : :ノ/、・∵ ’ 彡、 |∪| ミ
/ __ゞイ!ヽ┃ニ゙ノ イゞ‐ / ヽノ ̄ヽ
(___) /`' / /\ 〉
.,..-──- 、
r '´. : : : : : : : : : :ヽ
/.: : : : : : : : : : : : : :: ヽ
,!::: : : : : ,-…-…-ミ:: : :',
{:: : : : : :i ,;ノ;´:`ゞ、i: : :.:} もともと用意されてんだよ〜っ!!
{:: : : : : :| ェェ;;;;;;;ェェ|: : : }
{ : : : : ::| ,.、 .| : : :;!∫
ヾ: :: : :i r‐-ニ┐| : riii=
ゞイ! ヽ 二゙ノ イ「 ノ
(⌒ ー ̄ ̄´ r⌒ ! 〉
ヽ弋パラッパッパ` ー'
〔勿\ ヽ ベキ
) r⌒丶) ベキ
ドカ ドカ / ! |' ∩__∩ ボキ
ドカ / /| l| ノ --‐' 、_\
( く ! ~l / ,_;:;:;ノ、 ●|
ドカ \ i | ‖彡 ( _●_) ミ
,__> ヽヽ从/ 彡 、 |∪| ミ
⊂ _ ⌒ヽ从 ⊃ ヽノ ̄⊃
;;;;;;;;;;;;;;;;;;;;;(::::::::::::::::::::::::::::::: ,...ヾ ;;\:: ::l;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;/
;;;;;;;;;;;;;;;;;;;;;;;;;ー-..::::ミミミ、ヾ ( );;) ヾ;;ヽ、 :i;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;://
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;=-゙-`:::::::ミミ\ ゙゚''" i::ヽ;;i :: |;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:l /
;;;;;;;;;;;;;;;;;;;;;;;/::::::: :::::::.ミ::.'ヽ.........::::::::.、'_ノ l;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:i /
;;;;;;;;;;;;;;;;;,ノ:::::::::::. :::.` , 二;ニ= 、 ノ;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:ノ /
;;;;;;ー-'',::::::::::::::: ::: ' ,rェ ヽ` ヽ /;:;:;:;:;:;:;:;:;:;:;:;:;:// /
;;;;;;;;;;;;/":::::::::: _i ヽ゚ ン i` /;:;:;:;:;:;:;:;:;:;:;:;:;:ノ / /
ー' ̄::::::::::::::::: ____ /:;:;:ヽ ー /;:;:;:;:;:;:;:;:;:;:;:;:;:// / /
:::/::::::::::::::::::::: /;:;:;;:;:;:;:;:;:;:;:;:;:ヽ、 :;ー:ノミ; ::. /;:;:;:;:;:;:;:ー" ̄ / / / /
:/:::::::::::::::::::::::: /;:;:;/:::::::::::\ \;ヽ/ ̄ : /;:;:;:;:;/"/ / / / / /
:::::::::::::::;;:::::::::::: |:;:;:;:;:l ̄\:::::::::::\ );:ヽ /;:;:;:;:;:;l/ / / |\/\/ヽ∧
::::::::::::::::::;;;::::::::. \:;:;ヽ ヽ:::::::::::::'/;:;:/ /;:;:;:;:;:;:丿/ / _/ ハ あ
::::::::::::::::::::;;;;:::::: \;:;\ |:::::::/;/ /;:;:;:.:_,- " / /\ ス ら
::::::::::::::::::::::;;;;;;::: 、. \;:;\ l::/;/ / ̄/ / / / ケ い
:::::::::::::::::::::::::;;;;;;;;../ ̄ ー\ ;:;:;:/ // / / /< ル ぐ
::::::::::::::::::::::::::::;;/ ゙''ー 、_ / / / / / / !!! ま
_ /- イ、_
, /: : : : : : : : : : : (
意味わからんわw ゚ + ` /: : : : ::;:;: ;: ;:;: ; : : : ::ゝ
’, ’,∴ ・ ¨ {:: : : : : : ::;:;: ;: ;:;: ;: ::}
∩___∩ ii ’,∴ ェェ ( : : : ::;:;: ;: ;:;: ; : ::::}
| : : ;: ヽ ! | | ! ,・,, (_l__\(: ::;:;: ;ヽ: ; : ::ノ
/ : : ;: |く^⌒!|| , ,,・_(_ヽ;:;:)ヽ: ::;:;: ;:; ::ノ
| : : ::;:ミ ::;:| ! ∴ ・ ¨C〉 (_二:;: ;::;:/
彡、 : : ::;:/⌒ ノ||!、 ’ ・∵ (、//|  ̄ヽ
/ / : : ::;:/!! / // |//\ 〉
(_/ : : ::;:/'' ̄ / // /
バカ専用 普通 ハッカー ウィザード
┝ - - - - ┿━━━┿━━━┥
∩___∩ /)
| ノ ヽ ( i )))
/ ● ● | / /
| ( _●_) |ノ / 今はここら辺クマーー!!
彡、 |∪| ,/
/ ヽノ /
∩─ー、
/ ● 、_ `ヽ
/ ( ● ● |つ
| /(入__ノ ミ そろそろモナドでもはじめるか・・・
、 (_/ ノ
\___ノ゙
/ 丶' ⌒ヽ:::
/ ヽ / /:::
/ /へ ヘ/ /:::
/ \ ヾミ /|:::
(__/| \___ノ/:::
/ /:::
/ y ):::
/ / /:::
/ /::::
/ /:::::
( く::::::::
|\ ヽ:::::
| .|\ \ :::::
\ .| .i::: \ ⌒i::
\ | /:::: ヽ 〈::
\ | i:::::: (__ノ:
__ノ ):::::
(_,,/\
まだはえーーよ!
.,..-──- 、
r '´. : : : : : : : : : :ヽ
/.: : : : : : : : : : : : : :: ヽ
,!::: : : : : ,-…-…-ミ:: : :',.. _
{:: : : : : :i ,;ノ;´:`ゞ、i: : :.:} / / _____
{:: : : : : :| ェェ;;;;;;;ェェ|: : : } ./ / /// \\ ./\ ∩___∩
{ : : : : ::| ,.、 .| : : :;!./ \  ̄  ̄/./ | ノ --‐' 、_\
ヾ: :: : :i r‐-ニ┐| : r / /"\.> .__/./ / ,_;:;:ノ、 ● |
ゞイ! ヽ 二゙ノ イ /__/ <__/ | ( _●_) ミ
/⌒ `ー―''´ヽ \_ ~\彡、 |∪| ミ
/ | // \_/ ヽノ  ̄\
( く"| _____|____,,___ /  ̄Z、 /,,,,,,,, /ヽ >
\ ヽノ _|||||_____.爪_|―――゚'ヽ > ;;;'''''';;;';';; / <_/
r' ̄\_ 三〉)) ̄ ||||`ー' `-、ゝ ̄ ;;''' ∴。・、
)__/. ̄ ̄ |||| \ '':;:;,,,;;;'''`・゚。;;
-― ̄ ̄ ` ―-- _
, ´ , ~  ̄、"ー 、
_/ / ,r _ ヽ ノ
, ´ / / ● i"
,/ ,| / / _i⌒ l| i |
と,-‐ ´ ̄ / / (⊂ ● j'__ |
(´__ 、 / /  ̄!,__,u● | モナドって言っただけで撃つことないじゃん
 ̄ ̄`ヾ_ し u l| i /ヽ、 ちょっと調子にのっただけなのに・・・
,_ \ ノ(`'__ノ
(__  ̄~" __ , --‐一~⊂ ⊃_
 ̄ ̄ ̄ ⊂ ̄ __⊃
⊂_____⊃
|
|.-──-、
| : : : : : : : : \
|: : : : : : : : : : : ヽ 次の問題は length関数だ
|-…-…-ミ: : : : :',
| '⌒' '⌒' i: : : : :} length [1, 2, 3, 4, 5, 6, 7]
| ェェ ェェ |: : : : :} length ["abc", "AAA", "クマ"]
| ,.、 |:: : : :;! length [ ""]
| r‐-ニ-┐| : : :ノ length "ヌケドナルド"
|! ヽ 二゙ノ イゞ‐′ length "kuma"
| ` ー一'´丿 \
| \___/ /`丶、
| /~ト、 / l \
,..-──- 、
/. : : : : : : : : : \
/.: : : : : : : : : : : : : : ヽ length関数は要素の数を返す!
,!::: : : :,-…-…-ミ: : : : :', 関数の右にあるのが引数だ
{:: : : : :i '⌒' '⌒' i: : : : :} どんな値でも長さを調べられるぜ
{:: : : : | ェェ ェェ | : : : : :} さぁ答えろ! 間違えたら殺す!!
{ : : : :| ,.、 .| :: : : :;!
_∧ ヾ: :: :i r‐-ニ-┐ | : : :ノ ∧
( \ ゞイ! ヽ 二゙ノ イゞ‐ ′ //~⌒ヽ
|( ● )| i\ _,,ノ| ` ー一'´//\ /i |( ● )|
\_ノ ^i | _,,..r''''" ノ | \`', / / / ̄`''ー | i^ ゝ_ノ
|_|,-''iつl/´ ヽノ| /\ / 、│ l⊂i''-,|_|
[__|_|/〉ヽ、 / |/ );;;;/\/ 'く /〈\|_|__]
[ニニ〉 ', ヽ. | /⌒| / ゚/ / 〈二二]
└―' '─┘
∩─ー、
/ ● 、_ `ヽ
/ ( ● ● |つ
| /(入__ノ ミ 上から・・・
、 (_/ ノ
\___ノ゙ 7
/ 丶' ⌒ヽ::: 7
/ ヽ / /::: 0
/ /へ ヘ/ /::: 1
/ \ ヾミ /|::: 1
(__/| \___ノ/:::
/ /:::
/ y ):::
/ / /:::
/ /::::
/ /:::::
( く::::::::
|\ ヽ:::::
| .|\ \ :::::
\ .| .i::: \ ⌒i::
\ | /:::: ヽ 〈::
\ | i:::::: (__ノ:
__ノ ):::::
(_,,/\
ちげーーよ!!
.,..-──- 、
r '´. : : : : : : : : : :ヽ
/.: : : : : : : : : : : : : :: ヽ
,!::: : : : : ,-…-…-ミ:: : :',.. _
{:: : : : : :i ,;ノ;´:`ゞ、i: : :.:} / / _____
{:: : : : : :| ェェ;;;;;;;ェェ|: : : } ./ / /// \\ ./\ ∩___∩
{ : : : : ::| ,.、 .| : : :;!./ \  ̄  ̄/./ | ノ --‐' 、_\
ヾ: :: : :i r‐-ニ┐| : r / /"\.> .__/./ / ,_;:;:ノ、 ● |
ゞイ! ヽ 二゙ノ イ /__/ <__/ | ( _●_) ミ
/⌒ `ー―''´ヽ \_ ~\彡、 |∪| ミ
/ | // \_/ ヽノ  ̄\
( く"| _____|____,,___ /  ̄Z、 /,,,,,,,, /ヽ >
\ ヽノ _|||||_____.爪_|―――゚'ヽ > ;;;'''''';;;';';; / <_/
r' ̄\_ 三〉)) ̄ ||||`ー' `-、ゝ ̄ ;;''' ∴。・、
)__/. ̄ ̄ |||| \ '':;:;,,,;;;'''`・゚。;;
/. : : : : : : : : : \
/.: : : : : : : : : : : : : : ヽ
そんなバカなクマ ,!::: : : :,-…-…-ミ: : : : :',
{:: : : : :i'⌒' '⌒' i: : : : :}
∩___∩ {:: : : : | ェェ ェェ |: : : : :}
| ノ --‐' 、_\: : : :| ,.、 |:: : : :;!
/ ,_;:;:;ノ、 ●ヾ: :: :i r‐-ニ-┐ | : : :ノ 上の3つは
| ( _●_) ミゞイ! ヽ二゙ノ イゞ‐′ リスト(配列)だから正解!!
彡、 |∪| ミ ⌒゛ /⌒ヽ\
/⌒ ヽノ`''/ ⌒ ー--、' ,/`/
/ /~〔_彡.ミ⌒ヽー,==-、 ヽ_,zn' /
| | / `^,/  ̄,ノ ヽ、__^ノ /
彡ノ | /⌒ヽ i⌒ ー 、 ヽ
ヽ l人 | .) ` . |ー┐
\ `⌒ | ノヽ、_ ノ.ヽ」
/. : : : : : : : : : \
/.: : : : : : : : : : : : : : ヽ
,!::: : : :,-…-…-ミ: : : : :',
{:: : : : :i '⌒' '⌒' i: : : : :}
{:: : : : | ェェ ェェ |: : : : :} でも下の2つは
{ : : : :| ,.、 |:: : : :;! ただの文字列!
ヾ: :: :i r‐-ニ-┐| : : :ノ
,,,! ヽ二゙ノ イゞ‐′ こういう場合は文字数を
ひっかけクマ・・・ /  ̄⌒ヽ 数えるんだろーがぁぁ!!
| lヽ、 | __
∩___∩ L__| |_. `ヽ
| ノ --‐' 、_\ lヽ‐'〉 .|
/ ,_;:;:;ノ、 ●ヾ _ \/ .|
| ( _●_) ミ ー-`\ \,,ノギリギリ
彡、 |∪| ミ. `ヽ )
彡 ヽノ/ ,// /
,、__
/ヽ ``ヽ
// ̄' ̄ ̄ヽ.\
`i |,_, ,_,、 i .>
ト|,:ニ/ヽ二|'ー!イ. やはり所詮はクマ
| ̄,.レ,..、 )7
! ''===i /'. ヌケドを殺るのはワシしかおらんな
ヽ `! !' ,//\_
_,―イ>`'´‐< / \_
_/ _/ /`―「_!―'./ / `―::、
_/ |i | ///' / !_ \
._∧ノ | i i' ! | | / ・'/ i' イi
/ \| | | | | | / _∧=i | /|
|( ● )| i\| i | | | レ'/ \| |
\_ノ ^i || ヽ | フ |( ● )| i\| ノ
|_|,-''iつl| \/ /\_ノ ^i | ,‐、」 !|
[ニニ〉| / / |_|,-''iつl \\\|
└―'./ / / [__|_|/〉 ) ヽ ! |
\_/ // [ニニ〉// ! | 」
| | └―'V | |_,,..::‐''´
,..-──- 、
/. : : : : : : : : : \
/.: : : : : : : : : : : : : : ヽ
__,、 ≡ ,!::: : : :,-…-…-ミ: : : : :', バカめ
〃ニ;;::`lヽ,,_ ≡ {:: : : : :i '⌒' '⌒' i: : : : :} ジジイの命もこれまでだ
〈 (lll!! テ-;;;;゙fn __,,--、_ .. {:: : : : | ェェ ェェ |: : : : :} ≡
/ヽ-〃;;;;;;;llllll7,,__/" \三=ー"{ : : : :| ,.、 |:: : : :;! ≡
>、/:::/<;;;lllメ \ヾ、 ヽTf=ヽ` : :: :i r‐-ニ-┐ | : : :ノ
j,, ヾて)r=- | ヾ: :ヽ;;: | l | l ゞイ! ヽ 二゙ノ イゞ‐′ ≡
,イ ヽ二)l(_,>" l| ::\;:: | | | ヽ,,` ー一'/ V
i、ヽ--イll"/ ,, ,//,, :;; l // l く> /::l"'i::lll1-=:::: ̄\
ヾ==:"::^::;;:::/;;;;;;;;;:::::::::::::: :::::ゞ ノ/ L/〈:::t_イ::/ll|─-== ヾ
\__::::::::/::::::::::::_;;;;;;;;;;;;;;;;;ノノ ヘ >(゙ )l:::l-┴ヾ、ヽ )
 ̄~~ ̄ ̄/ :::|T==--::::: // / ト=-|:|-─ ( l /
/ :: ::l l::::::::::::::::::/ /:::::::::::/:::::(ヽ--─ / | /
ヽ_=--"⌒ ゙゙̄ヾ:/ /:::::::/:::::::::`<==-- ノ / /
/ / \/::::::::::::::::::::::::::::: ̄'''"":://
/ / :::: ヾ::::::::::::::::::::::::::::べ__;;;--"
__ ,、
/'' /ヽ.
/ /' ̄ ̄ ̄ ヽヽ/ ̄)
<. i ,_, ,_,|. i' | くニ} {fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj
ト,!ー|二/'ヽニ:,|イ. |
( ,..J,、 ̄|| | バカモン! 遅延評価の威力を見せてくれるわ!
.'ヽ i==='' ! |
ヽ, `! !'/ |
くニ} {fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj
/ ,へ  ̄ ̄`ヽ
/ / \ t──┐ |
(__/ > ). | |_
/ / (___)
( \
\__)
__ ,、
/'' /ヽ.
/ /' ̄ ̄ ̄ ヽヽ/ ̄)
くニ} {f<. i ,_,({fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj
ト,!ー|二/'ヽニ:,|イ. |
( ,..J,、 ̄|| | ・・・・・・
.'ヽ i==='' ! |
ヽ, `! !'/ |
くニ} {fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj
/ ,へ  ̄ ̄`ヽ
/ / \ t──┐ |
(__/ > ). | |_
/ / (___)
( \
\__)
バカ専用 普通 ハッカー ウィザード
┝ - - - - ┿━━━┿━━━┥
∩___∩ /)
| ノ ヽ ( i )))
/ ● ● | / /
| ( _●_) |ノ / まだここら辺クマーー!!
彡、 |∪| ,/
/ ヽノ /
>>396,397,399
length [""]
は、空文字列をひとつ含む配列なんだから
1
だよ。
// | | ,イ
// l | //
// ∩___∩ / ||ノノ_/ /
/'" | ノ ヽ / /
/ ,/./ ● ● | / ;/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
,. ‐'" |:| ( _●_) ミ / ,< 間違えてんじゃねーかよ!!
, ィ'" |:::彡 |∪| / , ' \___________
,.イ |:::::::L ヽノ,,,,ノ .//´ ̄ ̄`ヽ \
//i| ,.|::::::レ! /:::::/ // \ ( ̄`ヽ、 \
./:::::{ |ヽ |ヽ∠.|::::::| メ:::::::; '_/// /`''"⌒i ,.....,_ \、 `ヽ、\
`''" `'''`ー-|'" ,':::::::|':::::::; ' / / ヾ-┤ |'´,. --.、`丶、\ `\
ノ {::::::/:::::::/__ノ ∠/ / _ /- イ、_ ヽ ヽ
/ ノ/⌒ヽ::::} / /: : : : : : : : : : : (' ,ノ,ハ ガッ
< {ム/ }/ ∠/ /: : : : ::;:;: ;: ;:;: ; : : : ::ゝ | ヽ
`ヽ、 'ー'-'‐'′ / {:: : :ノ ,_;:;:;ノ、 ェェ ヾ: :::} !`'ー─ゝ、 _
ヽ / l: :ノ /二―-、 |: ::ノ / _ `丶..ノF'!
ヽ-‐''" ̄``ヽ | //  ̄7/ /::ノ ̄ヽ ̄ `i丶、__,.ノ
ヾ(_二─-┘{/ ヽ、_ }ヽ、
 ̄ ̄ ``'"ー-
length ["abc", "AAA", "クマ"] は 7 じゃなくて 3 だろ!
| | | |
_ /- イ、_ |_|_|_|_
バカ野郎! /: : : : : : : : : : : ( / 〉〉〉〉 カスが!
l⌒)OOo /: : : : ::;:;: ;: ;:;: ; : : : ::ゝ { ⊂〉
∩___∩ { ) ) {:: : : :ノ --‐' 、_\: : ::} | | ∩___∩
| ノ ヽ | ::::::/ {:: : :ノ ,_;:;:;ノ ////ヾ: :::} l l / ヽ |
/ ● ● | / ::::| 、 l: :ノ /二―-、 |: ::ノ ヽ | ● ● ヽ
| ( _●_) ミ/ ) ,,・_ | //  ̄7/ /::ノ .・,,; \彡 (_●_ ) |
彡、 |∪| / / ̄, ’,∴ ・ ¨ 〉(_二─-┘{/ ∴ ;・, ; \ |∪| ミ
/ __ ヽノ / / 、・∵ ’ /、//|  ̄ ̄ヽ 、;:,・ ヽ. ヽノ___ ヽ
(___) / / / // |//\ 〉 ヽ (_____)
うるせーばか!
__ /- イ、_
∩___∩ / 〉〉〉〉 /: : : : : : : : : : : (
/_ノ `ー- ゝ\ 、 { ⊂〉/: : : : ::;:;: ;: ;:;: ; : : : ::ゝ〈〈〈〈 ヽ ∩___∩
| ● ゝ:;;;:;:_, ヽ , ,・_ | {:: : : :ノ --‐' 、_\: : ::}〈⊃ } | ノ --‐' 、_\
彡 (_●_ ) '' |, ’ ,∴ l {:: : :ノ ,_;:;:;ノ、 ェェ ヾ: :::} | | 、 / ,_;;;:;ノ、 ● |
彡、 |∪| ミ、・∵ ’ ヽ l: :ノ /二―-、 |: ::ノ ! ,,・_ | ( _●_) ミ
γ ̄ ヽノ ヽ) \ | //  ̄7/ /::ノ / , ’,∴ ・¨彡、 |∪| ミ
〈 /i i \ 〉(_二─-┘{/ / 、・∵ ’ / ヽノ ̄ヽ
ノ ノ ヽ 、//|  ̄ /´ / /\ 〉
>>395 【問題】
length [1, 2, 3, 4, 5, 6, 7]
length ["abc", "AAA", "クマ"]
length [ ""]
length "ヌケドナルド"
length "kuma"
【答え】
7
3
1
6
4 ∩___∩
| ノ ヽ
/ ● ● | クマクマ
| ( _●_) ミ
彡、 |∪| 、`\
/ __ ヽノ /´> )
(___)f^f^f^f^f^f^f^f^f^-┐
| |~ ~ ~ ~ ~ ~ ~ ~ ~ │
| | 配列は要素数 │
| / | 文字列は文字数|
| / | 正直すまんクマ |
∪ |_____________|
\_)
. ┌────────────────────┐
つ | 文字列 = 文字のリスト │
. | "kuma" .→ ['k', 'u', 'm', 'a'] |
. | "ヌケドナルド" → ['ヌ', 'ケ', 'ド', 'ナ', 'ル', 'ド'] .|
. └────────────────────┘
つ [] == ""
正確には
[] :: [Char] だな
Ctrl-Dを押すまで結果が出力されないんだが・・・。
mapMを使ってるせいだろうか。
main = do cs <- getContents
r <- mapM hoge $ lines cs
putStr $ head r
hoge :: String -> IO String
hoge x = return x
>>413 その通り。
csの終端を見つけるまでmapM_が終わらないから、
putStrが実行されることもない。
415 :
414:2006/12/03(日) 21:27:23
ごめん。mapM_じゃなくてmapMね。
416 :
413:2006/12/03(日) 23:45:53
>>414,415
なるほど。ありがとう。
一行入力するごとに結果を返してほしいのだが、いい方法はないのかな。
mapMはsequence . mapらしいので、いろいろ組み合わせて書き直してみた。
main = do cs <- getContents
mapM_ (putStr . unlines =<<) $ map sequence $ map (:[]) $ map hoge $ lines cs
hoge :: String -> IO String
hoge x = return x
こうすれば望みの結果が得られるようなのだが、ちょっとめんどくさすぎるな・・・(・∀・;)
>>416 IOは上から順に実行されるのが原則(getContentsは例外)で、
評価と違って「値の要求があって初めて」実行したりはしない。
だから
r <- mapM hoge $ lines cs
とあったら、rが必要とされるか否かにかかわらずmapMは最後まで実行される。
これは、そうでないと動作の順序を予測するのが難しくなって不便だからだ。
どうしてもその挙動が必要なら、unsafeInterleaveIOという関数を使えば実現できる。
ちなみにそのコードは行ごとにputStrしているだけで、
mapM_ putStrLn $ lines cs
と書いているのとかわらない。
何がしたいかをもう少し詳しく教えてくれたら、もうちょっとまともな助言ができると思う。
418 :
413:2006/12/04(月) 01:51:46
>>417 >評価と違って「値の要求があって初めて」実行したりはしない。
>だから
>r <- mapM hoge $ lines cs
>とあったら、rが必要とされるか否かにかかわらずmapMは最後まで実行される。
あぁ、なるほど。なんでうまくいかなかったのか、やっとすっきりした。
結果が必要かどうか関係ないのね・・・。
自分が作りたかったのは、ハッシュテーブルに入力されたものを入れて、そのときのハッシュテーブルの中身を返すという関数。
↓こんな感じなのを作ったのだが、入力が終わらないと処理が先に進まなくて困ってる次第。
import Data.HashTable as HashTable
main = do cs <- getContents
hash <- new (==) hashString
r <- mapM (hoge hash) $ lines cs
putStr $ unlines r
hoge :: (HashTable String Int) -> String -> IO String
hoge _ [] = return []
hoge hash key = do insert hash key 1
h <- toList hash
return $ show h
>>418 それと同じことをするだけなら、mapMでハッシュ表の操作と同時に出力もすれば良い。
mapM_ (\line -> hoge hash line >>= putStrLn) $ line cs
元のコードのように、値を生成する部分(mapM hoge)と利用する部分(putStrLn)をプログラム上で分離したい場合は
多少の工夫がいる。例えば、入出力をしながらa型の値を生み出すジェネレータを次のように定義して、
newtype Generator a = Gen (IO (Maybe (a, Generator a)))
mapMで[String]を生み出す代わりにGenerator Stringとして記述するとか。
ただし、標準のリストと違って操作関数が用意されていないので面倒ではある。
420 :
413:2006/12/04(月) 14:08:07
>>419 そうか、なるほど、mapM_の中で完結させれば良かったのか・・・。
mapMの返り値を受け取って処理しないといけない、って思いこんでた。
なんて頭が固いんだ、俺はorz
ジェネレータを使って云々かんぬんってのはまだ理解できないので、もっと勉強してみるよ。
ほんとにありがと!
417を読むまで、doの中に列挙されているものは上から下へ遅延評価されるものだと思ってたorz
getContentsは例外なのね・・・。GHCのソースを見たらunsafeInterleaveIOを使ってたよ。
本スレを見たあとこっちに来るとなんかほっとする
んじゃ、そろそろ圏論勉強会をここではじめるか
AAで頼むわ
AAじゃなくてもたのむわ
この間友達に訊かれて、Haskell使いでないけど興味持った。
2ちゃんっぽい解説をわくてかしながら待ってますよ
おまいら、なんで本スレに行かないんだよw
だって本スレ2chのノリじゃねーんだもん
あそこは2chじゃねーよなw
あそこはプログラミングする気が無い奴らに犯されてしまった
今からここが本スレになります
早く家に帰ってHaskellを犯りたい(*´д`)
>どこか解説ページないかな。
なさそう。
>top-level bindings
モジュールレベルの束縛のこと。
module Foo where
f x = let y = x + 1 in y * 2
なら、fはトップレベルの束縛で、yはそうではない。
>unlifted types
unboxed typesとほとんど同義だと思う。
というか本スレに書けyo
見てみたら
>>433のリンク先にlifted typeの説明あるじゃん。
>Primitive types are always unlifted; that is, a value of a primitive type cannot be bottom.
436 :
433:2006/12/11(月) 21:43:56
>>434 詳しい説明をありがとう。
>>top-level bindings
>モジュールレベルの束縛のこと。
さんくす!さっきのエラーは出なくなった!
今度は#がはずせないという問題にぶち当たったけど、こっちはI#の存在に気づいて解決した。
>というか本スレに書けyo
あっちは圏論の話題が中心だから、初歩的なことは書きづらくて・・・。
>>435 >見てみたら
>>433のリンク先にlifted typeの説明あるじゃん。
すまん。読んでたけどそっちも全く意味わからんかった。
>>436 >すまん。読んでたけどそっちも全く意味わからんかった。
ボトムっていうのは、停止しない/エラーになる計算の結果を表す概念上の値のこと。
(この辺厳密じゃないかも。間違ってたら分かってる人が突っ込んでくれることを期待)
例えば
b :: Int
b = b
と定義したとする。bを評価しようとすると止まらないから、bにはふつうの意味での値はない。しかし、
f :: Int -> Int
f x = 4
という関数があったとして、f bは4を返す。つまりfは問題なく呼ばれている。
では呼ばれたときの引数は何か、というのが問題になるが、これを「fはボトムを引数にして呼ばれた」
ということにする。つまり、bは評価しても止まらないけど、ボトムという仮想的な値を持っていることにする。
こうすると議論が単純になる。ちなみに、こう考えると、BoolにはTrue、False、ボトムの三値があることに
なるし、32ビットマシン上のGHCではIntに2^32+1個の値があることになる。
一方、実装を考えると、fに渡されるのは未評価のbで、これの実体はクロージャ、
あるいは関数ポインタ。bを評価することは、この関数ポインタを呼び出すことに相当する。
この場合はbを評価しようとすると止まらないわけだけど、こういう挙動がありえるためにはそもそも
bが関数ポインタでなきゃならない。
unboxed typeはただの計算器上の整数で、関数ポインタを隠し持つ余地はない。
Int#は厳密に2^32個の値しかとれない。つまり、ボトムになれない。よってunlifted type。
>あっちは圏論の話題が中心だから、初歩的なことは書きづらくて・・・。
たまたま圏論の話題で盛り上がっていただけで、気にすることはないと思う。
もともとそういうスレじゃないし。むしろ俺にも分かる話題は歓迎w
haskellはプログラムを書く以外にも楽しみ方がある言語だから、棲み分けが起きてもいいんじゃないかな。次スレはちゃんとしたタイトルにしようぜ
たとえ住みわけが必要だとしても、板の趣旨からして、
本スレはプログラムの話題、
理論的な話は情報学板、のほうがいいんじゃないだろうか。
モナドから値を取り出す関数ってないんでしょうか?
hoge :: m a -> a
みたいな.
>>440 個々のモナドごとにある。
head :: [a] -> a
fromJust :: Maybe a -> a
fromMaybe :: a -> Maybe a -> a
evalState :: State s a -> s -> a
runST :: (forall s. ST s a) -> a
unsafePerformIO :: IO a -> a -- 副作用があるので取扱い注意
ちなみにIOモナドだけは値を取り出す必要がない。
取り出さずに全部まとめてそれにmainを束縛すれば良いので。
計算の途中でIOがつくと、その後ずっとついて回るからなんか気持ち悪い
>>443 それによって参照透明性を保ってるんじゃないの?
詳しい人教えて!
インストールに7時間かかりました。なにこの敷居の高さ
>>4457時間もあきらめずにインストールした喪前が大好きだよ!
敷居が高いけど、なれてくるとかなり楽しい。
ひょっとして、haskellはツンデレ美少女なんではなかろうか。
haskell「ごめんね素直じゃなくて」
俺「いや、しょうがないって」
haskell「・・・。お兄ちゃん、IOモナドの仕組みが知りたい、って言ってたよね」
俺「ん? まーな」
haskell「でも、そのためには私の中身を見ないとだめだよね・・・」
俺「い、いや、無理しなくていいよ」
haskell「・・・。見てもいいよ」
俺「え?」
haskell「見てもいいよ! お兄ちゃんだったらいいよ!」
↓Haskell Brooks Curryの肖像
今日はUnsafe IOの日だから中に出しちゃだめー!!!
>>443 データ構造書くのはIOを入れずにやれという暗黙のメッセージだと思う
プログラムのしくみ本体とIOの部分を分けるということ
その方が実際動作が速いみたいだし
もう、中に出すからforkIOしちゃったじゃないo(*`ε´*)o
HashTableがIOを返すのがにんともかんとも・・・。
本スレは活気があっていいなぁ・・・
また俺がAA書いてやろうか?
haskell中級者になったクマきぼん
>>456 俺が初心者な以上、それは無理ってもんだ
今でも遅延ストリーム萌な人いませんか?
みなさんハスケルのどこが萌えですか。
僕は似たような記号を多用するその文体のとっつきにくさに萌えです。
俺はモナドという不思議な雰囲気を持ったツンデレ美少女なところに萌えてる。
haskellたんを知ってから仕事に全く集中できなくなってしまったよ・・・
あの、質問しても良いです?
「ふつうのHaskellプログラミング」からなんですが、
length [""] -> 1
length [] -> 0
の""というのは文字が一文字も無い文字列を表しているのでしょうか?
もう一つ。
a
b
c
みたいに一行ずつ保存されているファイルは、エディタからはそうみえるだけで
実際には"a\nb\nc\c"みたいに保存されているのでしょうか?
そうじゃないとlines関数でリストに出来ないですもんね?
>の""というのは文字が一文字も無い文字列を表しているのでしょうか?
その通り。
>実際には"a\nb\nc\c"みたいに保存されているのでしょうか?
その通り。
こういう関数をHaskellで書くとしたら
どう書くのがベターでしょうか?
# Rubyですが
def hoge(ary)
ary.each_index do |i|
j = rand(i+1)
ary[i], ary[j] = ary[j], ary[i]
end
end
>>465 こんな感じになった。やたらと面倒だったので改善案募集。
{-# OPTIONS_GHC -fglawgow-exts #-}
module Test where
import System.Random
import Data.Array.IArray
import Data.Array.ST
import Control.Monad.ST
hoge :: forall a i e. (IArray a e, Ix i, Random i) => a i e -> StdGen -> (a i e, StdGen)
hoge ia gi = runST act
where
act :: forall s. ST s (a i e, StdGen)
act = do
ma <- thaw ia
let _ = ma :: STArray s i e
g' <- shuffle ma gi first
ra <- unsafeFreeze ma
return (ra, g')
(first, last) = bounds ia
shuffle a g i = case ran of
[] -> return g
_:next:_ -> do
let (j, g') = randomR (i, last) g
x <- readArray a i
y <- readArray a j
writeArray a i y
writeArray a j x
shuffle a g' next
where
ran = range (i, last)
467 :
466:2007/01/11(木) 23:19:28
まちがってた。
{-# OPTIONS_GHC -fglasgow-exts #-}
module Test where
import System.Random
import Data.Array.IArray
import Data.Array.ST
import Control.Monad.ST
hoge :: forall a i e. (IArray a e, Ix i, Random i) => a i e -> StdGen -> (a i e, StdGen)
hoge ia gi = runST act
where
act :: forall s. ST s (a i e, StdGen)
act = do
ma <- thaw ia
let _ = ma :: STArray s i e
g' <- shuffle ma gi (range bo)
ra <- unsafeFreeze ma
return (ra, g')
bo@(_, last) = bounds ia
shuffle a g [] = return g
shuffle a g (i:is) = do
let (j, g') = randomR (i, last) g
x <- readArray a i
y <- readArray a j
writeArray a i y
writeArray a j x
shuffle a g' is
>>465 >>467の人のようにこういう操作はArrayの方が得意だけど無理矢理やってみた
手抜きして右からまわしてる
import Random
-- main = print [1,2,3] >> hogeIO [1,2,3] >>= print
hogeIO :: [a] -> IO [a]
hogeIO xs = getStdRandom (hoge xs)
hoge :: (RandomGen g) => [a] -> g -> ([a], g)
hoge xs g = foldr iter ([],g) xs
where
iter x (xs,g) = (x':xs', g')
where
((x', _:xs'), g') = replaceR x (x:xs) g
replaceR :: (RandomGen g) => a -> [a] -> g -> ((a, [a]), g)
replaceR x xs g = (replace i x xs, g')
where
(i,g') = randomR (0, length xs - 1) g
replace :: Int -> a -> [a] -> (a,[a])
replace n x xs = (z, ys ++ x:zs)
where
(ys, z:zs) = splitAt n xs
469 :
468:2007/01/13(土) 21:04:49
Stateで書き換えてみたけど相変わらず長い (replaceやmainの定義は同じ)
import Control.Monad.State
type Rand a = State StdGen a
hogeIO :: [a] -> IO [a]
hogeIO xs = do
g <- newStdGen
return $ evalState (hoge xs) g
hoge :: [a] -> Rand [a]
hoge xs = foldr ((=<<).iter) (return []) xs
where
iter x xs = do
(x', _:xs') <- replaceR x (x:xs)
return (x':xs')
replaceR :: a -> [a] -> Rand (a,[a])
replaceR x xs = do
i <- State $ randomR (0, length xs - 1)
return $ replace i x xs
runSTとかunsafeFreezeとかさっぱりわからん。
なんかくやしい。
471 :
デフォルトの名無しさん:2007/02/14(水) 00:17:05
良スレ 保守
472 :
380:2007/02/14(水) 23:30:00
【第一部】 AAでHaskellのお勉強(超初心者用)
>>380-410 【第二部】 AAで圏論のお勉強(入門編)
Coming soon!
,j;;;;;j,. ---一、 ` ―--‐、_ l;;;;;;
{;;;;;;ゝ T辷iフ i f'辷jァ !i;;;;;
ヾ;;;ハ ノ .::!lリ;;r゙ 圏論は難しい・・・
`Z;i 〈.,_..,. ノ;;;;;;;;>
,;ぇハ、 、_,.ー-、_',. ,f゙: Y;;f そんなふうに考えていた時期が
~''戈ヽ `二´ r'´:::. `! 俺にもありました
/ .\
/ .\
\ / \ /
\ ___________ . /
\ ./ \ /
| \/ \/...|
| | | |
| | | |
.._ |_| |_|_..
| | さあ‥ 逝こうか‥‥ | |
| | | |
| | | |
| | | |
| |/ ..\| |
| | | |
.._|/| _ _ _ _ _ _ _ _ ...|\|_
/ ..| | _−_−_−_−_− _ | | \
| |/_/━ ━ ━ ━ ━ ━\_\| |
.._| /_/━ ━ ━ ━ ━ ━ ━ \_\.|_
/_/━ ━ ━ ━ ━ ━ ━ \_\
/ /━ ━ ━ ━ ━ ━ ━\ \
∩___∩
| ノ ヽ
/ ● ● | たった一つの命を捨てて
|◎) ̄  ̄|| ̄ ̄ ) ミ 生まれ変わった不死身の体
彡、___||_/`\ 鉄の圏論を叩いて砕く
/ __ /´> ) クマーンがやらねば誰がやる
(___) / (_/
| /
| /\ \
| / ) )
∪ ( \
\_)
_i^i__i^i_ i^i ._i^i_ __, -―- 、___
|*||*| ∩___∩ i^i _i^i_ | | |@ll|(_/,,,, ,,,, ヽ_)
|≡||≡|| ノ ヽ ([])|;□;|.(≡)|_| |● ● | どうすれば圏論をわかりやすく
. 二二/ ● |二二( (二二二二 彡(_●_ ) ミ 説明できますかね?
| ミ ) ) / ` ''∪'' / ヽ
彡、 _ノ Gノ'フ= ___ / /i ` ー '" iヽ |
/ ヽ / / | ! / / | | | .l. i
..──|ヽ ヽ/─==i─Y-(_ノ──i二i───(⌒)
___ヽ /ヽノ └-┘ ┴ ..└┘ . ̄
| ___ i
∩___∩
|ノ⌒ ⌒ ヽ
/ ●) ●) |
Let's | ( _●_) ミ Haskell♪
彡、 |∪| 、`
/ ヽノ ヽ
/ 人 \\ 彡
⊂´_/ ) ヽ__`⊃
/ 人 (
(_ノ (_)
A B
∩___∩ /)
| ノ ヽ ( i )))
/ ● ● | / /
| ( _●_) |ノ /
彡、 |∪| ,/
/ ヽノ /´ ここにオブジェクトAとオブジェクトBがあるクマ
A → B
∩___∩
| ノ ヽ
/ > < | じつはAさんはBさんを好きなんだクマ
| //// ( _●_) ミ
彡、 l⌒l ノ
/ __ \ \ヽ
. (___) \__)
∩___∩
| ノ ヽ
/ ● ● | と、いうように
| ( _●_) ミ ある対象とある対象がなんらかの関係をもっていることを
彡、 |∪| 、`\ 圏論では「射」と言うクマ
/ __ ヽノ /´> )
(___) / (_/
| /
| /\ \
| / ) )
∪ ( \
\_)
∩___∩
| ノ ヽ A → B
/ ● ● |
| ( _●_) ミ この場合、Aさんを「ドメイン」、Bさんを「コドメイン」と言うクマ
彡、 |∪| 、`\
∩___∩
| ノ _, ,_ ヽ
/ ● ● | 別にBさんを好きじゃなくてもいいんだクマ
| ( _●_) ミ Bさんを嫌いでもいいし
彡、 |∪| ノ BさんはAさんの嫁でもいいし
⊂⌒ヽ / ヽノ ヽ /⌒つ AさんがBさんをレイ-プする、という関係でもなんでもいいクマ
\ ヽ / ヽ /
\_,,ノ |、_ノ
∩___∩
| ノ ヽ
/ ● ● | A → B
| ( _●_) ミ ココ!!
彡、 |∪| 、`\
/ __ ヽノ /´> ) この図では「→」がAさんとBさんの関係を表してるクマ
(___) / (_/ 関係というものには方向性が付き物なんだクマ
| /
| /\ \ この「関係を表した矢印」こそが「射」クマー!
| / ) )
∪ ( \
\_)
てらわかりやす
まだまだ続クマ?
\  ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ (´´
\(⌒-⌒) o (´⌒(´
(・(ェ,,)・ )つ⌒`つ≡≡≡(´⌒;;;≡≡≡
 ̄ ̄ (´⌒(´⌒;;
ズザーーーーーッ
/ ̄)
∩____∩. | | AさんからBさんへの「射」は1つとは限らないクマー!
| ノ ヽ.| |
/ ● ● || | くニ} {fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj「好き好き射」
| ( _●_) .ミ |
彡、. |∪| |
くニ} {fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj{fj「エロエロ射」」
/ ,へ  ̄ ̄`ヽ
/ / \ t──┐ |
(__/ > ). | |_
/ / (___)
( \
\__)
、 l _,
ヽ/⌒ヘ~
., 't,_,ノ丶 ∩、 ∩
/ ! '` | '──-' '\
,/ ● 'i,
/ ( _●_) ● i,
彡 しノ ミ あたまをやわらか〜くするクマ〜
|`:、\ 'ii __,/
'i、 ̄~~ ij 乙__ノi
^-ァ __,ノ
r^~"i' 'l
!、 ! l
~^''!, ,_ ,!_
\ l,~^''‐--::,,⊃ ) ) ) )
`'‐’
X Y Z
∩___∩ /)
| ノ ヽ ( i )))
/ ● ● | / /
| ( _●_) |ノ /
彡、 |∪| ,/
/ ヽノ /´ ここにオブジェクトXとオブジェクトYとオブジェクトZがあるクマ
∩____∩
/ ヽ X → Y YさんはXさんのいとこクマ
/ ● ● | Y → Z ZさんとYさんのいとこクマ
| ( _●_ ) ミ
彡、,, |∪| /
/__ ヽノ l\
(___u) (uニ ).
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
|:::::::::::::::::::::::::::::::
|" ̄ ゙゙̄`∩::::::::::::::::
|,ノ ヽ, ヽ::::::::::::::::::::::::: X → Y
|● ● i'゙ ゙゙゙̄`''、::::::::::::::::
| (_●_) ミノ ヽ ヾつ:::::::::: ↓
| ヽノ ノ● ● i::::::::::
{ヽ,__ )´(_●_) `,ミ::::::: Z
| ヽ / ヽノ ,ノ::::::
あれ?XさんとZさんは・・・いとこ?
∩─ー、
/ ● 、_ `ヽ
/ ( ● ● |つ
| /(入__ノ ミ 所詮、XとZが
、 (_/ ノ いとこだろーと、はとこだろーと
\___ノ゙ 関係ないのさ・・・
/ 丶' ⌒ヽ:::
/ ヽ / /::: ただひとつ言えることは
/ /へ ヘ/ /::: XからZへのなんらかの関係があるかもしれない
/ \ ヾミ /|::: ってことだ
(__/| \___ノ/:::
/ /::: これを圏論では射の「合成」と呼ぶ
/ y ):::
/ / /:::
/ /:::: X → Y
/ /:::::
( く:::::::: ↓
|\ ヽ:::::
| .|\ \ ::::: Z
\ .| .i::: \ ⌒i::
\ | /:::: ヽ 〈:: [XからZへの矢印が考えられる]
\ | i:::::: (__ノ:
__ノ ):::::
(_,,/\
|
|.-──-、
| : : : : : : : : \
|: : : : : : : : : : : ヽ
|-…-…-ミ: : : : :',
| '⌒' '⌒' i: : : : :}
| ェェ ェェ |: : : : :}
| ,.、 |:: : : :;! どこで出ていこうかな・・・・・
| r‐-ニ-┐| : : :ノ
|! ヽ 二゙ノ イゞ‐′
| ` ー一'´丿 \
| \___/ /`丶、
| /~ト、 / l \
,..-──- 、
/. : : : : : : : : : \
関数Xは /.: : : : : : : : : : : : : : ヽ
クラスYを引数にする ,!::: : : :,-…-…-ミ: : : : :',
X(Y) {:: : : : :i \ / i: : : : :}
ちなみにYは {:: : : : | ェェ ェェ |: : : : :} 合成のほかの例え!!
Zという属性を. , 、 . { : : : :| ,.、 .. |:: : : :;!
持っている ヽ ヽ. _ .ヾ: :: :i r‐-ニ-┐ .| : : :ノ
} >'´.-!、ゞイ! ヽ二゙ノ イゞ‐′
| −! \` ー一'´丿 \
ノ ,二!\ \___/ /`丶、
/\ / \ /~ト、 / l \
/ 、 `ソ! \/l::::|ハ/ l-7 _ヽ
_ /- イ、_
__ /: : : : : : : : : : : (
〈〈〈〈 ヽ /: : : : ::;:;: ;: ;:;: ; : : : ::ゝ
〈⊃ } {:: : : :ノ --‐' 、_\: : ::}
∩___∩ | | {:: : :ノ ,_;:;:;ノ、 ェェ ヾ: :::}
| ノ ヽ ! ! 、 l: :ノ /二―-、 |: ::ノ
/ ● ● | / ,,・_ | //  ̄7/ /::ノ
| ( _●_) ミ/ , ’,∴ ・ ¨ 〉(_二─-┘{/
彡、 |∪| / 、・∵ ’ /、//|  ̄ ̄ヽ
/ __ ヽノ / / // |//\ 〉
(___) / / // /\ /
わかりづらいクマ
_ /- イ、_
/: : : : : : : : : : : (
/: : : : ::;:;: ;: ;:;: ; : : : ::ゝ; 関数X → クラスY
.{:: : : :ノ --‐' 、_\: : ::}
.{:: : :ノ ,_;:;:;ノ、 ェェ ヾ: ↓
.l: :ノ /二―-、 |: ::ノ..
| //  ̄7/ /::ノ 属性Z
. 〉(_二─-┘{/
/、//|  ̄ ̄ヽ
わかんないかなコレ・・・
class X {
method( Y ) {}
}
class Y {
Z z;
}
class Z {}
\ i /
─── ・ ── ← ヌッケ
 ̄ 二─ _ // | \
 ̄ 、 - 、 / / |
-、\ \ / /
\\ \
/ \ヾ ヽ ヽ
/ \ ヾ、 | i
クマソッ // |! `i |
/// | |
/ ( | |
<_,へ 丶-、 | |
__●_ rm \ \ |! リ |
/ ヽ-'⊇) ̄`ヾ │ / | |
⊂/ ● /\_,.-、 / / / /
│ /\ / _/ / / //
⊂丿 ミ (⌒)  ̄ / / /
\__ミ / / //_ /
\_/ _二─
A → B → C H
↓ ↑ ↑ ↓
D E → F → J
↑ ↑
G H → I くまー
r -、,, - 、
__ ヽ/ ヽ__
くまー ,"- `ヽ, / ● l )
/ ● \__ (● ● i"
__/ ●)  ̄ )"__ "`;
.(_i ● ' __, '"  ̄`'(___/.i⌒i
丶_ ,i⌒i,,_(_/ ● i ̄ ̄ )_|__
__, '"  ̄ ヽ! ● ●) ミ~ ̄_● ヽ)
くまー (_/ ● i ∪ / ⊂{● | くまー
l ●( _●) (  ̄)- / -' i
/ヽ、 |∪l T i ● '")
くまー
i⌒i⌒i
| ヽ
/ 人__ヽ∩
/ / ヽ
>>498のように人間は人間同士いろんな関係をもってるクマ
/ / ● ● | 物事だってそうだクマ
( | ( _●_) ミ コレとかアレのいろんな関係で成り立っているクマ
\ 彡、 |∪| (
\ ヽノ `ー´⌒\
\ /\ \、
\ / (  ̄)
\ | ( ̄ ̄ ̄ ̄)
\ ヽ/ / ̄ ̄
\__/
∩___∩
/ ノ \ ヽ
| ● ● |
彡 (_●_) ミ
/、 |∪| ,\ 複数の「対象」と複数の「射」の集まり
, -‐- くJ( ヽノ ゝ-rr- 、、 ~~~~~~ ~~~~~
/Y ,r 、 `ー r'"^〃 、 つヒヽ これこそが「圏」 = 「カテゴリー」
,ノ '^` i! =テミ i' 天ニ ミ、 ='"^ヾ }
,/ ''=''" ノ-‐'ヾ-人,,__ノnm、''::;;,, イ
i! ,∠-―-、、 `ー'フヾ、 j 圏論(カテゴリー論)の基礎となるものだクマ
f'´ ノし `丶、 ー=ミ-JE=- /
ヾ=ニ- 彡^ 〃 ,,>、、`''ー-::,,_,,ノ
``ー--┬:, ''"~´フ ソ´`7'' ''"´
,に (`゙゙´ノ f^ヽ
,ハ ,ィ' ,;-ゝ、
/ミ`ーt!,_,ィ-‐彡''"^ヽ
/ ヾ::::::::::::::::r''" ぃ ;}
l t:::::::::::/ ノ /
l! `'T7′ / /
圏(カテゴリー)
┏━━━━━━━━━━━━━━━━━━━━━┓
┃クマー クマー クマー ┃
┃~~~~~~ ~~~~~~ ~~~~~~ ┃
┃ ↑[神] ↑[神] ↑[神] ┃
┃ [好き] [好き] . ┃
┃ A君 → Bちゃん → . C君 ┃
┃ ~~~~ ~~~~~~~~ ~~~~~ . . ┃
┃ ↑[好き] ↓[爆破] ┃
┃ . . [保有] ┃
┃ . . D君 → フェラーリ ┃
┃ ~~~~ ~~~~~~~~~~ ┃
┃ ↓[ペット] . .┃
┃ [同類] . .┃
┃ヌッケ ← 犬 .┃
┃~~~~~~ ~~~ . ┃
┗━━━━━━━━━━━━━━━━━━━━━┛
【まとめ】
┏━┓ 射 ┏━┓
┃.A.┃ → ┃.B.┃
┗━┛ ┗━┛
対象 対象
(ドメイン) (コドメイン)
上の図が基本要素
これが複数あつまり関係しあったものを圏という
ふぅ、つかれたクマー
∩___∩
| ノ ヽ ( )
/ ● ● | ( )
__| ( _●_) ミ__ ( )
(_. 彡、 |∪| 、`__ )─┛
/ / ヽ ヽノ /_/:::::/
|::::::::::| / ( ̄ ̄ ̄ヽ |:::::::| ̄
|::::::::::| |  ̄ ̄ヽ .ノ |:::::::| /
/ ̄ ̄旦 ̄ ̄ ̄ ̄ ̄ ̄ ̄/|/
/__________/ | |
| |-------------------| |
504 :
デフォルトの名無しさん:2007/02/25(日) 09:49:35
これは分かりやすいw
GJ!!
>>502 それがちょっと違う。
たとえば
A → B → C という2つの射があったときに
ここでA → Cという上の2つの射の*合成*が定義されてなかったら圏にならない。
すべてのコドメインとドメインが一致する射の組について合成が定義される
場合について、その全体を圏と呼ぶことが出来る。
↑のAAもがんばってくれw
オーム社から「クマでわかる圏論」マダー?
>>506 あー、なるほどね。そういう条件が必要だったのか。
Wikipediaのこの文章をみてちょっと理解しきれなかったんだな。
>圏 C についてその射(と射の合成可能性)だけでも全部わかっていれば、
>そのうちで恒等射になっているものが対象を示しているので著者によっては
>上の公理を満たす射の集まりを持って圏と定義することもある。
恒等射ってのがなんなのかわからん。ググっても出てこないし!
>>507 クマーとかを本に使って金もらうと炎上しそうだなw
クマーはGPLってことで
>>508 恒等射っていうのはドメインとコドメインが等しくて、
何回合成してもそれ自身と等しくなるような射。
圏のすべての対象について、一個ずつ恒等射があること
が必要。逆に言うと、恒等射があるとそれに対応する
対象がちょうどひとつあるので、恒等射と対象は
1対1に対応している。(したがって、人によっては、恒等射を
対象そのものとみなすって言うのが↑の記事、、
あ、そうだわ、・・・集合の圏とかだと冪等射がたくさん・・・orz...
だから、上の条件にプラスして、他の任意の合成可能な射
と合成して相手を変化させないという条件も必要。
ちゃんと書くと、
1:A→Aという射で他の任意の射
f:A→Bと合成して、f1=f
g:C→Aと合成して、1g=g
となるようなもの、・・・
513 :
デフォルトの名無しさん:2007/03/18(日) 18:43:55
臨時あげ
514 :
デフォルトの名無しさん:2007/03/18(日) 18:46:41
ここで、Stringableの是非を議論すればいいのか?
515 :
デフォルトの名無しさん:2007/03/18(日) 18:47:12
馬鹿が本スレ埋めやがったな
止めれw
次スレが立つまでの避難所ということで
517 :
デフォルトの名無しさん:2007/03/18(日) 18:54:27
よく読むとアンチスレなのにまともな議論されてるなw
>518
乙!
520 :
デフォルトの名無しさん:2007/03/25(日) 15:03:44
型が充実してるって言うから、ちょっと勉強してみたけど、
簡単に実行時例外が発生するじゃん。なんだよこれ。
コンパイルが通れば論理的な誤り以外、
ほとんどバグが取れてるのかと思ったのに。
実行時に読み込むデータとかの誤りなら仕方ないにしても、
そんなのない静的にすべて決まってるプログラムでも
実行時例外が起きえるなんて、全然だめじゃんwww
>>520 例外を起こす可能性のある関数を使わなきゃいいんじゃない?
あるいは、もっと型の強い言語を使ったらどうよ。
暗黙でも何でも良いから
関数毎の定義域に合ったサブタイプを作るとか、
なんとかならんのかね。
もっと型の強い言語ってどんなの?
Cじゃね。
Cほど型の緩い言語もないだろ。
Cは緩いけど硬直的
Dじゃね。
void*
日本拳法が一番厳格だと思うよ
あんまり深く使い込んだわけじゃないけど
俺が出会ったランタイムエラーは
パターンマッチの場合分けの漏ればかりだった。
型がらみで実行時エラーってでる可能性はあるの?
>>523 >もっと型の強い言語ってどんなの?
依存型のある言語とかじゃないか?実用化されてるのか知らんけど。
>>530 head []とかdiv 1 0とか。
計算停止性を決定可能にした天才の
>>520がいると聞いて飛んできましたよ。
依存型って型に普通の値を突っ込めるようなもの?
とすると類に普通の型が混ざるわけ?
534 :
530:2007/03/27(火) 21:26:28
>head []とかdiv 1 0とか。
div 1 0は型エラーじゃないじゃん。
head []も型システムの責任なのかい?
そうか
型に値域を限定する機能があればいいのか?
div :: (Num a) (Num b:ただし0を除く) => a -> b -> a
head :: [a] ただし[]を除く
みたいな。
でもどうやっても静的にはチェックできそうにない orz
{-# OPTIONS_GHC -fglasgow-exts #-}
data ZeroT = ZeroT
data SuccT a = SuccT
data Nat n where
Zero :: Nat ZeroT
Succ :: Nat n -> Nat (SuccT n)
data List a n where
Nil :: List a ZeroT
Cons :: a -> List a n -> List a (SuccT n)
myhead :: List a (SuccT n) -> a
myhead (Cons x xs) = x
mydiv :: Nat n -> Nat (Succ m) -> {- ...型が書けねえ -}
536 :
保守:2007/05/26(土) 18:36:56
破壊的代入を使ったら負けかなと思う
勝ち負けを意識した時点で既にアンタ負けてるよ
>…負けてるよ
って言ってるアンタも勝ち負けを意識してるんだから、負けてるよ。
俺みたいな奴は勝つ必要なんてねえんだよ
勝とうよ。haskellがあれば勝てるよ
けどHaskellって正直なところ負け組だよ
関数型言語パスカル
ふつケル読んだけど、後半が理解できなかった。マジで難しい。
言語の設計の根っこがCPUの挙動にぜんぜん当てはめられていないからか、
俺には宇宙語だよこりゃ…。
当てはめられないかもしれないが
C言語もCPUの挙動に当てはめられるかというとそうでもない
そもそもソフトウェア設計用だからな
>545
後半、モナドやWikiエンジンの開発のところは急に難易度が上がっているので、
それより前の部分を何度も読んで動かしていると感じがつかめてくると思います。
あとは、メモリとかスタックとか、効率のことを考えるのをひとまずやめて
プログラムでどういうことをやりたいかを考えてみるのはどうでしょうか。
おまえ偉そうだぞ
えっへん
つ[龍角散]
>>550 龍角散は「ゴホン!」だろ
エヘン虫にはヴィックスドロップ。
高度すぎてわからなかった^^;;
クマーが圏論を語ってる、、、。
MLと比べてどうなの?
クマー落ち防止保守
>>10 頭の中に同型対応になるものがたくさんあるってことだから
少なくともアホじゃないだろう
>>557 あの手の輩は「これは非直感的だからウンコ」て台詞の方が圧倒的に多いよ
何この良スレ
スレタイでスルーしてて後悔した
もっと活用できたらいいんだがなぁ・・・
561 :
560:2007/11/20(火) 21:31:14
sage
★
クマさんのArrow講義マダ?
arrow って命令型言語的なフローを書くための機構なんだよね?重要なの?
ぶっちゃけ
>>8が理解できなくて劣等感にさいなまれた。
でもHaskellをかじったら理解できた。
その経験からつまずいた点を書いてみる。
qsort [] =
qsort (x:xs) =
とqsortの定義が2つ並んでいるのが理解できなかった。
これはHaskellの階乗を見て場合分けだと理解した。
fact 0 = 1
fact n = n * fact (n - 1)
int fact(int n) {
if (n == 0) return 1;
else return n * fact(n - 1);
}
567 :
566:2007/12/29(土) 12:45:46
[]が意味不明だった。
配列を[1, 2, 3]と書くと知って初めて空配列だと理解できた。
(x:xs)が意味不明だった。
他の部分で配列はすべて[]なのにここだけ()なのに違和感があった。
()はfact(n-1)のn-1と同じでx:xsが一つの要素だとくくっていると解釈した。
この辺はC言語だとコンマで区切るような所が空白で区切られているため
意識しないといけない部分だというように感じた。
そして++が配列の結合だと覚えた上で、
x:xs とはxが要素でxsが配列で [x] ++ xs という意味だと解釈した。
qsort elts_lt_x ++ [x] ++ qsort elts_greq_x
の構文木が初見でイメージできなかった。
演算子++の優先度が高いため A ++ B ++ C と3つの配列が結合していると解釈した。
C言語風にqsort(elts_lt_x) ++ [x] ++ qsort(elts_greq_x)と書いてあれば
初見でも自力で解釈できたかもしれない。
>>10のいうように自分の知っているC言語に近いかどうかというバカの壁がある。
だからと言ってC言語を知らない人の方が先入観がなく理解しやすいとは思えないが。
>>567 [1,2,3]は配列じゃなくてリスト
配列とリストの違いはググレ
文法を知らなきゃ理解できんのは当然だろ
それから、細かいが、
>演算子++の優先度が高い
低い、の間違いだよな?
>>10 「自分が知ってるものと似てる」=メタファ
「見たら使い方がわかる」=アフォーダンス
配列とリストなんて計算量が違うだけじゃん。
初心者は気にしなくていいよ。
>>571 だったらお前はmalloc,freeひたすら繰り返してろ
573 :
566:2007/12/29(土) 13:01:50
>>569 小学校で1+2*3のとき+より*の優先度が高いと習ったと記憶していますが
これはひょっとして大間違いですか?
>>573 もし(++)の優先度が関数適用より高いなら、
qsort elts_lt_x ++ [x] ++ qsort elts_greq_x
は、
qsort (elts_lt_x ++ [x] ++ qsort) elts_greq_x
と解釈されるはずだよ。
576 :
566:2007/12/29(土) 13:07:20
>>574 Haskellとは関係なくて「優先度が高い」という言葉の定義の確認で、
+と*を比較すると*が優先度が高いという言い回しが正しいかどうかです。
>>575 すみません、それ以前のレベルで、
優先度という言葉の定義があやふやでした。
よく考えたら++の優先度が低いという意味が理解できました。
1+2*3で+は後で計算していますがqsortでの++もそれと同じですね。
混乱してしまってごめんなさい。
577 :
566:2007/12/29(土) 13:14:41
>>568 ご指摘ありがとうございます。
日本語のHaskell本を2冊とも買ったのでよく勉強します。
>>569 それはそうなんですが、自信たっぷりな
>>8の書き方を見て、
普通の知能の人間なら文法も含めて推測できるはず
それができない俺はアホだ。
という劣等感を感じたんです。
色々とつまずきましたが、読み方が分かるようになると、
Haskellのインデントの文法はとても美しいと感じられるようになりました。
今まで好きだったPythonが糞に思えてきました。
>>577 haskellのインデント(レイアウトのことかな)が美しいと思うのは自由ですが、
ちょっと偉い人の間では嫌っている人もかなりいます
579 :
566:2007/12/29(土) 13:26:18
>>578 はい、レイアウトのことです。
もしお手数でなければ参考までに嫌われている理由をお聞きしたいです。
Pythonのインデントだとコピペの際にずれを直すのが鬱陶しいと思いました。
C言語だとずれていても無視できて、後で自動整形できますからね。
>>579 たとえばcaseの中にcaseがあって、それがレイアウトで書かれていると、
インデントが少しずれただけで全く意味が異なる式になってしまうことがあったりするから。
だからhaskellにはブロックで書くこともできるからレイアウトを使わなくても良い。
でもレイアウトが崩れても一つの解釈しかできないところならレイアウトで書いたほうがきれいかもしれないね。
581 :
566:2007/12/29(土) 20:28:26
>>580 なるほど。
レイアウトはExcelで書くのに向いているかもしれないと思いました。
そういえば副作用がない関数型のイメージをワークシートに例えた解説を
どこかで読んだのを思い出しました。
ところでqsort elts_lt_x ++ [x] ++ qsort elts_greq_xの演算子の件ですが、
単純に左から右にパースして優先度は関係ないのではないかと気付きました。
静的に型付けされているため、qsortの引数は1つしかないと決められるからです。
関数型言語初心者はマジでMLかOCamlから始めろよ
いきなりHaskellやったってわからねーだろ。
つ「Haskell The Craf tOf Functional Programming」
↑大学の教科書になってるHaskell使ったプログラミング自体の入門書だから
いきなりやってもわかるようにできてる
この本だとモナドが最後のほうになるまででてこないから
ふつうのHaskellプログラミングと併読してもいいやも
SML とか OCaml は(頑張れば宣言的に書く事も可能な)手続き型言語だからね
「副作用も何のその。非正格性なんて、速度を犠牲にしてまで要らないよ。
主題はメタランゲージなんだから、関数型言語なんてレッテルを貼らないでおくれ。」
という世界。
>>585 というか、CAML開発の時点で「妥協の産物」と開発者自らが語っている。
その後継のOCAMLでレッテル貼る貼らないとか以前の問題。
その点、SMLはHaskellと同じで純粋培養した関数型っていう感じがする。
NewJergyとかいいな。
でもあえてGauchを薦めてみるw
Lisp/Scheme Familyは楽しいぞ。古きを尋ねて新きを知るという感じかな。
SchemeならMonaがアツい
OS開発も一緒に楽しめて一石二鳥
Scheme は R6RS が好きになれん...
591 :
566:2007/12/30(日) 00:45:12
>>582 qsortが単独で切り出されてC言語でいう関数ポインタみたいなものとして
扱われないという事実をどう解釈するかということでしょうか?
確認実験をしてみました。
inc n = n + 1
add a b = a + b
inc 2 + inc 5 → 9 (+がincより低い)
add inc 2 inc 5 → エラー (addとincが同列のため)
add (inc 2) (inc 5) → 9 (明示的に差をつける)
もし++が同列なら以下の記述を強制されそうですね。
(qsort elts_lt_x) ++ [x] ++ (qsort elts_greq_x)
括弧なしのポーランド表記とは違うのだと理解しました。
>>583 はい、しょっぱなのクイックソートからつまずきました。
実はHaskellの前に英語の本を買ってF#をやっていたんですが、
C#とパラダイムが違うという実感が湧きませんでした。
C# 3.0でラムダ式を使えばF#いらないなー、みたいな。
そんなとき、Haskellのレイアウトが美しいと気付いたんです。
関数型を使うならcurryingとmonadぐらいは理解してないと使いこなせないんじゃないかな。
式が二つ並んでいたら関数適用になるってことはわかってるかな
C っぽく書くと
inc 2 + inc 5 → +(inc(2))(inc(5))
add inc 2 inc 5 → add(inc)(2)(inc)(5)
add (inc 2) (inc 5) → add(inc(2))(inc(5))
>>591 あなた、一度でもリファレンスに目を通しましたか?
最初から最後まで一読してから、わからないことがあれば質問してください。
幸運なことに、リファレンスは日本語化されています。
596 :
566:2007/12/30(日) 01:41:46
お騒がせしてすみません。
自分にHaskellは無理のようです。
色々と教えていただいてありがとうございました。
アンチを増やしてどうするw
この程度で挫折するようなカスのことなぞ知らん
rubyコミュの二の舞はごめんだからな。
Haskellユーザが増える→Haskellコミュの質低下→Haskellユーザ全体の技術力低下→オブジェクト指向化→Haskellはオブジェクト指向と親和性が低い→Haskellはダメ言語→Haskellコミュ衰退→乙
Haskell衰退の他のシミュレーションよろ
>>601 お前566だろ?
さっそく門前払いを逆恨みか
>>600 オブジェクト指向化したのがConcurrent Cleanじゃね?
関数型初心者はカリー化・モナド・遅延処理ぐらいまで理解してから始めてホスイ。
Cみたいなeager evaluationとHaskellみたいなLazy evaluationでは違うのだよ。
急にスレが伸びてると思ったら基地外が暴れてたのか
冬だな
スレタイどおりの糞オナニー言語ですな
rubyは原理主義者がウザい
>>610 原理主義って・・・もともとrubyは学者でもない一プログラマが実用主義の下に作った言語だろ?
rubyの原理主義とはなんだ?
自分の胸に手を当ててみ
貧乳がありました
ツルペタょぅι゛ょキタ━━━━(゚∀゚)━━━━!!!!
>>585 >「副作用も何のその。非正格性なんて、速度を犠牲にしてまで要らないよ。
>主題はメタランゲージなんだから、関数型言語なんてレッテルを貼らないでおくれ。」
非正格性=non-Strictness=Lazyness
わざわざ非正格性なんて判りにくい言い方をするのモナーw
専門用語使うのがかっこいいと思ってる初心者さんなので許してあげてください。
「正格性」の反対語なんだぜ!って感を表現したかったんじゃないの
怠惰性とか遅延性って表現はなんか違和感が
そんなどうでも良い所を突っ込まれるとは思わなかった…
電子工学から入った俺にしてみれば、副作用なしの関数の方がはるかに直感的だったよ。
習い始めのころでもC言語は別に難しくはなかったが、新しいことを学ぶ気持ちだった。
関数型言語で初めて今まで培った勘が役に立った感じがする。
本来のオブジェクトって言ったら抵抗とかコンデンサとかみたいに副作用がないもののはずなんだがなぁ。
なんでオブジェクト指向って言葉が根付いたのが手続き型言語の世界なんだろう。
いや、歴史的経緯は知ってるけど、納得できない。
>>618 研究者の端くれなら尚更判りやすい表現を心がけるべきかと
>>619 >なんでオブジェクト指向って言葉が根付いたのが手続き型言語の世界なんだろう。
関数型ではファンクターで抽象化できるからオブジェクト化が必要とされることがあまりなかったから。
手続き型では抽象化の方法がオブジェクト化に求められたが、これを関数型にポートする際にオブジェクト指向の関数型が必要とされた。
手続き型で蓄積された資産がすごい勢いでオブジェクト指向の関数型OCAMLにポートされつつあるからM$もF#を出す気になった。
こういった資産のひとつがOCAMLのocsigen。OCAML版Ruby on Railsのパクリ。
他にも、GaucheのKahuaもそれ系。
これらが関数型の世界でどんな進化をするのか興味深い。
F#はファンクターが無い訳だがw
Apple=>Ruby/Objective-C
Micro$oft=>F#/Visual-???
Unix=>Gauche/Haskell/etc
>>624 いいえ、
Unixは終焉までずっとC言語です。
>>625 Cはどのプラットフォームでも使うアセンブラ的なポジションになってると思う。
妥協の産物=>Perl/Ruby/OCaml
理想主義者=>Squeak/Haskell
現代の化石=>C/Lisp/Fortran/COBOL
COBOL?まだ使ってるところあるの?もう全部Javaになったかと思った。
Fortranは物理の世界では現役バリバリです。
Lisp・・・うーん
市役所勤務の知り合いがいうには
優秀なやつはシステム課に回されてコボルやらされるらしいですよw
Perl<=Larry Wall
Ruby<=Matz
OCaml<=INRIA
Squeak/Smalltalk<=Xerox Park(Allan Kay)
Haskell<=Bastiaan Heeren、Daan Leijen、Arjan van IJzendoorn
C<=K&R
Scheme<=Guy Lewis Steele Jr.、Gerald Jay Sussman
Fortran<=John Warner Backus
COBOL<=CODASYL
つ「お題 プログラミング言語の父と呼ばれるのは誰?」
チャールズ・バベッジ
階差機関(difference engine)は世界初のプログラム可能な計算機と云われています。
では、どのようにプログラムしたのでしょう?
635 :
デフォルトの名無しさん:2007/12/30(日) 21:54:11
超良スレ保守
プログラミング言語の父といえばシェーンフィンケルとHaskellだろう。1920年代のコンビネータ論理(Combinatory Logic)だ。
シェーンフィンケルが考案し、Haskellが開発した。
その仕事が1930年代のチャーチとクリーネによるメタ言語としてのλ算法の業績につながった。
そしてその後1954年にIBMのバッカスが最初の高級言語FORTRANを作る。
こういう歴史の直系だから、言語としてのHaskellが研究志向が強いというのもうなづける。
カリー・ハワード同型対応なくしてプログラミング言語など存在し得ない。
>>619 そもそも、プログラミングパラダイムとしてのオブジェクト指向というのが
「状態と手続きを一纏めにしてカプセル化する」という動機で導入されたものだから。
本質的に「状態」を持たない関数型の世界にオブジェクト指向が入り込む余地はそもそも無い。
あと、細かいことだが
>本来のオブジェクトって言ったら抵抗とかコンデンサとかみたいに副作用がないもののはずなんだがなぁ。
コンデンサってのは電荷をためて(状態変化)それを放電する(これも状態変化)ものでないかい?
微分方程式ばかり相手にしてると忘れがちになりかねないけれども、コンデンサは確かに「状態」を持つよ。
抵抗のことはよく分からんが。
>>622 >これらが関数型の世界でどんな進化をするのか興味深い。
「純粋関数型」を標榜するHaskellとはオブジェクトは相容れないし、
OCAMLでもコード中、オブジェクト機能を使ってる部分は、「関数型っぽく」はならないだろ?
オブジェクトが関数型の世界でどうなるか、という興味は無意味だと思うね。
オブジェクトの世界と関数型の世界とがどう棲み分けて共存していくか、ならわかるが。
>>638 オブジェクト指向と関数型が共存することでこういったことが出来ればいいなぁという要求は出てくると思う。
これまでの言語の発展だってそういうことから出てきてる。
この部分は相容れないけどこれは一緒にするとこんなことが出来るというのが実装上の工夫のポイントだと思う。
君には無意味かもしらんが。
Y コンビネータ (fixpoint のことを Y コンビネータと呼びます。)
data X = PsiInv (X -> (Int -> Int))
psi :: X -> (X -> (Int -> Int))
psi (PsiInv f) = f
fixpoint :: ((Int -> Int) -> (Int -> Int)) -> (Int -> Int)
fixpoint g = let h y = g (\x -> psi y y x) in
h (PsiInv h)
f :: (Int -> Int) -> (Int -> Int)
f g n = if n==0 then 1
else n * g(n-1)
factorial :: Int -> Int
factorial = fixpoint f
-- factorial 10 == 3628800
>>638 >そもそも、プログラミングパラダイムとしてのオブジェクト指向というのが
>「状態と手続きを一纏めにしてカプセル化する」という動機で導入されたものだから。
ハァ?www
>>638 >「状態と手続きを一纏めにしてカプセル化する」という動機で導入されたものだから。
どーでもいいがデータ構造とアルゴリズムを纏めるんじゃなかったかな?
状態云々は結果的にそういうプログラミング手法が出てきただけで本質的にはあんまり関係ないと思う。
まあHaskellの代数的データ型は型とデータ構造を対応付けて
型についてアルゴリズムを書くから、データ構造とアルゴリズムはほぼ完全に分離してるといえるかもしれない。
これはこれで結構分かりやすくていいシステムだとい思うんだけど、
たとえば型クラス便利だけどインターフェイスみたいにガンガン作る気にならないっていうか、
そういう細かいあたりがめんどくさくなってる気がする。
そういうのをオブジェクト指向で何とかできないものかとか思ったり。これは俺の浅知恵だけどね。
あと、細かいことだが
>コンデンサってのは電荷をためて(状態変化)それを放電する(これも状態変化)ものでないかい?
それは「副値」的なパラメータが存在するだけで実際にそれを「副作用」として実装するかはプログラマ次第では?
というかHaskellだったら普通にモナドで表現できるもんだと思う。
実世界での対応で考えると、ある力を外力と考えることも出来るし、より大きな系の内力と考えることも出来る程度の違い。
状態が存在するかどうかはどういう切り口で物事を見るかに依存している、と思う。
オブジェクト指向と関数型が共存できないという風評は日本だけ。
どこが発信源かは知らないがこういうことが普通に受け容れられるようになったんだなぁ。
ゆとり世代が言ってるんだろうか?
プログラミングに関する珍発言がまかり通るのは、日本では昔からの伝統です。
C言語が関数型言語であるとか、インタプリタはちょっとずつコード生成して実行する
処理系であるとか。
後者は国の問題じゃなくマーケティングの問題でそ
関数型のCAMLがオブジェクト指向を取り入れてObjective CAMLになったように、VBがλ算法を手始めに関数型を取り入れても不思議はないと思う。
VBの互換性を問題にしてる人は参照透過性とか副次作用とかを気にしてるんだろうか。OCAMLだってあまり考えずに代入とか使えば問題があるのは同じだと思うけど。
むしろOCAMLerがVBを使うときに便利だと思うけどなぁ。
それとも、OCAMLとHaskellでは全く違うということを問題にしてるんだろうか。
日本以外ではマルチパラダイムでお祭なのに
>オブジェクトが関数型の世界でどうなるか、という興味は無意味だと思うね。
>オブジェクトの世界と関数型の世界とがどう棲み分けて共存していくか、ならわかるが。
こういうことを周りに認めさせようとする日本人は多いんだろうなぁ。
プログラミングする人はいっぱいいても言語を考える人が少ないんだよ
まるちぱらだいむだうゎあい、って日本で竹内先生とかが頑張ったのは
世界の先を行ってたと思うんだけどな。
旧帝大-早慶-電電&電機メーカ研究所レベルの研究の浸透拡散がうまく
いかんのはどこかに構造的な問題があるんかね?
>>648 別にお祭りというほどでもありませんが。
単に研究ネタがなくなったから今主流のオブジェクト指向と組み合わせてみよう、
って思ってるだけじゃないの。
>>648 > こういうことを周りに認めさせようとする日本人は多いんだろうなぁ。
特定の環境にこり固まって極めちゃった悪い意味での職人型なプログラマとかにありそう。
そういう先輩が職場にいて、適切なフォローを入れる人がいなかったりすると、新人は悲惨だね。
>>638みたいなMythに対しては古くからこういう有名な言葉があるんだが、
"Doing encapsulation right is a commitment not justto abstraction of state,
but to eliminate state oriented metaphors from programming."
Alan Kay, Early History of Smalltall
○Smalltalk
×Smalltall
Haskellはオブジェクト指向じゃないけど型クラスを使えるから準オブジェクト指向関数型言語とでも言えるのかな。
「型クラス」と「型構築子クラス」でオブジェクト指向っぽく使えて、副作用がないようにモナドやその一般化のアローが使える。
オブジェクト指向と関数型が共存出来ないと言いながらHaskellを使っている人は分裂気味なんじゃないでしょうかね。
いや、Type Class と、オブジェクト指向の「クラス」は別物な訳だが
「準」とかで片付けるとかどんだけwwwwwww
ばか
で
>>659さんは別物のクラスだとどういうことが言えると言いたい訳かな?
ご高説を是非御拝聴いたしましょう。
どんだけwwwwwばか
関数型とオブジェクトなんざ共存出来ねんだよ。
無意味、無意味。無駄無駄無駄wwwwww
Haskellerはオブジェクト指向もわからないばかということですか。ああそうですか。
残念な展開だね。
>>656 arrow使いにくい
まるでbrainf*ckみたいに見える
結局は普通に書いたほうがきれいだ
「普通」とかで片付けるとかどんだけwwwwwww
ばか
やっぱHaskellerってのは池沼だね。
-- A Simple Brainfuck Interpreter
import System.Environment
-- Parser
data Command = Inc | Dec | Next | Prev | Put | Get | While [Command]
deriving (Show, Eq)
type Program = [Command]
parse :: String -> Program
parse s = program where (program, "") = parse1 s
parse1 :: String -> (Program, String)
parse1 "" = ([], "")
parse1 (']':xs) = ([], xs)
parse1 ('[':xs) = (While cmds1 : cmds2, rest2)
where (cmds1, rest1) = parse1 xs
(cmds2, rest2) = parse1 rest1
parse1 (x:xs) = (parse2 x, rest)
where (cmds, rest) = parse1 xs
parse2 :: Char -> Program
parse2 '>' = Next : cmds
parse2 '<' = Prev : cmds
parse2 '+' = Inc : cmds
parse2 '-' = Dec : cmds
parse2 '.' = Put : cmds
parse2 ',' = Get : cmds
parse2 _ = cmds
type Tape = ([Char], Int)
tape0 = (['\NUL', '\NUL'..], 0) :: Tape
getCell :: Tape -> Char -- Get value of current position
getCell (cs, i) = cs !! i
setCell :: Tape -> Char -> Tape
setCell (cs, i) c = (take i cs ++ (c : drop (i + 1) cs), i)
inc, dec, next, prev :: Tape -> Tape
inc t = setCell t (succ $ getCell t)
dec t = setCell t (pred $ getCell t)
next (cs, i) = (cs, i + 1)
prev (cs, i) = (cs, i - 1)
type Status = (Program, Tape, [Char], [Char])
step :: (Tape -> Tape) -> Status -> Status
step f (c:cs, tape, inp, outp) = eval (cs, f tape, inp, outp)
eval :: Status -> Status
eval (Get : cmds, tape, (i:inp), outp) = eval (cmds, setCell tape i, inp, outp)
eval (Get : _, _, "", _) = error "EOF"
eval s @ (Put : _, tape, _, _) = (cmds, tape1, inp, getCell tape : outp)
where (cmds, tape1, inp, outp) = step id s
eval s @ (Inc : _, _, _, _) = step inc s
eval s @ (Dec : _, _, _, _) = step dec s
eval s @ (Next : _, _, _, _) = step next s
eval s @ (Prev : _, _, _, _) = step prev s
eval s @ (While cmds : cmds1, tape, inp, outp) = while (getCell tape)
where while '\NUL' = step id s
while _ = (cmds2, tape2, inp2, outp1 ++ outp2)
where (_ , tape1, inp1, outp1)
= eval (cmds, tape, inp, outp)
(cmds2, tape2, inp2, outp2)
= eval (While cmds : cmds1, tape1, inp1, outp1)
eval ([], t, i, _) = ([], t, i, "")
run :: Program -> [Char] -> [Char]
run cmds inp = outp where (_,_,_, outp) = eval (cmds, tape0, inp, "")
main :: IO ()
main = do cs <- getContents
args <- getArgs
source <- readFile (head args)
putStr $ run (parse source) cs
-- brainf*ckなんてたったこれだけ。
>>638 状態を持たないステートレスオブジェクトはそのまま純粋関数型言語に取り込めますよね。
「純粋関数型」を標榜するHaskellは状態がないのではなくモナドに閉じ込めています。
ステートフルオブジェクトの状態も同様にモナドに閉じ込める事で「純粋関数型」を
維持したままオブジェクトを利用できると考えますが何か問題があるのでしょうか?
>>672 >>664>>671でも書いたがarrowが使いにくいんだよ。brainf*ckみたいだろ。
brainf*ckを書き込んだ池沼にはわからねぇんだろうが
>>672 うんうん。Monadiusとかそうだよね。
, - ' ´ ̄ `` 、__
__,ィ ヽ. `ヽ.
, '⌒Y / 、ヽ ヽ ヽ.
/ / i /l/|_ハ li l i li ハ
. // 〃 /l i|j_,.//‐'/ lTト l、l j N i |
{イ l / l li //___ リ_lノ lル' lハ. ソ ___◎_r‐ロユ
i| /レ/l l l v'´ ̄ , ´ ̄`イ !| ll,ハ └─‐┐ナ┐┌┘ _ ヘ____
ハ| ll∧ハヽ ト、 '''' r==┐ '''' /l jハ| ll ll /./┌┘└┬┘└┼────┘ロコ┌i
〃 ‖ レ'¨´ヽiへ. _ 、__,ノ ,.イ/|/ ノ ll l| </  ̄L.l ̄ ̄L.lL.! ┌┘|
ll ll { ⌒ヽ_/ } ー‐<.__ ′ l| ‖
‖ ‖ ヽ, /、 〈 |:::::::| `ヽ ‖
‖ {. ハ ヽ Y`‐┴、::::v l ‖
‖ |iヽ{ ヽ_ゾノ‐一’::::ヽ. | ‖
‖ |i:::::`¨´-- :::......:...:.:.::.}| ‖
‖ |i::::::ヽ._:::_:::::::::::::::::::_ノ | ‖
‖ |i::::::::::::i___:::::::::::/ |
jj::::::::r┴-- `ー‐ '⌒ |
〃:::::::マ二 _,ノ
//::::::::::::i ー 一 '´ ̄::.
,','::::::::::::::i::::::::::::::::::::::i::::::ヽ
>>675 それは658が一番詳しいから658に聞いてくれ
さんざ荒らして説明拒否かよw
えっ、だれが荒らし?
池沼の「普通」なんて誰も興味ねえってよw
論文じゃあるまいし。
揚げ足取りなんかやってるから単位も危なくなるんだぞ?
685 :
デフォルトの名無しさん:2008/01/05(土) 22:25:42
>>683-684 せっかくぐぐって終息させてやろうとしてるのに馬鹿だねおまえはw
黙ってれば終わったのに。
晒しage
これが関数型使って気取ってる池沼の実態ですwwwwww
ばか
使えもしないのに関数型に憧れてんなYO!
Haskell使いキモスwwwwww
スレタイ通りのオナスレageんな
クソ言語が普通とか言ってんなよ。所詮、脳内オナニー。
恥ずかしいスレ名をアゲんな、変体どもがぁ。
Haskellはプログラム板の恥だな。
スレの削除依頼出せ.キモイんだよお前等
まあ、重複スレなのでこちらを削除しても問題ありませんね。
↑さんざん恥をかいたのでスレ削除して欲しい張本人がこう申しておりますw
Haskell使ってる人って頭が良いイメージだったけどw
なかなか笑わせてもらった
「Haskell」=「Arrow」+「普通」
普通ってwwww
「プログラム」=「データ構造」+「アルゴリズム」
ってWirth先生が言ってたぞ。
アローだってデータ構造だろうに。
普通のアルゴリズムなんて定義できんだろ。
普通のどこが気に入らないんだろう
アローに付随したアルゴリズムに定石でもあるのか?そんな本見たことねーぞ。
むしろ教えろゴルァ!
アローの定石と言えるかわからないけどバード先生の本には載ってる
Rahbi & Lapalme にはモナドの説明が無いけど、
Introduction to Functional Programming Using Haskell
Richard Bird
こっちには載ってるのか。
アロー程度がちょちょいと説明できないようじゃHaskell使いこなせてると言えないよね。
アローって簡単?
>>706 ふ・つ・う wwwww
お頭が弱いとアローがbrainf*ckみたいに見えるらしいけど、可換図式みたいで判りやすいよ。
ハッキリ言って簡単。基礎的な数学力があればだけど。圏論ぐらいは出来ないと無理かな。
>>707 > ハッキリ言って簡単。基礎的な数学力があればだけど。圏論ぐらいは出来ないと無理かな。
どうやら、arrowでプログラミングしたこともないことがよくわかった。
アマゾンみたらバードの本にはモナドとかアローについて書いてあるらしい。
でも翻訳はMirandaについてでモナドとか載ってなさげだねぇ。
Arrowって、Kleisli 圏とか Premonoidal 圏みたいなもんか。たしかに図を描けばなんてことなさげ。
>>708 はいはい。あーarrowはむずかしいいや。brainf*ckみたいにみえるなあw
教訓
・ オブジェクト指向と関数型は共存出来ない。
・ 「Haskell」=「Arrow」+「普通」 (ただしArrowはbrainf*ckである)
>>712 なにそれ?Haskell全否定じゃん。
708は口調ですぐわかるな。アンチなら使わなきゃイイジャン。
アローって意味的にはモナドなんかよかよっぽど理解できるだろ。
要するに計算の合成を定義すればいいだけ。
フリーダムすぎて使い方を迷うところはあるけど……圏論の知識とかいるか?
arrowでプログラミングするのに数学も圏論の知識も微塵も必要ない。
>>715 あれば簡単ってことなんじゃないの?おれ圏論知らないけどさw
>>715 アローってモナドの一般化したやつじゃん。ほとんど同じだろ。
アローが関数を受け持って、モナドが値を受け持つ箱みたいなイメージ。
違ったっけ?
>>717 それは極論だろ。SコンビネータとかBコンビネータとかYコンビネータを適用するとき副作用があるのか分からなくてドキドキする。
数学知ってたらこういうことがさらっと出来ていいんだろうなと思う。
Haskellじゃなくてもいいようなプログラムなら数学の知識はいらないとは言えるw
結局、Haskellを何に利用しているかでアローの難易度も違って見えるんだろうね。
いらない・無意味・微塵も必要ない
普通
arrow関連で卒論書きたいんですが、受けはいいでしょうか?
>>719 値を受け持つ箱と考えるより、monadic function(a->m b)の形式で計算を纏めていく戦略と考えたほうが
理解しやすいかもしれん。monadic valueそのものをモナドだと思ってしまうとよくわからんなるんじゃない?
>>717 ならこのスレに来るな。ここはクマーが圏論を説明してくれた偉大なスレだ。
>>720 数学の知識がなくてもSコンビネータとかBコンビネータとかYコンビネータが
何を意味しているのかだけ知っていればどきどきすることはありません。
>>728 意味が良くわからない。AAで説明してくれ。たのむわ。
/-─-,,,_: : : : : : : : :\
/ '''-,,,: : : : : : : :i
/、 /: : : : : : : : i ________
r-、 ,,,,,,,,,,、 /: : : : : : : : : :i /
L_, , 、 \: : : : : : : : :i / 圏論持ち出したら
/●) (●> |: :__,=-、: / < 負けかなと思ってる
l イ '- |:/ tbノノ \ ニート(24・男性)
l ,`-=-'\ `l ι';/ \
ヽトェ-ェェ-:) -r'  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
ヾ=-' /
数学の知識無しでアローをAAで説明出来んじゃなかったの?
しったかかw クマーktkr
スレの流れに
水を差すようで申し訳ないんだが
ちょっと質問
>>720 にある「(対称)前モノイダル圏」って
よく意味が解らない
対称モノイダル圏の条件を弱めたものらしけど
対称モノイダル圏だとなにか不味い事でもあるのですか
734 :
733:2008/01/06(日) 17:25:08
アローなんて簡単だろ
ほれ、これがアローだ
→
これの事でしょうか?ハァハァ
/⌒ヽ⌒ヽ
Y
八 ヽ
( __//. ヽ,, ,)
丶1 八. !/
ζ, 八. j
i 丿 、 j
| 八 |
| ! i 、 |
| i し " i '|
|ノ ( i i|
( '~ヽ ! ‖
│ i ‖
| ! ||
| │ |
| | | |
| | | |
| ! | |
| | ‖
/ ヾ
AA職人がいなくなってつまんなくなったね。
AA職人というか、コピペで説明してただけだろ?
その「説明してただけ」すら出来ないコピペ厨w
たしかに1年でレベルが落ちたのは否定できんなw
単にスレが捨てられただけでは?
いまどきarrowなんてみんな知ってて、いまさら説明の余地もない。
新しいネタ探して来い
>>742 こら!みんなが矢印とかちんぽを無視したからって怒るでないw
クマーってもう一年前の話か。上のほう見たら2つもあるね。
>>742 ↑とアローの説明が出来ないクズが取り乱しております
>>728 コンビネータ理論を知っていれば十分で数学の知識を前提としないって?おいおい。
支離滅裂だぞ。
>>746 数学の基礎的な知識はそれほど必要ないだろ。
「それだけ」知ってればいいんだから。
>>747 基礎の意味が違うでしょ。コンビネータ理論は数学基礎論であって、数学の基礎知識じゃない。
しかも副作用についての知識は、いくつかのコンビネータを知ってるではすまない。
他にも山のようにある関数について、一つ一つ個別に知ってるよりも理屈を知ったほうが当然良い。
λλλλλ...
↑アロー・モナド・コンビネータ理論について行けず、肩を落として帰るプログラマの群れ
正直arrowとかどうでもいい
それよりhere documentを入れてくれ
当然だけど、アローについても同様の議論が展開できる訳です。まあ、アローなんかどうでも良いんでしたね。
754 :
デフォルトの名無しさん:2008/01/07(月) 22:52:18
モノイド圏とモノイダル圏て何が違うの?
>>752 乙。
>>710あたりが言ってた図を書くって「ペースティング図、スタック図(Santiago graphical notation)、ストリング図で描く・・・」てことか。
おれも
>>735みたいなのをアローと思ってたw
>>754 Monoidal Category = モノイド圏
>>733しかモノイダル圏という日本語は使っていないと思う。普通、モノイド圏と呼ぶ。
757 :
デフォルトの名無しさん:2008/01/07(月) 23:44:59
>756 thx
ところで、圏でのモナドは分かるんですが、
プログラム言語のモナドって何なんですか?
>>757 ほい
ttp://www.sampou.org/haskell/tutorial-j/monads.html HaskellのモナドはMonadという型クラスのインスタンスれす。
Monadクラスは2つのクラスメソッドを持っていて、その2つがモナド則(3ホーソクありゅ)を満たしてマース。
よく使うモナドはIO, Maybe, Listあたりでしょう。どれも「演算」を繋ぐという感じに使いマース。
この3行を見たらリンク先にJUMP!
2つのクラスメソッドは、最初のうちは『>>=』が『|』(パイプ)に対応、『return』が『cat』に対応すると覚えておけば良いかもネ!
(Jonesはわざとパイプっぽくしたらしいネ)
モナドの構文は3つ。doとletとifだけ。
演算をモナド的に定義して繋ぐと、新しい特徴を参照透過的にモナドに結びつけることが出来ちゃう。
しかもモナド則3が保証するように「組み立て順序が自由」で、長くつながったモナドの鎖のどこを切ってもモナドになるョ。
これがモナドがもたらすモジュール化という効能だよーん。
>759 おおDankeです
プログラムにはなかなか深い数学が隠れているんですね。
いまふと思ったんですが、物理に出てくる量子化という
概念も、もしかするとモナドに関係あるかも知れません。
モジュラリティが何を意味するのかよく考えてみます。
761 :
デフォルトの名無しさん:2008/01/08(火) 21:02:22
>>759 doとletは分かるけど、ifってモナドと関係あったっけ?
>>761 説明が間違ってるところ大杉。
自分でモナドを作る時、どうするつもりかと思った。
>>763 do と if を一緒に使う話じゃないかな。有名な「一行で書け」ってやつ。
>>761 パクったはいいが、意味を理解してなかった、ってところか。
>>761ってそんなに間違いが多いのか〜
どこからパクったのか分かりますか?
この年末年始のプログラマの休暇に
ここのスレが結構盛り上がっていたな
769 :
デフォルトの名無しさん:2008/01/13(日) 08:07:15
プログラマは休暇にHaskellの勉強か
みんな偉いな
770 :
デフォルトの名無しさん:2008/01/13(日) 10:35:26
どのへんがまちがってるの?
勘違いしてるだけなんじゃない?
772 :
デフォルトの名無しさん:2008/01/18(金) 04:18:25
なんだかんだ言って、本当はぜんぜん分かってない奴がほとんどだろw
まぁ仲間は多いと思っておきたいところだよな。
774 :
デフォルトの名無しさん:2008/01/18(金) 15:35:54
こんなとこで宣伝したところで何PV増えるというのか
777 :
デフォルトの名無しさん:2008/01/19(土) 18:53:04
>>775 そうやって自分が理解できてないのを誤魔化そうって魂胆だろ。
まずは
>>761の間違いを指摘してみろよ。話はそれからだなw
ひとり暴れているのがいるみたいだね。誰も話したくないからって理解できないんだろうか。
いったいどこからパクったのか教えてくれよ。
781 :
デフォルトの名無しさん:2008/01/20(日) 18:21:29
どうでもよくないな。それによって
>>761が間違いかどうか判断できるだろ。
その判断がどうでもいいと言っているんだよ
1/8を最後にパッタリ流れが止まったのはなぜかな?
ヒント 自演
結局Haskellって遅いの?
>>785 perlよかハエーよ スクリプトに使うなら無問題
組込系にはちょっと シビアなタイミングが求められるとダメポ
>>786 >組込系にはちょっと シビアなタイミングが求められるとダメポ
組み込みはどんな感じのアセンブリコードが生成されるのか予測しやすいほうがいいと思うんだが、
Haskell使いが慣れてくるとどういうasm吐くか割と簡単に把握できるようになるの?
>>786 Perlよかはやいとか到底考えられないのだけど、その根拠は?
動的型でバイトコンパイルのPerlと、静的型でネイティブコンパイルのHaskellを比較して
Perlの方が速いと思うなら、そっちこそ説明が要るだろw
え〜Haskellって、ネイティブコンパイルしてるのか。それすら知らなかったわw
インタプリタだとばかり思ってた。
両方可能だがね
インタプリタあるんだ、知らんかった
コンパイルしなくてもCGIとして使えるのかな 調べてみるか
あるかどうかは知らんが、可能ではあるだろう
runghcとかrunhugsとかあるけど、インタプリタをサーバに導入するほうが返って面倒な気もする
Haskellまだかじった程度だけど、参照透明性がなにかハッピーにしてくれるの?
やろうと思えば、既存の言語でも出来るわけで。言語的に制約がかかっているか
どうかでしょ。「言語的に制約がかかる」というのは、入門者にとってしかメリット
はないよ。
遅延評価も*ほぼ*使わない。無限計算なんてやらんよ?
こんなんで、なんで既存言語から乗り換えるの?俺が、まだHaskellよくわかっていない
だけ?
798 :
デフォルトの名無しさん:2008/02/16(土) 23:01:19
あげ
俺も初心者だけど、参照透明性の重用性がよくわからない。
つか、結局はunsafeなんとかで参照透明性をくずしてんでしょ?
ちなみにクソリストなんて採用するのはやめてくれ
>>797 C++ が参照透明な言語だって知ってた?
>>801 信じられない。あふぉかw
俺が、無知なら教えてくださいw
参照透明性って、再代入できないってことだよな(間違ったら訂正してくれ)
C++は再代入できる、とおれは思ってるがw
>>803 Rubyはすきだが、そいつじゃない。というか、今日一日ひきこもってたしなw
>>799 unsafeを使うときは注意が必要である
いつ実行されてもプログラムに矛盾が発生しないことがはっきりしない限り使うべきではない
式と値が一対一に対応していること
Haskellのメリットを説きたいなら
>>803のリンク教えるだけで十分じゃねーの?
参照透明性なんて飾りだよ
Haskellの魅力は、副作用が禁じられていることじゃなくて、
副作用なんていう扱いにくいものに頼らなくても自然にプログラムを書けることだ
遅延評価は大いに使う
「ほぼ使わない」なんて思えるのはHaskellに慣れてないだけだ
例えば、C言語の典型的なfor文の使い方
for(T i = init; cont(i); i = next(i)) use(i);
を、Haskellで自然に書き直すと
mapM_ use $ takeWhile cont $ iterate next init
になるけど、これは無限リストを使っている
>>809 あなたはネタを理解できない人なんですね
遅延評価便利だよ。
MLが不便に思えるぐらいだ。
>>799 unsafeなんとかは、本当は参照透明なのに、コンパイラが参照透明だと見なしてくれない式を書くときに使う
そうじゃない使い方もできるけど、それは邪悪な使い方だ
ffi使えばunsafe使わなくてもいくらでも邪悪なプログラムが書けるぜ。
HaskellのFFIはめちゃくちゃ楽だからな。
組み込みプログラムもなんのその。
817 :
799:2008/02/16(土) 23:41:48
>>803 >>808 803のリンクは、
「参照透明は関数型言語の魅力としては不適当」と言っているのでは?
>>816 オーバーヘッドもあるしメモリも食いまくるから組み込みには全く向かないだろ
>>818 関係ない。
組み込み=低リソースという時代は終わったんだよ。
それよりも、たとえばロケットや自動車のような用途では安全性が求められる。
>>817 参照透明でなければ遅延評価は役に立たないよ
D 言語に遅延評価もどきはあるけどな。
遅延評価はテクニックに近いものもあるしな
823 :
799:2008/02/17(日) 00:06:23
>>820 なるほど…。
でも、遅延評価も必ず使うわけではないし、
(IOの時など遅延評価されては困る場合もあるわけですよね?)
なんというか、参照透明そのものの優位性がわからない…。
・コンパイラが作りやすい?
・数学的にみて美しい?
…、いずれも一般ユーザには関係ないですよね…。
参照透明性ってデバッグの容易さの点で重要と聞いてるけど。
825 :
799:2008/02/17(日) 00:08:33
>>814 う〜ん…。これは正しいのでしょうか?
あくまでも、Haskellは参照透明であって、
そうでないプログラムは邪悪という事ですよね。
>>823 参照透明だったら関数の返値をキャッシュできるよ
827 :
799:2008/02/17(日) 00:14:55
828 :
799:2008/02/17(日) 00:16:41
>>824 Haskellのデバッグってむしろ大変そうですけど…。
>>827 完全にキャッシュできればプログラマはわざわざメモ化とかのテクニックを使ってプログラミングする必要がなくなる。
・・・とは言うものの、GHCでは完全にキャッシュしているわけではない。
>>828 Cのデバッグで一番骨が折れるのが型によるバグ。
Haskellはコンパイルさえ通れば型に関しては完全に矛盾がない。
>>823 だから、参照透明性はそんなに重大な特徴じゃないんだって
(利点が無いわけじゃない。コンパイラによる最適化がやりやすい。コードが読みやすい。リファクタリングしやすいetc)
逆に、「参照透明でないこと」(破壊的代入や副作用を認める)にも大して優位性は無いんだ
Haskellにはもっと重要な特徴がたくさんある
動作オブジェクトを利用した入出力とか、代数的データ型+パターン照合とか、型クラスとか、遅延評価とか
832 :
797:2008/02/17(日) 00:25:59
>>830 Haskell の型はステキだと思いますよw
でも、traceとか「デバッグ」は大変そう…。
>>831 >参照透明性はそんなに重大な特徴じゃない
そうですよね…。
でも、なんか、かたくなに参照透明性を守ろうとして
余計わかり難くなってる気がするんですよね。
全面的な参照透明性を捨てた方が、
すっきりするのではないでしょうか…?
834 :
799:2008/02/17(日) 00:29:52
traceってどういうのを指してるか分からんけど、printfデバッグの類は普通にできる
ただ、HaskellがCよりデバッグしにくいのは事実だと思う
gdbに匹敵する使いやすさのデバッガがまだ無いからだが
>>833 >でも、なんか、かたくなに参照透明性を守ろうとして
>余計わかり難くなってる気がするんですよね。
どの辺でそう感じた?
837 :
799:2008/02/17(日) 00:31:00
838 :
799:2008/02/17(日) 00:35:00
>>836 > printfデバッグの類は普通にできる
そうなんですか?
なんかprintfいれるとバグが再現しないとか多そうですが…。
> どの辺でそう感じた?
IOモナドww
参照透明性を捨てれば
もっとステキな実装がありそうじゃないですか?
参照透明性を確保するために導入したんだから
本末転倒だじょ
俺はIOモナド大好きなのでその気持ちは良く分からん
例え参照透明性を捨ててもIOモナドは使いたい
841 :
799:2008/02/17(日) 00:41:50
>>839 ん?
いや、だから、参照透明性に固執するから、
IOモナドなんて理解しにくい方法で実装してるんでしょ?
参照透明性を実現する完全に純粋な関数型言語を作るのが
Haskell の1つの目標だったんじゃないのか?
IOモナド、というかIO動作の考え方は多少とっつきにくいけど、分かってしまえば簡単なことだし、
副作用を使った入出力よりずっとまともだと思う
それから、遅延評価の言語で素朴に副作用を使うと実行順が制御困難になるけど、
IO動作ならこの問題がない
>>842 だろうな
でも言語のユーザーにとってはそんな目標はどうでも良い
参照透明性が要らないというなら OCaml とか他の言語使えばいい。
それだけだと思うぜ。
>>844 その議論はおかしい
Haskellの特徴は参照透明性だけじゃない
デフォルトの遅延評価も型クラスもIOモナドも$演算子もOCamlには無い
参照透明性なんてどうでも良いという奴にでも、Haskellを使う理由はいくらでもある
じゃあ、参照透明性の無いHaskell に相当する言語を作ったらいいんじゃね。
847 :
799:2008/02/17(日) 01:12:57
>>840 そうなんですか…。
結局、慣れの問題なんでしょうかねぇ…。
Haskell では参照透明性をくずすものは trace のみなんだっけ?
849 :
799:2008/02/17(日) 01:15:23
>>846 まさに、そう、思うんですよw
そんな言語があれば、
確実にブレイクするのではないでしょうか?
誰か作って!私はもちろん……ムリ!
>>848 unsafePerformIOってのがある
>>849 単に参照透明性のないHaskellならunsafePerformIOを言語の一部として認めれば良いんだけど、
IOモナドを排除するのは難しいと思う
>>843で書いたけど、普通の言語にあるような副作用による入出力は、遅延評価と相性が悪い
実行順を分かり易く制御するには、結局、IOモナドか、Cleanの一意型か、
それに代わる何か新しいメカニズムが必要になる
851 :
799:2008/02/17(日) 01:39:54
>>850 な〜るほど!
ひょっとしてunsafePerformIOを使いまくって
>>814 の言う邪悪なIOライブラリを作れば、
Haskellのままでもいいかもしれませんねw
もう屁みたいな例をたくさんあげられるのはウンザリだよ。
こうしよう、C(ほかの言語でもいい)からHaskellに乗り換えるために十分な
説得力を持つ実務的な例を1つだけあげてくれ。
darcs
854 :
799:2008/02/17(日) 01:55:42
> HaskellやMLなどの関数型言語での再帰下降構文解析の実装は特に簡単である。
っていうのはウソっていうのはどっかでみたなw
>>854 実際、言語処理系には向いてる。
構文解析だけじゃなく、コンパイル過程での構文木の操作とかに
代数的データ型とパターンマッチがぴったりハマってかなり綺麗に書ける
(MLも同様。代数的データ型じゃなくてバリアントという名前だけど)。
言語処理系は、基本的にツリーの変形みたいな
I/Oを伴わない数学的な処理が多いから、という理由づけもできるかな。
857 :
799:2008/02/17(日) 02:08:10
Haskellというか、関数型言語の魅力としては、
>>803 のリンク先を読めばかなり納得できると思う。
Haskellの言語仕様にunsafeとかFFIとかってあったっけ?
GHCの仕様じゃないの
じゃあ、Haskellは純潔を失ったというわけだ
ハードリアルタイムアプリはHaskellでは無理
実時間要求とメモリを直接利用するアプリケーション以外はHaskellでおk
仮想メモリとかOS必須じゃn
Haskell (International Computer Science Series) (ペーパーバック)
Simon Thompson (著)
# ペーパーバック: 528ページ
# 出版社: Addison Wesley; 3Rev Ed版 (2008/9/15)
# 言語 英語, 英語, 英語
# ISBN-10: 0201882957
# ISBN-13: 978-0201882957
# 発売日: 2008/9/15
今度こそ発売?
参照透明性を保証しないと、グラフ簡約が使えなくね?
使えなくはないと思うが、何で?
869 :
デフォルトの名無しさん:2008/02/18(月) 20:15:31
>>642 データ構造とアルゴリズムをまとめるだけなら、それこそ関数型言語の得意分野だし、
手続き型の世界でも、メッセージメタファって何それ、なgeneric programmingが幅を利かせている。
その分なおさら、状態と手続きをまとめるSmalltalk的なオブジェクト指向が
影響力を増しているように思う。
>>654のAlan Kayの言葉は、実行順序への依存性が下がること
(これはメッセージメタファ、イベント駆動から自然に出てくる)と、
参照透明という意味で状態を全く持たないことを(故意に?)混同している。
ハードウェアリアルタイム処理って言葉にすれば
Haskellはかなりいけそうな感触なんだけどなぁ
>>868 形式的な表現が同じでも、値が同じことの保証がなくなるから。
>>871 副作用を入れるなら当然それは覚悟の上じゃないのか
>>872 副作用を入れてもいいのは、値がユニット型の関数だけにしないと破綻するだろ。
874 :
デフォルトの名無しさん:2008/03/09(日) 07:06:26
>>874 暗号に見えていたのが、何の変哲もないプログラムとして認識できるようになったら卒業だな。
876 :
874:2008/03/09(日) 19:04:29
>>875 そうですか…
1日がかりで解けたので初心者卒業かと思ったのですが…orz
何の変哲もないプログラムに見えるように精進しますw
何の変哲もないように見える必要はないと思うが解くのに1日がかりはまだ初級者の域か。
悩むところが見当たらん
おれはもうだめだ
flip id "\n"が悩むところじゃないか?
なぜ($"\n")と書かないんだろう
Prelude> ($ "789") $ ($ (($ "456") $ ($ "123") $ (++))) $ (++)
"123456789"
スタックマシンみたいだ(w
便利だなこれ
\a -> hoge a 4 ()
flip (flip hoge 4) ()
($ ()) . ($ 4) . hoge
>>881 ああ、そうやってカリー化できるんだ。目から鱗が落ちたよ。
引く手あまたのプログラミング言語は?
http://slashdot.jp/developers/article.pl?sid=08/04/06/2313251 ---
Java(16479件)、C++(8080件)、C#(7780件)、JavaScript(6749件)、
Perl(5710件)、PHP(2641件)、Python(1408件)、COBOL(1207件)、
Ruby(769件)、Lisp(33件)といった感じらしい。
とりあえずJavaとC/C++/C#、あとJavaScriptを覚えれば、
当分仕事には困らないようである。COBOLのしぶとさも目立つ。
ちなみにHaskellやOCamlの求人は10以下だったそうだ。
---
仕事でプログラムやってるやつなんて
この板にいるの?
ええっ?ほとんどプログラム関連の人じゃないの?
プログラム関連の研究を仕事でやってる人はいるかもしれないが
この「板」にはいくらでもいるだろう>仕事でプログラムやってるやつ
このスレに限れば、仕事と直で結びつきにくい言語かもしらんけど
でも仕事でプログラムやる傍ら、趣味や素養のためにHaskell弄ってる奴も珍しくはないんじゃなかろうか
俺は研究職だが仕事でHaskell使ってる。
889 :
デフォルトの名無しさん:2008/05/25(日) 22:21:03
\yってyを含まないって意味だっけ?
Haskellの\はlambda
\y -> e で、yからeへの関数
逆ポーランド記法で日本人に優しいとか言ってみるRPHaskellとか作って
「初心者のためのプログラミング言語ガイド」スレに
Haskellを狂信的に勧めるやつが現れてスレがめちゃくちゃに。
>>893 信者と信者っぽく振る舞ってネタにしてる奴と2種類いるようだな。
Haskellの入門書は、ふつうのHaskellプログラミングでおk?
Erlangにすればいいんでない?
>>897 本の方がわかりやすいと思うがWebの方を読んで理解できるレベルなら
それでいいと思う。お金かかんないし。
ふつうのHaskellは馬鹿でも判るって意味では良書かな
その程度に敷居も得られる知識も低い
道具として使うには十分
論文書きたいなら書籍より論文読めよ
ふつけるよりも入門Haskellのほうが目から鱗的な部分があって楽しいと思う
birdのhaskell本が入門書としては最強らしいよ
Haskell界隈にも
>>901みたいな厨が流入してくるとは隔世の感。
>>905 このスレには昔からいただろww( ^ω^)
本スレ落ちたのか?
こちらが本スレです
無駄スレ立てるなや。
クマの勉強会はまだか?
関西で勉強会やってみる?
関西はかなり遠いなぁ
915 :
デフォルトの名無しさん:2009/08/21(金) 00:34:14
唐揚げ
なんか本スレ落ちてね?
本スレは粉微塵になって死んだ
なぜだっ
981を越えてただけじゃないか
ここも時期粉微塵になる……
気のせいか最近関数型言語の人たちが輝いている。
時代
日本語本が出るみたいだから俺もHaskellの勉強を始めるわ
一方で貧乏人は英版のgoogleでググった
yo
>>925 大枚叩いてRWH買ったわ
電気代払えなくなった
だれかオライリーの本買った?
感想ヨロシク
931 :
デフォルトの名無しさん:2010/01/10(日) 22:31:50
買ったけど途中で挫折した
だけどもう一回挑戦する
買ってないけど霧中で挫折した
だけども、一回挑戦する
6.12ベースのHaskell Platformでたら再開する予定
935 :
デフォルトの名無しさん:2010/01/13(水) 01:08:39
Java >>>>>>>>>>> 2^100000000000000000000000000000ポテンシャル障壁>>>>>>>>>>>>>haskell
936 :
デフォルトの名無しさん:2010/01/13(水) 01:10:37
haskellはごみ、いや、ごみいか
darcsのおかげで目がさめた。遅い、不安定、結果として使い難い。
確かにdarcsは遅いが、設計自体が古いのも原因だろうな
何にしてもHaskellへの盲目的信仰から抜けられてよかった。ありがとうdarcs!
俺はガチガチに静的チェックされた完璧なクソを作りたいのではなかったのだ。
つまりJavaをやめてPythonにするんだな?
>>935はモナドだな。Javaの後にHaskellをやるということか。
>>935 ラムダ計算を理解しないとHaskellはできないので、JavaからHaskellまでの間に非常に大きなポテンシャル障壁がある。
遅延評価のせいでサンクが肥大化するので、アルゴリズムが悪くメモリが小さいと、Haskellをやる前にオーバーフローするだろう
Javaをやめるといったように読めたわけ?信仰ってこわいね
それともわざとJavaに話をすりかえたの?それも狂ってるね
ラムダ抽象とか簡約とか覚えないと使えない言語じゃ
いつまでたってもデカいシステムつくれないんじゃ
>>945 デカいシステムを作るのが目的ではないし、
ラムダ計算を知らなくても使えないことはない
しかし知っているに越したことはない
>>945 それにデカいシステムを簡潔に書けるのが関数型言語の強みだ。
しかしできあがったものがクソ遅くて不安定で使いものにならないのが純粋関数型の弱みだ。
嫌なら使わなけりゃいいじゃない
お前はAPLも使ったことないだろ?
APLは昔つかってたけど。もうJに乗りかえちゃってるけどな。
なんだ別人か
LispにしろHaskellにしろ、関数値を表現する記法に採用しているというだけで、
λカリキュラスはどうでもいいからな。
キャベツを千切りにします
肉を炒めます
千切りのキャベツを加えて半生程度にサラッと炒めます
ご飯に乗せてしょうゆかける
最後にマヨネーズをたっぷりかけて完成
darcsは存在自体が害悪マジで消えてくれ
この言語ばっかり使っていると脳ミソが退化するね。
危険だ。
脳みそが変容したら凄すぎですがな
958 :
デフォルトの名無しさん:2010/03/04(木) 12:25:40
( ´・ω・`)
959 :
デフォルトの名無しさん:2010/03/13(土) 02:41:54
(´・ω・`)
IO処理を他人に丸投げしておいて
「副作用はありません」
てズルイと思います
てめぇドサクサにまぎれてOOサンもdisってんじゃねぇよ
実際に副作用がないんだから仕方ない
博士専用言語ワロタ
モナドがゲーム出演と聞いて
あまりの過疎スレぶりに(ry
だよね、よくこれで本をだす出版社があるよな
それは本買った俺をディスってんのかよ
スレタイが良くない!
初心者を助けてくれる、do記法展開ツールとかないかなー
do {[1,2];a <- [3,4];return a}
この結果は[3,4,3,4]
何が起こった!!何故殺した!って言いたい
[1,2] >> [3,4]が[3,4,3,4]になる訳か、リストモナドを誤解していた。把握した!
[1,2] >>= (\x -> [3,4]) >>= return
こういう置き換え、あんまり得意じゃないから、
やってみた。
違うか。
こっちか。
[1,2] >>= (\_ -> [3,4]) >>= \a -> return a
おお、どうも。参考までに一応上の結果に辿りつくまでの流れを書いとくよ
仕様通りに解釈すると
[1,2] >> (let ok x = case x of {a -> return a; _ -> fail "...";}in [3,4] >>= ok)
_はパターンマッチでかぶってる言われるので省略すると
[1,2] >> (let ok x = return x in [3,4] >>= ok)
ラムダにしてみると(ここ、少し自信ない)
[1,2] >> [3,4] >>= (\x -> return x)
右の式をη変換
[1,2] >> [3,4] >>= return
モナドの性質より
[1,2] >> ([3,4] >>= return)
モナドの性質より
[1,2] >> [3,4]
Template Haskell で仕様通りに do 記法展開
出力が不親切で入力がハードコードだけど…
{-# LANGUAGE TemplateHaskell #-}
import Language.Haskell.TH
expr = [| do
[1,2]
a <- [3,4]
return a
|]
main = runQ (undo expr) >>= putStrLn . pprint
undo :: ExpQ -> ExpQ
undo expq = do
DoE stmts <- runQ expq
toExpQ stmts
toExpQ :: [Stmt] -> ExpQ
toExpQ [NoBindS expr] = return expr
toExpQ (BindS pat expr : xs) = do
sym <- newName "x"
infixE (Just (return expr)) (varE (mkName "GHC.Base.>>="))
(Just (lamE [varP sym]
(caseE (varE sym)
[ match (return pat) (normalB (toExpQ xs)) []
, match wildP (normalB (appE (varE (mkName "GHC.Base.fail")) (litE (stringL "...")))) []])))
toExpQ (LetS decls : xs) = letE (map return decls) (toExpQ xs)
toExpQ (NoBindS expr : xs) = [| $(return expr) >> $(toExpQ xs) |]
面白そうだけど、何をやっているのかさっぱりわからんぬ
978 :
デフォルトの名無しさん:2010/10/03(日) 23:21:52
驚愕、天使は巨乳だった