関数型プログラミング言語Haskell Part20
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2012/10/17(水) 08:08:28.97ttp://www.haskell.org/
日本語サイト
ttp://www.sampou.org/cgi-bin/haskell.cgi
ttp://www.shido.info/hs/
過去ログ
関数型プログラミング言語Haskell
Part1 ttp://pc.2ch.net/tech/kako/996/996131288.html
Part2 ttp://pc2.2ch.net/test/read.cgi/tech/1013846140/
Part3 ttp://pc8.2ch.net/test/read.cgi/tech/1076418993/
Part4 ttp://pc8.2ch.net/test/read.cgi/tech/1140717775/
Part5 ttp://pc8.2ch.net/test/read.cgi/tech/1149263630/
Part6 ttp://pc11.2ch.net/test/read.cgi/tech/1162902266/
Part7 ttp://pc11.2ch.net/test/read.cgi/tech/1174211797/
Part8 ttp://pc11.2ch.net/test/read.cgi/tech/1193743693/
Part9 ttp://pc11.2ch.net/test/read.cgi/tech/1211010089/
Part10 ttp://pc12.2ch.net/test/read.cgi/tech/1231861873/
Part11 ttp://pc12.2ch.net/test/read.cgi/tech/1252382593/
Part12 ttp://hibari.2ch.net/test/read.cgi/tech/1272536128/
Part13 ttp://hibari.2ch.net/test/read.cgi/tech/1286706874/
Part14 ttp://hibari.2ch.net/test/read.cgi/tech/1299385928/
Part15 ttp://hibari.2ch.net/test/read.cgi/tech/1310199414/
Part16 ttp://toro.2ch.net/test/read.cgi/tech/1317958045/
Part17 ttp://toro.2ch.net/test/read.cgi/tech/1325510368/
Part18 ttp://toro.2ch.net/test/read.cgi/tech/1331902463/
Part19 ttp://toro.2ch.net/test/read.cgi/tech/1340760070/
0083デフォルトの名無しさん
2012/10/24(水) 19:14:58.53どのような場合に先の型を書き、
どのような場合に後に型を書くと良いのでしょうか?
何か簡単な事例を挙げていただけると助かります。
0084デフォルトの名無しさん
2012/10/24(水) 19:17:54.500085デフォルトの名無しさん
2012/10/24(水) 19:25:28.550086デフォルトの名無しさん
2012/10/24(水) 19:26:10.200087デフォルトの名無しさん
2012/10/24(水) 19:38:04.480088デフォルトの名無しさん
2012/10/24(水) 19:52:22.720089デフォルトの名無しさん
2012/10/24(水) 19:59:05.000090デフォルトの名無しさん
2012/10/24(水) 20:09:30.95そう思う根拠は?
0091デフォルトの名無しさん
2012/10/24(水) 20:40:10.35そう思う根拠は?
0092デフォルトの名無しさん
2012/10/24(水) 20:45:05.320093デフォルトの名無しさん
2012/10/24(水) 20:53:26.270094デフォルトの名無しさん
2012/10/24(水) 20:57:36.06ただちに書かなくていいことは後で書く
テスト駆動も、制約に合わせて書くというより
関係ないコードを書かないことで間違いを減らしている気がする
0095デフォルトの名無しさん
2012/10/24(水) 21:04:30.70好きにすればいいと思うけど、俺の基準を挙げるなら、
トップレベルの定義は先に思い付いた方から書く
・普通は型の方が簡単なので型から書くことが多い
-- | 標準正規分布に従う乱数を生成する
randomNormal :: StdGen -> (Double, StdGen)
・定義が頭にあるのに型がすぐに思い付かないor面倒なら定義から
forceTell x = rnf x `seq` tell x
forceTell :: (MonadWriter w m, NFData w) => w -> m ()
ローカル変数は定義から書く。型は必要なときだけ後から書く
0096デフォルトの名無しさん
2012/10/24(水) 21:06:43.98そもそも、「式」とは何?
それをはっきり定義しないと、where が式なのかどうか判断できないだろ
0097デフォルトの名無しさん
2012/10/24(水) 21:10:37.15・whereは式じゃない。宣言やcase選択肢の一部
・Haskellに「文」は存在する。do式の中に並んでいるのがそれ
0098デフォルトの名無しさん
2012/10/24(水) 21:14:38.02書くかどうかは気分(ローカルで型推論がうまく働かなきゃ書く)。
>>80 の型から先に書くというのは、そういう意味で俺は無意識に拡大解釈したけど、
例に出したテスト駆動の方は実際に書かなきゃ意味ないなぁ、どうなんだろ。
(テスト駆動の方も、コードの内容よりテストから先に「考える」と言えばそうだろうが)
0099デフォルトの名無しさん
2012/10/24(水) 22:07:48.31SQLなら
0100デフォルトの名無しさん
2012/10/24(水) 23:39:27.46渡してるのが Vector なんだから Vector の方の tail だって推測してくれても良いんじゃないの?
分からず屋!
0101デフォルトの名無しさん
2012/10/26(金) 07:50:23.40良かったら使ってください
(ネットで都合良く使えそうな関数見つけて、Cで良いのに意地になって作っちゃった)
import Data.Time
import System.Process
import System.Environment
import System.IO
main = getCurrentTime >>=
(\start -> getArgs >>=
(\commands ->
runInteractiveProcess (head commands) (tail commands) Nothing Nothing >>=
(\(_,stdout,_,_) -> hGetContents stdout >>= putStrLn >>
getCurrentTime >>=
(\end -> print $ diffUTCTime end start))))
0102デフォルトの名無しさん
2012/10/26(金) 16:32:06.340103デフォルトの名無しさん
2012/10/26(金) 18:12:19.85その機能をうまく(型推論の便利さをあまり犠牲にしないで)実装できたらすごい
俺は尊敬するし、論文も書ける
0104デフォルトの名無しさん
2012/10/26(金) 18:48:34.110105デフォルトの名無しさん
2012/10/26(金) 18:55:32.060106デフォルトの名無しさん
2012/10/27(土) 00:05:49.70IronPythonみたいに外部か開発部署に物好きがいないとむずかしいかもね。
どちらかというとF#の人たちがどういうポジションなのか気になる。
0107デフォルトの名無しさん
2012/10/27(土) 08:22:56.10関数プログラミング入門 Haskellで学ぶ原理と技法|Ohmsha
http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=978-4-274-06896-6
0108デフォルトの名無しさん
2012/10/27(土) 15:32:25.90どうしてだよ!
手続き型言語によくあるオーバーロードだろ
できないのかよ!
0109デフォルトの名無しさん
2012/10/27(土) 15:51:33.66特徴
・コンピュータサイエンスっぽいノリ。関数型プログラミングを
数学の一分野として位置づけて証明をつけたりするような議論がある。
副題に「原理と技法」とあるのは適切だと思う。Haskellってリスト内包表記で
無限リストがあっさり扱えたりする反面、自分が書いたコードが本当に効率が良いのか
わかりにくいところがある。この本では、コードの効率を手で分析してみせてる箇所があり、
そのような議論を丁寧に追って自らの血肉にできれば有益だと思われる。
・モナドの説明は想像していたよりあっさりしていた。
コンピュータサイエンス寄りの本とは言え、突如領域理論や圏論で読者を打ちのめす心配は一切ない。
・Haskellという言語自体の入門書にもなっているが、この本をHaskell入門書として紹介するのは
SICPをScheme入門書として紹介するのと同じぐらいには間違っていると思う。
・すでに訳出されている fun of programming (関数プログラミングの楽しみ) はこのBirdの本の
「続編」という位置づけであり、その本の中でIFPHでは〜のような言及がしばしばあるので
「関数プログラミングの楽しみ」を楽しむためにはこの本も持っていたほうが良い。
まとめ
「関数プログラミング入門 Haskellで学ぶ原理と技法」はHaskellをとりあえず使ってみたいという
人には向かない。そのような向きには「すごいHaskell〜」を勧める。この本は、ある程度Haskellで
自分が書きたい関数を書けるようになり、効率の問題に直面しはじめた人にこそ向いていると思う。
どのようにデータ構造を工夫し、アルゴリズムを解析し、改良するかについての実例が載っており、
これらの技法を身につければ --- 簡単ではないだろうが --- より整然とした、そして効率の良い
Haskellコーディングができるようになるだろう。
0110デフォルトの名無しさん
2012/10/27(土) 17:00:48.36「関数プログラミングの楽しみ」の前に読むといいのか、なるほど
0111デフォルトの名無しさん
2012/10/27(土) 17:04:25.82オーム社さんいい仕事してくれるぜまったく
0112デフォルトの名無しさん
2012/10/27(土) 17:07:22.180113デフォルトの名無しさん
2012/10/27(土) 17:11:44.560114デフォルトの名無しさん
2012/10/27(土) 17:28:23.24すごい本のPRスライドがあった。
0115デフォルトの名無しさん
2012/10/27(土) 17:32:35.340116デフォルトの名無しさん
2012/10/27(土) 17:49:22.150117デフォルトの名無しさん
2012/10/27(土) 18:24:16.32というノリだからね。
続編というか、IFPHを前提というかそういう感じかな。
0118デフォルトの名無しさん
2012/10/27(土) 18:31:34.04すぐ読まないにしても確保しといたほうが良さそうだな
0119デフォルトの名無しさん
2012/10/27(土) 20:24:43.91そsそうなの!?
関数プログラミングの楽しみとセットですぐ買おうかな
0120デフォルトの名無しさん
2012/10/27(土) 20:53:45.01the 'stdcall' calling convention is unsupported on this platform,
treating as ccall
これはどういう事?
ccall が実際にどういう規約なのかよく分からんけど、
もし ccall == cdecl なら、ccall /= stdcall だよね。
0121デフォルトの名無しさん
2012/10/27(土) 21:00:58.85もうこの手の本はお腹いっぱいだわ
0122デフォルトの名無しさん
2012/10/27(土) 22:57:24.33これじゃね
> When compiling for the x64 architecture in a Windows context (whether using
> Microsoft or non-Microsoft tools), there is only one calling convention ? the
> one described here, so that stdcall, thiscall, cdecl, fastcall, etc., are now all one and the same.
http://en.wikipedia.org/wiki/X86_calling_conventions#x86-64_calling_conventions
0123デフォルトの名無しさん
2012/10/27(土) 23:35:53.71なるほど。
x64 & Windows では呼び出し規約は1種類に統一されたのか。
外部ライブラリを呼ぶ時も、呼び出し規約は何だろうと
ヘッダファイルを調べたりする必要がなくなるわけだ。
こりゃ便利。
ありがと。
0124デフォルトの名無しさん
2012/10/28(日) 09:29:26.53d
すごく参考になった。
0125デフォルトの名無しさん
2012/10/28(日) 10:06:10.470126デフォルトの名無しさん
2012/10/28(日) 10:17:23.020127デフォルトの名無しさん
2012/10/29(月) 03:17:32.09sliceなんかするとC++でいうところの参照のベクタになるってことでいいすか?
中身のコピーはしないんですよね?
0128デフォルトの名無しさん
2012/10/29(月) 07:28:07.96vector パッケージのドキュメントには、
Data.Vector.slice の項に次のように書かれています。
O(1) Yield a slice of the vector without copying it.
The vector must contain at least i+n elements.
もしコピーされているようなら、それはバグですね。
0129Perl忍者 ◆M5ZWRnXOj6
2012/10/29(月) 09:47:53.39↑
これ解けないやつは真骨頂にクズ
ハッカーをを名乗る価値無し
海外からNinjaレベルと言われるほどの者なら簡単に解くことができる
解いてみてみ?
合ってるか確認してやるから
SHA-1とか総当りとかほざいてるようじゃ脳味噌足りてないよ
ホワイトハット気取りのお前らクズじゃJarlsbergすら解けないんだろうな
0130デフォルトの名無しさん
2012/10/29(月) 12:36:11.29ですおね^^
0131デフォルトの名無しさん
2012/10/30(火) 11:10:57.700132デフォルトの名無しさん
2012/10/31(水) 21:36:04.82カバーデザインがポップでありながら品があって良い
組版もプログラミングHaskellと同じものなのですっきりしていて気が散らない
Haskellのコードに使われる等幅フォントが縦長窮屈でなく読みやすい
製本は流行りのlay-flatタイプの綴じ込みでこのへんもぬかりない
なかみはむつかしくてよくわからなかった
0133デフォルトの名無しさん
2012/10/31(水) 22:45:09.39> なかみはむつかしくてよくわからなかった
一番感じなところだが・・・
0134デフォルトの名無しさん
2012/10/31(水) 22:46:57.400135デフォルトの名無しさん
2012/10/31(水) 22:58:59.04やはりデザインはいいんだな
0136デフォルトの名無しさん
2012/10/31(水) 23:54:48.87フルフラット製本って言うらしいけど
0137デフォルトの名無しさん
2012/11/01(木) 05:42:51.180138デフォルトの名無しさん
2012/11/02(金) 02:24:17.750139デフォルトの名無しさん
2012/11/02(金) 12:11:09.020140デフォルトの名無しさん
2012/11/02(金) 13:45:46.44ほんとにjsやpythonってそんなひどいん?
0141デフォルトの名無しさん
2012/11/02(金) 14:04:31.23■Objective-C
for (id num in @[@1,@2,@3,@4,@5]) printf("%d\n", [num intValue]);
または
for (id num in @[@1,@2,@3,@4,@5]) NSLog(@"%@", num);
0142デフォルトの名無しさん
2012/11/02(金) 14:17:55.79■Python
[x*2 for x in range(1,6) if 2<x<5]
0143デフォルトの名無しさん
2012/11/02(金) 15:31:54.92こんな阿呆なコード書くやつ居ないよ
0144デフォルトの名無しさん
2012/11/02(金) 15:33:46.220145デフォルトの名無しさん
2012/11/02(金) 19:20:30.900146デフォルトの名無しさん
2012/11/02(金) 19:20:48.30range とか 1..5 はだめだろ
0147デフォルトの名無しさん
2012/11/02(金) 20:48:54.42つい最近まで正面を見てなかったっけ
まぁ、どうでもいいが
この素敵なおっさん、いつになったらブログ更新するんだろ
0148デフォルトの名無しさん
2012/11/03(土) 00:05:40.15RWHは泥臭く実例を追う実用主義。BirdのIFPHは、理論的な側面を強調している。
無限リストの挙動がなんでそーなるの的な数学的原理なんかはIFPHが優れてるし
画像を扱ってバーコードリーダー作るぜ⇒大量のボイラープレート⇒それモナドでまとめられるよ
なんて話はRWHの優れたところだ。
コンピュータサイエンス(数学寄り)の素養があるならIFPHが簡単だろうし
CとかPerlは実戦でつかえるけど理論には興味ないしそれでも関数型使ってみたいならRWHが向いてる。
0149デフォルトの名無しさん
2012/11/03(土) 00:11:37.14現実的にHaskellを使いこなすにはモナド変換子の理解が必須だと思うのだけど
0150デフォルトの名無しさん
2012/11/03(土) 00:27:58.18IFPHの10.4でモナド変換子の説明が載ってますぞ〜
例外の複合、状態の複合を例として説明し、最後にそれらを応用してますぞ〜
0151デフォルトの名無しさん
2012/11/03(土) 00:38:59.61よさそうなら関数プログラミングの楽しみと一緒に買ってしまうか
関数プログラミングの楽しみの方は、いつかじっくり読みたいなとは思ってたんだ
0152デフォルトの名無しさん
2012/11/03(土) 00:48:45.35読みたい時に手に入らないとかありがちだからなー
0153デフォルトの名無しさん
2012/11/03(土) 04:55:02.03リストの重複要素を省く
0154デフォルトの名無しさん
2012/11/03(土) 12:08:13.58ありがと
0155デフォルトの名無しさん
2012/11/03(土) 18:50:29.18数学系に至るまで、適用範囲がすごく幅広いのだが、これはどうしてだろうか?
これだけ幅広くても、モナドとは何かを言えるものだろうか?
0156デフォルトの名無しさん
2012/11/03(土) 18:53:32.650157デフォルトの名無しさん
2012/11/03(土) 18:57:39.06関数ほどは幅広くはないよ
でも関数とは何かを言えるものだろうかなんて誰も疑問に思わないな
0158デフォルトの名無しさん
2012/11/03(土) 19:22:34.41関数。たしかにそうだけどね。
モナドは中途半端に幅広い、と言うとどうかな。
関数の場合は、モナドのような分類(IO、State、...)はしないよね。
しかもこの分類はアドホックな分類にも見えるし。
0159デフォルトの名無しさん
2012/11/03(土) 19:45:48.97>7のClojureはrange使ってるよ
0160デフォルトの名無しさん
2012/11/03(土) 19:51:21.33Prologは副作用系と数学系を区別してなかったのだが
Haskellはいったん副作用系と数学系を対立させ、再び統一するためにモナドを発明した
0161デフォルトの名無しさん
2012/11/03(土) 20:43:47.80うん。そのとき、たとえば、IO a とList a における IOとListには、
どちらも型構成子であるという共通性はあるが、それ以外の共通性は
感じ取れないんだ。さらにいうと、List aの方はaの自然な拡張だと
すんなり納得できるが、IO aの方は、aとIOの強引な組合せとしか
見えないんだ。
0162デフォルトの名無しさん
2012/11/03(土) 20:58:35.33前スレのテンプレを見てもらえばわかるがrangeとか1..5とか使ってないのよ
だから元々そういう縛りがあったんだろう
0163デフォルトの名無しさん
2012/11/03(土) 21:01:56.520164デフォルトの名無しさん
2012/11/03(土) 21:09:19.21それは失敬
でもテンプレ化するならそれなりにルールを決めないとだめだよね
0165デフォルトの名無しさん
2012/11/03(土) 21:10:54.68お前には感じ取れなくてもListとIOには共通性があって
その共通性に基づいてるのがモナドなんだな
0166デフォルトの名無しさん
2012/11/03(土) 21:11:34.990167デフォルトの名無しさん
2012/11/03(土) 21:15:23.850168デフォルトの名無しさん
2012/11/03(土) 21:28:01.97>ListとIOには共通性があって
どういう共通性?
0169デフォルトの名無しさん
2012/11/03(土) 21:29:04.57逆に、ある型構築子に対してモナド則を満たすような(>>=)とreturnを定義できるならそれはモナド
0170デフォルトの名無しさん
2012/11/03(土) 21:35:43.050171デフォルトの名無しさん
2012/11/03(土) 21:43:13.59むしろ、IOとListとが同類にみえるようなモナド則は実はナンセンスなのじゃ
ないかという疑問なのだが?
>>170
さすがにそんなことはないだろう。
0172デフォルトの名無しさん
2012/11/03(土) 22:04:53.50そのような性質を持つものにモナドという名前を与えた背景の方が興味あるな
0173デフォルトの名無しさん
2012/11/03(土) 22:05:36.02モナド則なんてなくても、Prologでは副作用と非決定性は同類に見えていた
0174デフォルトの名無しさん
2012/11/03(土) 22:15:51.32お察しの通り、モノイドとの類似性から
>>173
非決定性が副作用の一部というなら分かるが、同類というのは分からん。
Prologの何のことを言ってる?
0175デフォルトの名無しさん
2012/11/03(土) 22:22:16.530176デフォルトの名無しさん
2012/11/03(土) 22:23:16.60ナンセンスとか言っても現実にリストとIOは同じモナドの概念でまとめられるので、
まとめられる以上それを別のものにする理由が無い
0177デフォルトの名無しさん
2012/11/03(土) 22:29:00.770178デフォルトの名無しさん
2012/11/03(土) 22:36:14.23非決定性は副作用の一部 (>>174)
Haskell:
非決定性はモナドの一部 + 副作用はモナドの一部
0179デフォルトの名無しさん
2012/11/03(土) 22:37:13.01まとめられるのに、諸事情でまとまっていないものもあるし
0180デフォルトの名無しさん
2012/11/03(土) 22:40:44.12かなり多くのものがまとめられるからモナドを選んだんじゃないのかね?
0181デフォルトの名無しさん
2012/11/03(土) 22:49:35.35IOとか昔はモナドじゃなかったんでしょ
0182デフォルトの名無しさん
2012/11/03(土) 22:54:29.24■ このスレッドは過去ログ倉庫に格納されています