関数型プログラミング言語Haskell Part26
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2014/07/27(日) 13:46:32.03ID:deqguEnhhaskell.org (公式サイト)
http://www.haskell.org/
前スレ
関数型プログラミング言語Haskell Part25
http://peace.2ch.net/test/read.cgi/tech/1393313450/
0357デフォルトの名無しさん
2014/11/06(木) 08:21:54.61ID:+3ioqTnw0358デフォルトの名無しさん
2014/11/06(木) 11:06:19.54ID:6vgYQ4+I0359デフォルトの名無しさん
2014/11/06(木) 11:27:34.28ID:el8FQLItな、なるほど! 腑に落ちました。ありがと
0360デフォルトの名無しさん
2014/11/06(木) 11:46:39.88ID:el8FQLItメモ化のことを言ってるんですね。
計算を同じサンクに結びつければ、計算は無駄に行われない。と。
ところで昨日あれから考えてて、もっと良い例を思いついたんですけど、
lazy :: a -> a
lazy a = (\() -> a) $ ()
を使えば、正格データを遅延に変えられますよね?
happyBirthDay :: Text.Strict
happyBirthDay = "Happy Birth Day " ++ lazy "to me..."
>> print $ head 16 happyBirthDay
Happy Birth Day
理解がバージョンアップされました。
「Haskellではナントカ生成機はナントカを弱頭部標準形に包むだけで実現できる。生成機を作る目的でレガシー言語のようにIO計算を作る必要はない。呼び出しをサンクにまとめればOK.」
0361デフォルトの名無しさん
2014/11/06(木) 12:19:08.73ID:ki6zkhTW0362デフォルトの名無しさん
2014/11/06(木) 20:34:57.00ID:MUH9Buffカ
ンデュェットか
0363デフォルトの名無しさん
2014/11/06(木) 21:08:19.53ID:j9zZcG2n0364デフォルトの名無しさん
2014/11/07(金) 02:21:57.92ID:9j/jQs980365デフォルトの名無しさん
2014/11/07(金) 06:23:52.22ID:QrO3W2z+なりすまし死ね
0366デフォルトの名無しさん
2014/11/07(金) 07:24:16.12ID:9j/jQs980367デフォルトの名無しさん
2014/11/07(金) 09:30:21.34ID:LIDPNOLM0368デフォルトの名無しさん
2014/11/07(金) 09:41:06.60ID:XgnNytLv0369デフォルトの名無しさん
2014/11/07(金) 10:37:06.38ID:w9r+UzpWreturn $! に代えたら、20%も高速化したんですけどwwww
前にtanakhさんが foldlは壊れている、正しくはfoldl'、っていう趣旨の翻訳記事を書いてたじゃない。それと同じように、return = (return $!)
で置き換えるべきなの?
0370デフォルトの名無しさん
2014/11/07(金) 10:55:58.91ID:CYOEAapJ0371デフォルトの名無しさん
2014/11/07(金) 15:22:50.72ID:1clwNr+d0372デフォルトの名無しさん
2014/11/07(金) 16:32:32.22ID:w9r+UzpW>>371
あ、わかった
print =<< (head . reverse <$> (return $! reverse [1..] ))
0373デフォルトの名無しさん
2014/11/07(金) 17:00:51.66ID:5EqfDet10374デフォルトの名無しさん
2014/11/07(金) 17:06:11.41ID:6pO9x6h7くらいだと思う
0375デフォルトの名無しさん
2014/11/07(金) 17:06:49.99ID:B3DaCLD40376デフォルトの名無しさん
2014/11/07(金) 18:01:23.96ID:7mel9rlk難しいけど、抑えとかないと致命的になりうるんですよね。
0377デフォルトの名無しさん
2014/11/07(金) 19:55:25.73ID:ehRLeVcRmain = putStrLn (const "fooはthunk" foo)
0378デフォルトの名無しさん
2014/11/08(土) 00:22:16.94ID:fHlqfJbD0379デフォルトの名無しさん
2014/11/08(土) 00:41:10.20ID:vifAICnG0380デフォルトの名無しさん
2014/11/08(土) 01:34:30.44ID:J9TuEpTuコンパイル後のバイナリサイズはチューニングしようがなんだろうがデカいままだろうが
0381デフォルトの名無しさん
2014/11/08(土) 03:09:20.05ID:vifAICnG0382デフォルトの名無しさん
2014/11/08(土) 11:41:08.63ID:LW7xiPF6教えてくれてありがとう。言われなきゃ絶対気づかなかった‥ これは良さそうだわ。
0383デフォルトの名無しさん
2014/11/08(土) 12:36:51.72ID:n7vP28K60384デフォルトの名無しさん
2014/11/08(土) 13:19:08.56ID:u0osiKmL0385デフォルトの名無しさん
2014/11/09(日) 00:17:02.01ID:EqHSZtCW> Android
外国の誰かがSodium でゲーム作ってたような。
0386デフォルトの名無しさん
2014/11/09(日) 10:12:37.51ID:mRPDV88Wリスト操作やタプルを減らしてdo記法とか抽象度あげても、今度は何やってんだか分かんなくなるっていうか
0387デフォルトの名無しさん
2014/11/09(日) 11:35:26.86ID:QOYwRKxw型しか見ない
キーボードを見ないで画面だけ見るのと同じ
0388デフォルトの名無しさん
2014/11/09(日) 12:02:01.62ID:EqHSZtCWHaskell は書くのは天国だが読むのは地獄。バグが出たなら書き直す。
0389デフォルトの名無しさん
2014/11/09(日) 12:17:37.24ID:QOYwRKxw読まなくても再発明できる情報を最大限に脳に焼き付けてから実際のコードを読めばいい
大体予想通りのことしか書いてないから一瞬で読める
0390デフォルトの名無しさん
2014/11/09(日) 12:32:22.24ID:GNDt7Bdm0391デフォルトの名無しさん
2014/11/09(日) 15:11:32.03ID:itJxEnARあとはチラシの裏にでも手で簡約してみる。
これを効率よくやるために、可能な限り徹底的に純粋関数で計算する。
例えば、do の中で IO 入力があれば、入力された値をそこでゴニョゴニョせず、直ちに純粋関数に渡す。
たとえ超単純な計算でも、純粋関数に渡すクセをつけておく。
do の中でゴニョゴニョした方がソースコードの見通しが良いのなら、
バグが無いと確信できたあとでリファクタリングすればいい。
あと、デバッグが無いと確信できるまでは、関数内関数も使わない。
局所的にしか使わないちょっとした関数も全部トップに書く。
0392デフォルトの名無しさん
2014/11/09(日) 15:34:11.22ID:ynWG2VztHaskellが読みやすくするのは計算の構造です
0393デフォルトの名無しさん
2014/11/09(日) 15:38:36.40ID:Wi6Wj++H0394デフォルトの名無しさん
2014/11/09(日) 15:39:29.40ID:81qYhIbT関数型言語こねくり回せるくらい頭いいやつだけで開発するからってオチなのかもしかして
0395デフォルトの名無しさん
2014/11/09(日) 15:48:17.92ID:ynWG2Vztコードと計算の構造は抽象度が違うので、同時に読みやすくなるということの方が例外でしょう
0396デフォルトの名無しさん
2014/11/09(日) 15:54:14.02ID:ynWG2Vzt生産性が上がるのは、関数型だからではなく、クロージャを代入できて値が不変にできるからではなかろうか
0397デフォルトの名無しさん
2014/11/09(日) 17:10:26.68ID:TGkUuDSg>>394
主観だけど、今書いてる100行のコードは、Objective-Cで書いてたころなら1000行くらい掛かってたと思う。ただし、コーディングに掛かる時間は同じくらいなので生産性は変わらず。
0398デフォルトの名無しさん
2014/11/09(日) 17:18:22.10ID:ynWG2Vzt今書いてるコードの行数ではなく、3ヶ月後に自分が書いたコードが保守できるかどうかで判断すべきかと…
0399デフォルトの名無しさん
2014/11/09(日) 18:52:57.83ID:ZFAvQIioSPJ先生の"Wearing the hair shirt - A retrospective on Haskell" に遅延評価の功罪について言及があるね
http://research.microsoft.com/en-us/um/people/simonpj/papers/haskell-retrospective/HaskellRetrospective.ppt
また、letとwhereなど記述に幅を持たせたのは大成功だったとも。
0400デフォルトの名無しさん
2014/11/09(日) 18:54:03.25ID:ZFAvQIio0401デフォルトの名無しさん
2014/11/09(日) 19:00:10.66ID:ZFAvQIiostrip -p --strip-unneeded --remove-section=.comment
すると半分くらいになるよ。
0402デフォルトの名無しさん
2014/11/09(日) 21:27:10.96ID:QOYwRKxwそれは記憶力の問題というより逆境に弱すぎる気がする
少し調子が悪くなっただけで狼狽して何もできなくなるパターン
0403デフォルトの名無しさん
2014/11/09(日) 21:39:01.73ID:VKU6H7RB0404デフォルトの名無しさん
2014/11/09(日) 21:44:21.85ID:QOYwRKxw絶対に記憶しろっていう方が精神論だ
0405デフォルトの名無しさん
2014/11/09(日) 22:00:55.96ID:VKU6H7RB0406デフォルトの名無しさん
2014/11/09(日) 22:08:25.42ID:itJxEnAR主要な関数だけでもドキュメントは書いておいた方がいいぞ。
引数と戻り値の意味、それとは別に計算のごく簡単な流れ。
これを書いておくだけで、後ですげー助かる。
過去の自分に感謝したくなるから。
0407デフォルトの名無しさん
2014/11/09(日) 22:20:45.90ID:mbLWZpZk0408デフォルトの名無しさん
2014/11/09(日) 22:49:35.66ID:EqHSZtCWありがたい。勉強になるわ
>>401
マジ助かる! でも俺の環境(OSX)のstripコマンドにそのオプションはない… 代替を探してみる。
0409デフォルトの名無しさん
2014/11/09(日) 22:50:21.62ID:9LyR+5oz何を言ってるんだお前は
0410デフォルトの名無しさん
2014/11/09(日) 22:56:40.68ID:EqHSZtCW擁護してくれた人には悪いんだけど、これはあるかも。
三ヶ月前のコードは読めない。バグらしき挙動を発見しても、直そうとして大量のtrace文を突っ込むことになる...
でも、書き直すと必ず短くて、わかりやすくなるんだよ。
要は設計がショボかったんだと思う。
0411デフォルトの名無しさん
2014/11/10(月) 22:29:34.56ID:7cnYJA4z0412デフォルトの名無しさん
2014/11/10(月) 22:37:14.36ID:VLesXqGp0413デフォルトの名無しさん
2014/11/10(月) 22:40:26.50ID:7cnYJA4z0414デフォルトの名無しさん
2014/11/10(月) 22:41:29.93ID:A0UHj1LAC言語で3000行/日 の人はいるね。
http://d.hatena.ne.jp/softether/20070324
0415デフォルトの名無しさん
2014/11/10(月) 22:51:55.41ID:i/Dk2pnq詭弁じゃね?
0416デフォルトの名無しさん
2014/11/10(月) 23:05:05.03ID:a0CrBmRgスレチ。っていうか本人に言えよw
その記事は要は、意識的に考えずに指の動くままに、フロー状態で書きまくれ、ってことだろう。
トライ&エラーでコーディングしてコンパイルエラーが出たりバグが出たりしてつまづいてやる気萎えたら無理だと思うけど、
Haskell には、前者の為にhole、後者の為に型チェックとQuickCheckがあるからね。
関数型は脳汁でるしな。
そういう状態には到達しやすいかも。
0417デフォルトの名無しさん
2014/11/10(月) 23:05:58.36ID:f9SpYH13必要なときに思い出せるようなキッカケが用意されていればいいんだ。
0418デフォルトの名無しさん
2014/11/10(月) 23:09:48.57ID:7cnYJA4z0419デフォルトの名無しさん
2014/11/10(月) 23:27:16.41ID:NkZmj/dK1万行を思い出す前にまず1行も読まなくてもわかることを全部思い出すのだ
0420デフォルトの名無しさん
2014/11/10(月) 23:33:47.24ID:a0CrBmRgでもリファクタリングすると、前のモデル忘れちゃわない?
3回くらい書き直した後、日にちが経って思い出そうとすると、最初に出てくるのは一番古いヤツだったり。ああ、あの後書き直したんだっけ、ってなる。
ひょっとして上の登氏みたく、設計は一発でバチっと決められちゃうタイプ?
>>418
意外とHaskell の仕事ってあるんだね。金融系?
>>419
? コードを思い出すんじゃなくて、抽象モデルを思い出せ、ってこと?
0421デフォルトの名無しさん
2014/11/10(月) 23:35:00.73ID:feZKSxME博徒専用言語というイメージだから。
0422デフォルトの名無しさん
2014/11/10(月) 23:37:48.20ID:7cnYJA4zゆえに、他人が書いたコードを保守のしやすさこそがその言語の生産性といえる
0423デフォルトの名無しさん
2014/11/10(月) 23:39:06.85ID:7cnYJA4z大学からの下請け
0424デフォルトの名無しさん
2014/11/10(月) 23:50:29.86ID:a0CrBmRg昨日みた記事では確か、Haskell の生産性はTypeScript、Scalaに次いで3位って話だったけど(ソース失念)、
> ゆえに、他人が書いたコードを保守のしやすさこそがその言語の生産性といえる
その観点でみると、Haskell はどれくらい良い?
0425デフォルトの名無しさん
2014/11/10(月) 23:56:00.83ID:7cnYJA4z理由は、コロコロと根幹部分のモジュールが変わったから
月単位では高い
理由は、同じ機能を実現するためのバリエーションが少ないから
0426デフォルトの名無しさん
2014/11/11(火) 00:05:51.80ID:jUxCk/rZ> >>417
> でもリファクタリングすると、前のモデル忘れちゃわない?
だから、忘れちゃっていいんだよ。
普通は git や Subversion を使ってるから、必要な時は思い出せる。
ドキュメント付いてれば尚更楽に思い出せる。
そういう、思い出すためのキッカケ(仕組み)を予め用意しておくんだよ。
ただ、ドキュメントがヘタッピだとヤバいな。
0427デフォルトの名無しさん
2014/11/11(火) 00:09:57.47ID:AaX4/UOm言語非依存の技術を身につける機会がどれほど失われていることか
0428デフォルトの名無しさん
2014/11/11(火) 00:11:32.49ID:RW6n7dRV0429デフォルトの名無しさん
2014/11/11(火) 00:12:45.97ID:RW6n7dRV言語非依存の技術がなければ、言語に順位は付けられませんよ
0430デフォルトの名無しさん
2014/11/11(火) 00:18:12.17ID:Mc4XktUMコンディットとかの事を言ってるのか。
バリエーション少ない?
http://www.willamette.edu/~fruehr/haskell/evolution.html
例えばグラフを表現するにしても、隣接行列、隣接リスト、さらにリストにするか、セットにするか、ノードはOrd aにするか、単にIntでいいのか、ケースバイケースで色々あると思うんだけど?
0431デフォルトの名無しさん
2014/11/11(火) 00:18:57.33ID:Mc4XktUMカ ンジッット
だったね。
0432デフォルトの名無しさん
2014/11/11(火) 00:26:12.69ID:Red25WNbなるほど。思い出すキッカケとしての、ドキュメント。メモメモ
あんま意識してなかったけど、確かに助けにはなっているかも。個人的には、関数へのコメントより、ファイル冒頭に設計指針を書いておくほうが多いです。
> ただ、ドキュメントがヘタッピだとヤバいな。
…
自信はないけど、自分が読めるから、取り敢えず、いいか、な
0433デフォルトの名無しさん
2014/11/11(火) 00:29:37.46ID:RW6n7dRV断言するが、lispやCやJavaと比べたら、プログラマにある機能を要求したときに提出されるコードのバリエーションが、Haskellは極めて少ない
0434デフォルトの名無しさん
2014/11/11(火) 04:25:03.93ID:m7WVeZhS0435デフォルトの名無しさん
2014/11/11(火) 07:51:04.83ID:XbL/s6PQコアが増えていけば速くなり続けて行くと思ってたのに……
メニーコアとは幻想だったのか…
0436デフォルトの名無しさん
2014/11/11(火) 08:05:50.97ID:/UGcfCAOあっちにも書いたけどこっちにも転載
0437デフォルトの名無しさん
2014/11/11(火) 08:14:04.59ID:IHNztH1r実践的なHaskellコードを読んで絶望しろ
0438デフォルトの名無しさん
2014/11/11(火) 13:58:02.38ID:j+uyDxfA:!でターミナルのコマンドが使えますが、これを関数に組み込むにはどのようにしたらよいのでしょうか?例えば、
foo = :! pwd
と定義したfooを実行したらカレントディレクトリを表示する、というようなことをしたいのですが(もちろん、これはコンパイルできませんが)、どのようにしたら良いでしょうか。
基本的なことで恐縮ですが、ググっても目的の答えに辿りつけなかったので質問しました。
0439デフォルトの名無しさん
2014/11/11(火) 14:19:11.58ID:L4zKGcL9https://www.haskell.org/ghc/docs/latest/html/libraries/process-1.2.0.0/System-Process.html
foo = callCommand "pwd"
0440デフォルトの名無しさん
2014/11/11(火) 18:28:48.53ID:j+uyDxfA希望することができました。
ありがとうございます。
0441デフォルトの名無しさん
2014/11/13(木) 14:25:56.14ID:/hesX7bcpullで何かしたいなら、合成したイベントハンドラにファンクター的に中身に変換掛ければいいじゃない。
0442デフォルトの名無しさん
2014/11/13(木) 14:28:29.72ID:/hesX7bc"時間変化する値"っていう抽象は、一見わかりやすいけど、本質的じゃないよ。
0443デフォルトの名無しさん
2014/11/13(木) 20:12:29.70ID:qEFCMURuそれで済む場合もあるけど、Behaviorがあった方が便利な場合もある
例えば、同じソースを監視するイベントハンドラが複数あったら
全部個別にfmap(実際はcontramap)しなきゃならなくて、
重い関数を適用したい場合はコストが問題になる
0444デフォルトの名無しさん
2014/11/13(木) 20:54:00.50ID:Hgbf31UD型システムのために Behavior a を作ったんだろう
0445デフォルトの名無しさん
2014/11/13(木) 20:54:43.82ID:fBmBaE/Aelereaのシグナルを学んだばかりで、Behavior の概念に馴染めてないから、いまひとつピンとこないんだけど、
複数のイベントハンドラ、がそれぞれEvent、でいいんだよね?
mouseDownとかmouseMoveとかwheelScrollとかかな?
で、マウス位置(xy座標)をストリーム(Eventシグナル)に載せているんだけど、例えばx座標だけを抜きたい時、\(x,y) -> x をそれぞれのEventに対してcontramapする。
こういう認識であってるかな?
もしそうなら、Behavior は重い関数を掛けるときのパフォーマンス劣化の問題を、どうやって解決するんだい?
解説頼む。
0446デフォルトの名無しさん
2014/11/13(木) 21:51:34.46ID:4Xr/dCjqBehavior を(も)使った方が解りやすいというタイプの人のためにある。
Behavior よく解らん、Event 解りやすいという人は、Behavior のことは気にしなくていい。
両方使ったり、片方だけで代用したり、いかようにも表現できる。
0447デフォルトの名無しさん
2014/11/13(木) 22:11:56.86ID:/hesX7bcなんだか、甘味料と砂糖みたいな関係ですね。
晩御飯のすき焼き、甘味料で作ってみようかなあ。
煽りはさておき、Behavior がどういう概念で、どういうシーンでしっくりくるのか、興味があります。
あなたなりの理解を教えていただけると幸いです。
0448デフォルトの名無しさん
2014/11/13(木) 22:48:25.29ID:fBmBaE/A0449デフォルトの名無しさん
2014/11/13(木) 23:19:59.71ID:8WQaaDuGelereaはドキュメントに用例が多くて助かります。
https://hackage.haskell.org/package/elerea-2.7.0.2/docs/FRP-Elerea-Simple.html
特に、A longer example の節は必見
GUIアプリの例。解説のHTMLが同梱されています
https://hackage.haskell.org/package/elerea-examples
0450デフォルトの名無しさん
2014/11/13(木) 23:41:31.63ID:iWKxp8OY多謝
0451デフォルトの名無しさん
2014/11/14(金) 14:21:56.46ID:WNZtrPXa加速度を積分して速度、積分して位置にしたり。
リストのスクロールを摩擦係数をいじって減速度合いを変えたり。
0452デフォルトの名無しさん
2014/11/14(金) 14:36:53.44ID:+69VmKY1elereaのSignalはMonadだからやりたい放題できるからそれに慣れると分ける意味わからんよな
0453デフォルトの名無しさん
2014/11/14(金) 22:26:54.48ID:WNZtrPXaワイ「わーい」
0454デフォルトの名無しさん
2014/11/14(金) 23:05:43.56ID:DkHiTH1Y0455デフォルトの名無しさん
2014/11/14(金) 23:52:30.13ID:qCbHalO3久しぶりに読みにくい日本語に出会った
0456デフォルトの名無しさん
2014/11/15(土) 03:09:27.49ID:TFMH5uTn予約の話をしよう、あれは今から36万・・・いや、1万4000年前だったか、
まぁいい、私にとってはつい昨日の予約だが、君たちにとっては多分明日の予約だ
■ このスレッドは過去ログ倉庫に格納されています