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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2010/04/29(木) 19:15:28
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/
・2chの仕様により、行頭の半角スペースは表示されません。
 コードをインデントしたいときは、代わりに または全角スペースを使うことができます。
0159デフォルトの名無しさん2010/05/19(水) 00:50:37
>>157
その目標とその候補であれば「関数プログラミングの楽しみ」を薦める。

>>158
本には人のソースが載ってるし、
なぜそのソースになったのかの解説もついてるんだがな。
練習問題も載ってるし。
何か問題があるのか?

さすがに完成されたソースが丸ごと一式載っていることはまずないが、
「関数型言語らしいプログラミング」を学ぶのにソース丸ごと一式は要らないだろ。
そもそも、何が関数型言語らしさを作っているのかを知らないまま、
実際にコーディングしたり人のソース読んでも、分からないままだと思う。
0160デフォルトの名無しさん2010/05/19(水) 01:18:02
>>156
そういうレスがあるとは思っていた。尼のギフトカードの残高で丁度中古の
「ふつうの〜」が1冊買えたんだよね。だから一層のこと揃えてみただけ。

ただ最初の2冊で分かりにくかったことが、サラっと「ふつうの〜」に説明して
あったりして、最初に読んどけば良かったなと。
0161デフォルトの名無しさん2010/05/19(水) 01:19:12
>>159
人のソースはともかく、自分でコーディングしてみないと結局伸びない
0162デフォルトの名無しさん2010/05/19(水) 07:24:30
>>160
> ただ最初の2冊で分かりにくかったことが、サラっと「ふつうの〜」に説明して
> あったりして、最初に読んどけば良かったなと。

そういう読み方のタイプも普通にあるし、推奨している読書テクニック本もある。
難解な本を読んで、ある部分が難しかったら、別の一段レベルが低い本を読んで、
それから先の本に再チャレンジする。
0163デフォルトの名無しさん2010/05/19(水) 07:49:47
>>161
コードをただ書くだけで伸びるってものでもないけどな
インプット(読む)とアウトプット(書く)は両方あった方がいい
0164デフォルトの名無しさん2010/05/19(水) 08:17:38
学びて思わざれば則ち罔し。思いて学ばざれば則ち殆うし。
0165デフォルトの名無しさん2010/05/19(水) 08:34:40
他の言語だけどCoq'Artみたいな本だと書きながら読まないと意味不明になって挫折する
0166デフォルトの名無しさん2010/05/19(水) 08:45:55
伸ばす方向と方法が分かってないと、効率悪いよ。
それが本の役割だと思う。
0167デフォルトの名無しさん2010/05/19(水) 14:28:50
効率悪いよ。
0168デフォルトの名無しさん2010/05/19(水) 15:57:33
どう書く?.org http://ja.doukaku.org/ の問題を解いてみたり他人の解答読んだりするのはどう。
0169デフォルトの名無しさん2010/05/19(水) 16:00:58
Software Designの記事読んでたら、なぜかnobsunがHaskellプログラミングの第一人者って書かれてるw
おいおいって感じw
0170デフォルトの名無しさん2010/05/19(水) 16:29:15
>>169
nobsunって誰?と思ってググってみたらツイッターやってて
しかもHaskell公式のマークを上下ミラーリングして(λ→y)
自分のマークにしちゃっててワロタ
0171デフォルトの名無しさん2010/05/19(水) 16:33:31
nobsun、論文も書いた事ないような奴が第一人者気取りかよw
笑っちゃうぜ
0172デフォルトの名無しさん2010/05/19(水) 16:40:55
2ちゃんねるで吠えるだけの奴が「笑っちゃうぜ」ってのが一番笑えるなw
0173デフォルトの名無しさん2010/05/19(水) 16:44:21
>>171
まぁ、プログラミングの分野は論文がすべてじゃないからね。
ソフトウェア論文がいかに評価されないか、研究者ならみんな知ってるはず。
0174デフォルトの名無しさん2010/05/19(水) 16:49:50
nobsun は「RWH」と「関数プログラミングの楽しみ」の翻訳やってる。
日本でのエバンジェリストとしての第一人者だね。
0175デフォルトの名無しさん2010/05/19(水) 16:53:34
nobsunはHaskellで新規性ある何かをやったの?
開発手法を編み出したとか
斬新なソフトを書いたとか
ツールを開発したとか
Haskellコンパイラのすごい最適化エンジンを実装したとか、
なにか無いの?
0176デフォルトの名無しさん2010/05/19(水) 16:54:13
nobusunこと山下伸夫さんはsampou.orgの管理者で
ふつうのHaskellプログラミングの監修もしていますね。
どう見ても日本のHaskellプログラミングの第一人者です。
笑っちゃった人は自分の無知を自覚すべきだと思います。
0177デフォルトの名無しさん2010/05/19(水) 16:55:27
>>176
俺の答えは、日本にはマトモなHaskellerはいない、って事だよ。
0178デフォルトの名無しさん2010/05/19(水) 17:34:06
RT @_tad_: 懇親会終盤「この中でGCに興味のある方、ちょっと挙手お願いします」→「ありがとうございます。では片付けをよろしくお願いします」 #rubykaigi ※この物語はフィクションです
0179デフォルトの名無しさん2010/05/19(水) 17:47:32
nobsunはHaskellでうまいこと金儲けてる人
白石さんはHaskellに人生食われちゃってる人

0180デフォルトの名無しさん2010/05/19(水) 20:32:16
>>179
評価が早計だな
もっと評価を遅延すべき
0181デフォルトの名無しさん2010/05/19(水) 20:42:40
>>180
つまり、宇宙の終りの時に初めて評価されるんですね
0182デフォルトの名無しさん2010/05/19(水) 20:42:45
>>177
その中の第一人者ってことでいいだろ
所詮相対評価だ
0183デフォルトの名無しさん2010/05/19(水) 20:43:15
プログラマーというのは実践家で、スポーツ選手みたいなものだから、
新しいことをしなくても、技のレベルが高ければ評価は高くなると思う。

Haskellの技とは? とかnobsunはレベルが高いのか? はおいといて。
0184デフォルトの名無しさん2010/05/19(水) 20:56:47
Software Design に、関数型言語ではHaskellが一番ユーザーが多いと書いてあったんですが、本当でしょうか?
0185デフォルトの名無しさん2010/05/19(水) 20:58:10
>>184
Lispの方言を別の言語として数えればそうかもね
0186デフォルトの名無しさん2010/05/19(水) 21:05:09
>>184
んなわけあるかいw

と言ってしまえばその記事と同じなので
ちゃんと調査が必要ですね。
0187デフォルトの名無しさん2010/05/19(水) 21:05:46
そういう話をするとocamlの人が雪崩れ込んでくるから
0188デフォルトの名無しさん2010/05/19(水) 21:52:17
>>184
純粋関数型言語では一番多いんじゃね?
0189デフォルトの名無しさん2010/05/19(水) 21:59:20
選択肢はほぼ2択に絞られる・・・
0190デフォルトの名無しさん2010/05/19(水) 22:14:50
純粋で非正格な関数型言語では一番多いんじゃね?
0191デフォルトの名無しさん2010/05/19(水) 22:35:30
>>189
もう1つって何?
Concurrent Clean?
Lazy K?
0192デフォルトの名無しさん2010/05/19(水) 22:59:01
>>191
λ
0193デフォルトの名無しさん2010/05/19(水) 23:03:52
立ち読みしたけど、
関数型言語を始めるなら純粋な言語がいいという理由でHaskellを勉強する人が一番多い
みたいなことがSoftwareDesignに書いてあった気がする
0194デフォルトの名無しさん2010/05/19(水) 23:22:13
俺としては関数型言語初心者はML系の方がいいんじゃないかと思うけどなぁ
0195デフォルトの名無しさん2010/05/19(水) 23:45:10
実用レベルのプログラムを書くのでなければ、Haskellの方が楽だと思う。

前方参照できる
let/let recの区別が不要
deriving (Eq, Show)がある
インタプリタが使いやすい
方言がない
構文がCに似ている
--makeで万事よろしくやってくれる
0196デフォルトの名無しさん2010/05/19(水) 23:46:25
SoftwareDesignといえば、Haskellで書いたWEBサーバが紹介されてましたけど、
JavaのTomcatみたいに、サーバ部分とは独立して作ったアプリケーションを追加していくようなサーバコンテナってないでしょうか

それとも、関数型言語だから、Mighttpdみたいなサーバでも、TomcatみたいなWEBサーバコンテナになるのでしょうか
0197デフォルトの名無しさん2010/05/20(木) 06:31:10
>>196
Tomcatがどんなものか知らないが、お遊びのウェブアプリケーションを書くならhackがおすすめ。
リクエストをレスポンスに変換する関数を書くだけでウェブアプリケーションを実装できる。
バックエンドのサーバはFastCGIやhappstackなどアダプタさえあれば何でもいい。
本格的なウェブサービスを構築するにはそもそもHaskellを使うべきかどうかが問題。
0198デフォルトの名無しさん2010/05/21(金) 10:38:06
Hac ΦのΦって何だよと思ったらPhiladelphiaのphiか
0199デフォルトの名無しさん2010/05/21(金) 21:12:53
実用にならないプログラムって…
0200デフォルトの名無しさん2010/05/21(金) 21:20:07
>>199
実用にならないというか、production-qualityでないプログラム。
具体的には、Haskellに多い実験的なライブラリや、
品質上の理由でミッションクリティカルな用途に耐えないインターナルなソフトウェアなどが含まれる。
0201デフォルトの名無しさん2010/05/21(金) 21:35:37
Haskellにもブレークポイントを張ったりステップ実行できるデバッガが欲しいな。
1ステップ = WHNFの1-stepリダクションで。
0202デフォルトの名無しさん2010/05/21(金) 21:36:47
品質とは具体的にセキュリティや堅牢性など。
ソフトウェアアーキテクチャの文脈で定義される品質属性すべて。

製品に使われた実績の少ないプラットフォームは一般にエコシステムが弱いので、
製品に使うには不適当。
0203デフォルトの名無しさん2010/05/21(金) 21:40:47
ところでLLVMバックエンドが話題になっているが、
LLVMというのは本格的なシステムの運用に使えるようなものなのか?
0204デフォルトの名無しさん2010/05/21(金) 21:44:34
>>201
一応 ghci でブレークポイント張ったりステップ実行できるけど、
ステップ単位は望んでるものではないな。
0205デフォルトの名無しさん2010/05/21(金) 22:10:12
>>201
と思ったけど、改めて使ってみたら結構ステップ単位が細かい。
もしかしたら望んでるものに近いかも知れんぞ。

「1ステップ = WHNFの1-stepリダクション」が具体的に
どういうステップ単位かよく分かんないけど。
0206デフォルトの名無しさん2010/05/22(土) 08:04:20
どんなときに必要なの? 30行もいくような関数でもつくってるの?
0207デフォルトの名無しさん2010/05/22(土) 13:46:27
>>206
文脈から察するにデバッガのことか。

自分ではちゃんと動作するはずだと思い込んでて、
紙と鉛筆で簡約のステップを書いて確かめた(証明した)はずなのに、
何故か上手く動かない(実際には証明されていない)時なんかに役立つ。
IO 以外のモナドで do 表記をしている時とか、例外が発生する時とか。

そもそも紙と鉛筆による簡約が面倒な時。
特にGUIを使ってる時は面倒だ。

外部入力の値を確かめる時。
print や GUI で確認表示するコードをいちいち挿入して、後で取り除くよりも、
デバッガで確かめた方が早くて安全な場合もある。

ただ、ghci のデバッガは無いよりマシ程度のものなので、
願わくばもっと使いやすい本格的な Haskell デバッガが欲しいな。
できればビジュアルなもので。
0208デフォルトの名無しさん2010/05/22(土) 15:59:19
>>207
なるほど 解説サンクス
0209デフォルトの名無しさん2010/05/22(土) 16:00:31
ハスケラーさんたちも紙と鉛筆で練るのか。リスパーちゃんたちと同じだな。
0210デフォルトの名無しさん2010/05/22(土) 16:02:30
λ式ってPCで書くにはLaTeXがないと書きにくいもんねw
手のほうが楽でいいよ。
0211デフォルトの名無しさん2010/05/22(土) 16:08:00
ちなみに使ってるノートって 方眼系? ただの白紙? 罫線系?
0212デフォルトの名無しさん2010/05/22(土) 16:12:53
モールスキン
0213デフォルトの名無しさん2010/05/22(土) 16:13:36
やっぱ知的=モールスキンでしょ。
見た目だけ知的w
0214デフォルトの名無しさん2010/05/22(土) 16:33:04
ちら裏コピー裏をクリップでとめたもので十分だろ
近所回って回収してくりゃあっという間に段ボール10箱分ぐらい集まるし
0215デフォルトの名無しさん2010/05/22(土) 16:44:25
>>211
secion系。
私はあまりたくさんのノートを書かず、そしてグラフィックの割合が高いからだ。
0216デフォルトの名無しさん2010/05/22(土) 17:16:53
>>215
Haskellプログラミングに使うノートの話をしているんだが。
0217デフォルトの名無しさん2010/05/22(土) 18:04:36
今更ながらHaskell-Beginersに入ってみたんだけど色々話題が出てていいね。
0218デフォルトの名無しさん2010/05/22(土) 18:56:24
>>216
http://www.amazon.co.jp/dp/B001NDOO8C
0219デフォルトの名無しさん2010/05/23(日) 02:58:48
HN で新しいウェブフレームワークが話題になってた

http://news.ycombinator.com/item?id=1369852
0220デフォルトの名無しさん2010/05/23(日) 07:03:16
>>219
> A fast HTTP server library with an optional high-concurrency backend using the libev event loop library.
これは期待できそうだな
0221デフォルトの名無しさん2010/05/29(土) 03:28:11
http://hackage.haskell.org/package/haskell-cnc

Intel さんって色んな事やってるのね…
0222デフォルトの名無しさん2010/05/29(土) 08:44:51
今度Haskellの入門的な話をすることになったんだけど、
Haskellはじめての人が理解しにくいところってなんだろう?

自分の場合、ラムダ計算やPCFを先にやってたから入りやすかったが、
この辺を知らない人がいきなりHaskellに接したときにつまづくところ
があったりするのかな?

0223デフォルトの名無しさん2010/05/29(土) 09:30:14
>>222
どんな人を対象に話すのかで変わると思うよ。
相手が計算機科学の人なのか? プログラミング言語をひとつくらい習得している
人なのか?まったくの素人なのか?
とかね。
0224デフォルトの名無しさん2010/05/29(土) 09:33:28
>>222
やっぱモナドじゃね
0225デフォルトの名無しさん2010/05/29(土) 09:51:06
変数を一つだけしか受け取れないとかの原則論がわからんかった。
どうしても多変数脳から脱却出来ん。
0226デフォルトの名無しさん2010/05/29(土) 10:15:51
>>223
C, Javaについて一通り習った人が相手です。

>>224
モナドですか…さすがに初回からはきついかも。

>>225
なるほど。
その辺、可換図式でも使って説明しますかね。
0227デフォルトの名無しさん2010/05/29(土) 11:44:57
俺が苦労したのはラムダ式、高階関数、再帰の三つかな
これらがいくつか組み合わさったコードを見ると途端に混乱するということがあった
それぞれ単独でみれば難しくないし、再帰は既に知ってるだろうし、他も教えられればすぐに理解できるだろうけど、
自在に読み書きできるようになるには時間が必要で、最初のうちはfoldrの定義なんかすごく難しく見えると思う
0228デフォルトの名無しさん2010/05/29(土) 11:59:01
どうせ触りだけ話すんだろうから、モナドはあまり触れなくてもいいかもね。
c,java系の人なら関数型特有にみえることはわかりにくいかも。
30分で話すとか10分で話すとかなら簡単なことしか話せないだろうしね。
でも高階関数あたりは欲しいかもね。
0229デフォルトの名無しさん2010/05/29(土) 12:00:14
C/JAVA の人ってloopyだし非loopyのhaskellの世界は戸惑うだろうな。
0230デフォルトの名無しさん2010/05/29(土) 12:02:57
モナドは IO 以外は使わなくても説明できるからとりあえず置いておけばいいんじゃないかな。
IO も、こう書くものだ、で済ませるか、対話環境だけ使うことにするとか。
個人的には、いちばん理解しにくいのは関数適用だけでプログラムを書くということだと思う。
ループしながら変数に代入、みたいなのから
map して filter して fold になかなか切り替えられない。
0231デフォルトの名無しさん2010/05/29(土) 12:06:53
hello, worldについては気にしないでください、で最初は押し切ってしまうとか。
入力ができないのがプログラムの題材的にちょっと辛いけど。
0232デフォルトの名無しさん2010/05/29(土) 12:07:11
Haskellの話を聞いてくれる気になってるなら
一番高い壁はクリアじゃね?
0233デフォルトの名無しさん2010/05/29(土) 12:15:44
>>230
> ループしながら変数に代入、みたいなのから
> map して filter して fold になかなか切り替えられない。

リストの長さを出すのに「各要素を1に変えて合計」ってのは受けるぞ
0234デフォルトの名無しさん2010/05/29(土) 12:25:52
>>233
その前にsumをfoldで定義することが関数型特有じゃないか?
0235デフォルトの名無しさん2010/05/29(土) 12:36:29
ぱっと見で何の役に立つのか分かりづらい機能について
実例を見せると納得してくれる
0236デフォルトの名無しさん2010/05/29(土) 13:12:18
逆に、CやJavaについて一通り習った相手が、
一番惹かれそうなものは何かというアプローチはどうだ?

そこに、一番分かりにくいものを絡めていくとか。
0237デフォルトの名無しさん2010/05/29(土) 13:50:07
たらいがそのままで爆速
0238デフォルトの名無しさん2010/05/29(土) 14:35:07
>>236
quick sortちゃう?
0239デフォルトの名無しさん2010/05/29(土) 14:53:31
副作用とhaskellやc/java のこともかも
0240デフォルトの名無しさん2010/05/29(土) 15:19:22
>>236
とりあえずトランザクション制御とか
0241デフォルトの名無しさん2010/05/29(土) 15:27:54
逆に素人にCやJavaの話するときって何話すの?
0242デフォルトの名無しさん2010/05/29(土) 15:43:40
まずはhello, world
0243デフォルトの名無しさん2010/05/29(土) 16:01:14
>>241
フォンノイマンの死に様
0244デフォルトの名無しさん2010/05/29(土) 16:04:12
まぁ、社交の基本だけど、何か専門的な事を素人に話す場合、
人物を語るのが一番良い印象を与えやすいんだよね。
関数がどうのこうのと技術的な話なんて興味を持つ動機には成り得ないよ。
0245デフォルトの名無しさん2010/05/29(土) 16:16:09
えー?
人物について語るのって専門の話を回避するテクニックであって、
専門的な事を話す目的があったらそれじゃダメじゃん。
0246デフォルトの名無しさん2010/05/29(土) 16:16:28
>>241-244
何に対しての「逆」を想定してるんだ?

>>222,226 の逆であれば、Haskell を一通り習った人が
CやJavaの素人に入門的な話をするという事だと思うが、
それなら Hello, World も、人物の話も、
それほど適切ではないような気がするが。
0247デフォルトの名無しさん2010/05/29(土) 17:43:23
Haskellから入門するって、従来では考えられなかったケースだからね。
データ構造にしても、可変の方がはるかに蓄積が多いから、まず不変を学習してから可変に移るというのは異常。
0248デフォルトの名無しさん2010/05/29(土) 20:46:07
みなさん、ありがとう。

あれから、つまるところ関数型言語の本質はなんだろう、などと考え始めて
1日つぶれてしまいました。

余り大上段に構えず、こんな便利なことができる、程度の紹介にとどめておいた方がいいですね。
とりあえず高階関数だけはおさえておこうと思います。
0249デフォルトの名無しさん2010/05/29(土) 20:48:03
Software Design の、この前出た号に、ちょうど特集がある。
0250デフォルトの名無しさん2010/05/29(土) 20:49:15
>>249
あれはあんまり参考にならんぞw
考え方が偏りすぎている
0251デフォルトの名無しさん2010/05/29(土) 21:15:12
そもそもHaskellerに中立的な視点の人なんているのか?
0252デフォルトの名無しさん2010/05/29(土) 21:21:09
この世の誰一人として社会的中立な人間なんていないと断言できる。
だってその人自身が社会を構成する人間の一人なんだから。
0253デフォルトの名無しさん2010/05/29(土) 21:37:21
>>248
高階関数と再帰の具体例を挙げて関心を持ってもらうストーリーがよさそうですね。
あとは「変」数じゃなくって…って話かな。

C言語の人は関数ポインタを使うのとどう違うの?とか聞いてくるかもしれませんね。
え?そんなビギナーの聴衆はいないって?w
0254デフォルトの名無しさん2010/05/29(土) 21:40:35
>>248
関数型言語の本質はラムダ計算にある。
0255デフォルトの名無しさん2010/05/29(土) 21:42:04
>>253
遅延評価なんだから無限リストも。
0256デフォルトの名無しさん2010/05/29(土) 22:02:37
関数ポインタでは書けなくて、高階関数が必要な例ってあるのかな?
0257デフォルトの名無しさん2010/05/29(土) 22:03:53
無限リストは他の関数型言語を知っている人でもなかなか理解しにくくない?
俺は A Gentle Introduction to Haskell の fibs の例はなかなか理解できなかった。

>>247
既存のアルゴリズム本を参考にして
リストに (!!) でアクセスしまくるコードを書いて来た人を思い出した
0258デフォルトの名無しさん2010/05/29(土) 22:39:43
無限リストといえば、ストリームや遅延パターンの話でよく例示される
server と client のプログラムを理解するのに時間がかかったな。

紙に鉛筆で簡約ステップを書き下して正しいと頭では分かっていても、
初めは問題なく動くのがなんか不思議な感じだった。
ああいうのをスラスラと例示できるようになりたいな。
■ このスレッドは過去ログ倉庫に格納されています