関数型プログラミング言語Haskell Part17at TECH
関数型プログラミング言語Haskell Part17 - 暇つぶし2ch2:デフォルトの名無しさん
12/01/02 22:19:49.55
関連書籍
・Introduction to Functional Programming Using Haskell (2nd ed.)
 URLリンク(www.amazon.co.jp)

・Haskell: The Craft of Functional Programming
 URLリンク(www.amazon.co.jp)

・The Fun of Programming
 URLリンク(www.amazon.co.jp)

・The Haskell School of Expression: Learning Functional Programming Through Multimedia
 URLリンク(www.amazon.co.jp)

・入門Haskell
 URLリンク(www.amazon.co.jp)

・ふつうのHaskellプログラミング
 URLリンク(item.rakuten.co.jp)

・Programming in Haskell
 URLリンク(www.amazon.co.jp)

・Real World Haskell
 URLリンク(www.amazon.co.jp)

・関数プログラミングの楽しみ
 URLリンク(www.amazon.co.jp)

3:デフォルトの名無しさん
12/01/02 22:20:17.30

 東京にある6つのキー局の内、製作から財務まで一貫して朝鮮人が行ってるテレビ局が1つ
 中国共産党から毎年大量の反日工作費が流れているテレビ局が2つ
 もろに北朝鮮と繋がっているテレビ局が1つ  
年寄はまだまだテレビという外国人に騙され続ける


4:デフォルトの名無しさん
12/01/02 22:20:18.07
関連リンク
・GHC Wiki
 URLリンク(hackage.haskell.org)

・A History of Haskell
 URLリンク(research.microsoft.com)

・関数型関連の用語集
 URLリンク(sky.zero.ad.jp)

・本物のプログラマはHaskellを使う
 URLリンク(itpro.nikkeibp.co.jp)

・Haskell API search Engine
URLリンク(www.haskell.org)

【簡単な使い方】
1.検索バーに関数名を入れて検索
 例 map
2.検索バーに型名を入れて検索
 例 (a -> b) -> [a] -> [b]

5:デフォルトの名無しさん
12/01/02 22:22:49.08
Real World Haskell
URLリンク(book.realworldhaskell.org)

Learn You a Haskell for Great Good!
URLリンク(learnyouahaskell.com)

6:デフォルトの名無しさん
12/01/02 22:36:27.61


あれから新しい本も仲間入りしたし、新版も出たから、追加しとくわ

・Haskell: The Craft of Functional Programming (3rd ed.)
URLリンク(www.haskellcraft.com)
URLリンク(www.amazon.co.jp)

・Learn You a Haskell for Great Good!
URLリンク(learnyouahaskell.com)
URLリンク(www.amazon.co.jp)


7:デフォルトの名無しさん
12/01/03 10:48:00.13
>>999
>関数型言語って、スパゲティになりやすい。
>宣言的で1つ1つ完結しているから理解しやすいとか馬鹿が言うけど、
>実際には宣言的だからこそスパゲッティコードになる。
モナドの観点からは、これに対してどう答えるんだろか?

8:デフォルトの名無しさん
12/01/03 10:51:34.50
前から思ってたけどおまえ質問下手すぎ

9:デフォルトの名無しさん
12/01/03 11:59:31.93
手続き型言語で言えばクラスに分割せずにmainに詰め込んだほうが色々飛ばなくて判りやすいというのと同じ類のいちゃもんだな

10:デフォルトの名無しさん
12/01/03 11:59:52.07
質問が下手なのは質問じゃないからだろうな
脳内では結論決まってんだろ?

11:デフォルトの名無しさん
12/01/03 12:03:01.20
自分ではわからないだろうけど、バカが書くからスパゲッティになるんだよ

12:デフォルトの名無しさん
12/01/03 12:03:16.47
本当に「宣言的」なら理論的にはスパゲッティになりようがない

先ほども言ったが、スパゲッティというのは実行順序や計算順序が複雑に絡まること
(ここで言う絡まるというのは、解の導出過程を追うとコード上を脈絡無く飛び交ってしまうこと)

完全に宣言的なものには解を導くのに計算順序という概念がない
だから、順序があるのはそれが手続き的な面を少なからず持ってるからだ
(完全に宣言的なもの、HTML や Alloy の記述などはもうプログラムとは呼べないと俺は思う)

Haskellの持つ宣言的な性質は、例えば、参照透過性ゆえに
関数をどこで使用しても同じ結果が得られることに現れている
しかしHaskellだって完全に宣言的ではないから、
計算順序をしっかり意識しないといけないケースがある

ただその場合も、順序を意識して計算を追うのはCやJavaなどよりも楽になるケースが多い
関数をどこで使用しても同じ結果が得られると言うことは、
その結果を知っているなら、それ以上その先深く計算を追う必要が無いからだ

そしてその結果を知る事も比較的容易だ
関数の結果が引数以外の外部環境(変化するクラスのメンバ変数など)に依らないから、
単に計算対象の値に問題の関数を適用して結果を調べればいいだけ(内部計算は知る必要が無い)

実際問題として、Haskellのプログラミングは正直なところ言うほど単純ではないが、
それでもそのようなHaskellの持つ宣言的な性質の部分を大いに活用できるから、
手続き寄りなCやJavaなどよりも理解しやすいと言われるし、俺もそう感じる

13:デフォルトの名無しさん
12/01/03 12:09:39.97
モナドのうち手続き的な処理のための奴は、元を辿ると、意味論の研究にたどりつく。
手続きの意味を明確にするべくデザインされたものが「スパゲティになる」とか、
意味不明の主張だと思うな。

14:デフォルトの名無しさん
12/01/03 12:44:04.80
JavaやJavaScriptでも宣言的なプログラミングを目指してるのにねぇ…


15:デフォルトの名無しさん
12/01/03 12:44:46.52
>>12
本当にHaskellでプログラム書いたことある?
Haskellで実用的プログラミングをしたら、計算順序を意識せずにはいられないよ。

lazyゆえにどれだけメモリリークが発生しやすくなっていると思う?
計算順序のチューニングなしにどうやってメモリリークに対処するんだ?

「計算順序とか関係なく、各宣言を独立に扱える」とか綺麗事逝ってるうちはいいが、
ひとたびリアルタイムなレスポンスを要求されたり、
長時間メモリリークなしに継続的に動作することを要求されたら
どれだけスパゲッティと格闘しなければならないか、理解してるか?

16:デフォルトの名無しさん
12/01/03 13:02:00.83
スパゲッティはちょっと表現が違うと思うが…

17:デフォルトの名無しさん
12/01/03 13:03:37.88
超高性能なプリプロセッサの域を出ない

18:デフォルトの名無しさん
12/01/03 13:10:19.95
計算順序をゴチャゴチャやり始めたらモジュール性もクソもなくなる。
構造化による問題の局所化ができないのだから、スパゲッティーと言っていいな。

19:デフォルトの名無しさん
12/01/03 13:20:09.04
>>12
>(完全に宣言的なもの、HTML や Alloy の記述などはもうプログラム
とは呼べないと俺は思う)
プログラムと呼ぼうと呼ぶまいと、やることができれば、それが一番
いいんじゃないの?
しかし完全に宣言的ってあり得るか?

20:デフォルトの名無しさん
12/01/03 13:27:25.02
どんな言語も土方さんに渡せばスパゲティーを作ってくれるよ

21:デフォルトの名無しさん
12/01/03 13:35:20.53
>>15
もちろん日常的にHaskellでプログラムを書いている
実用的かどうかはそのアプリケーションを利用する環境に依るから何とも言えん
ただ、私(たち)が社内用に作ったアプリケーション、たとえば
意思決定支援システムのようなものは社員達に活用していただいている
ユーザーや外部環境とアルタイムにコミュニケーションするアプリケーションも作ってる

Haskellも計算順序を意識する必要があるケースがあると言ったはず
私はその計算順序がスパゲティになりにくいと言った

少なくとも私(たち)の作るアプリケーションの類では、
遅延性が原因のメモリリークは、C などのより厄介なメモリリークよりも潰しやすい
正確に言えば、アプリケーションの運営に問題にならない程度にまで潰すのは
C などに比べて用意であることの方が圧倒的に多い

申し訳ないが、こればかりは普段皆さんがどれとぼメモリリークを気にしているのか知らない
完全にゼロになる(どういう状態がメモリリークゼロと言えるのかも知らんが)まで、
ひたすら潰し続けるということを私は仕事でやったことがないから

もしかしたら、24時間356日正しく動き続けることが求められるアプリケーションでは、
遅延性が原因のメモリリークはとても厄介な存在かも知れん

逆に貴方はHaskellでどのようなアプリケーションを作った時に、
どのような部分に遅延性が原因のメモリリークが発生し、
それをどれくらい潰そうとして、それとどのように格闘して解決したのか、
ぜひ訊かせていただけないだろうか

22:21
12/01/03 13:38:21.21
>>21
すまん

> 私はその計算順序がスパゲティになりにくいと言った

なりにくいとは言ってないな(頭にはあったが、言葉にはしていなかった)

計算順序を追うのがCなどに比べて楽になるケースが多いと言った

23:デフォルトの名無しさん
12/01/03 13:59:12.54
計算順序厨は1+2+3は1+2が先でなければならない、とか考えるんかねぇw

24:21
12/01/03 14:02:04.92
>>23
>>15 は君のような大馬鹿ではないから、
そういう計算順序を言っているのではないと思うぞ

その計算のどこにメモリリークが発生する余地がある?

25:デフォルトの名無しさん
12/01/03 14:15:22.38
最近の小学校ではかけ算の順序厨がいるらしい

26:デフォルトの名無しさん
12/01/03 18:35:13.10
>>21
>もちろん日常的にHaskellでプログラムを書いている
>意思決定支援システムのようなものは社員達に活用していただいている
うーん。Haskellだろうとそれは大変だろ。
あんた以外がメンテすることはできるの?


27:21
12/01/03 18:51:51.64
>>26
私(たち)と書いた
今は私含めて4人でプログラムして同じ4人でメンテしてる
社内ツール専門の部署だ

28:デフォルトの名無しさん
12/01/03 19:00:01.64
いいなー楽しそうだなー

29:デフォルトの名無しさん
12/01/03 19:18:16.88
>>27
なるほど。
やろうと思えば1人でもできるのか?

30:デフォルトの名無しさん
12/01/03 19:53:23.08
>>21
意思決定支援か。こっちも似ていて、機械学習系のシステム。
大規模行列を扱う時にメモリに抱え込む実装になっている。
サーバプロセスとして実装したから、24-365まではいかないが、
数ヶ月は走り続ける必要がある。

大変だったのは、サーバプロセスのメモリリークかな。
行列への書き込みからメモリリークを取るのは簡単な話だが、
サーバプロセスとして継続的に走り続けるから、
障害回復のためのジャーナルへの書き出しとか、
サーバプロセスに付随する色々な処理に非正格な処理が混ざると
メモリリーク祭りになる。

もちろんCで実装するのに比べれば対処は容易だ。
でもそれはGCの恩恵であって、lazyさや参照透明の恩恵とは違う。
GC付きのOOPLのほうが単純に実装できるかもしれない。
証券系でMLが好まれるのは、そのあたりが理由かもしれんと思った。

31:21
12/01/03 20:06:54.03
>>29
制作時の話なら、作るアプリケーションの規模と、かけられる時間と、
私の今の知識や経験の量による

メンテの話なら、私(たち)が仕事で作ったツールのソースは、私一人でもできる
4人でメンテしてると言っても、そのつど責任者をゲームで一人決めて(押しつけて)、
その人がメインでメンテ、あとの3人は時々サポートするくらいだから

>>15
それはそうと、「計算順序とか関係なく、各宣言を独立に扱える」
本当にそんなことを言っているHaskellプログラマはちょっと問題がある
俺のことを指摘したのなら勘違いだろ、そもそも俺はそんなことは言ってない

「各宣言を独立に扱える」事を臭わすような発言はしたし
事実そういう利点を常に意識しているが、
それが「計算順序と関係なく」できるとは全く思っていない

計算順序はちゃんと意識しないとデバッグ時に計算が追えない
が、「各宣言を独立に扱える」ことにより、計算を追うデバッグの仕事が
Cなどに比べて楽になる、という意味の発言はした(理由も言った)

デバッグにおいて、「各宣言を独立に扱える」ことの別の利点もある
一連の計算に利用するそれぞれの関数を独立してデバッグできる
その関数の規模が小さいほど、みんなでデバッグしやすい(私たちは4人でデバッグしてる)

32:デフォルトの名無しさん
12/01/03 20:11:26.98
>>30
あまりよく知らないんだが、実用システムではメモリリークってそんな
に問題なのか?
それと比べると、lazyさや参照透明の恩恵は実感としてどのくらいなんだ?

33:21
12/01/03 20:15:26.32
>>30
では私と扱っている分野が違うのだろう

私はそのような走り続けるアプリーションをHaskellで作った経験がゼロなので、
私(たち)のアプリで実感したHaskell利点が、貴方のタイプのアプリでも通用するのか、
全く分からない(いずれ必要になった時には当然検証するが)

申し訳ないが、私は私の経験でしかHaskellの利点や欠点を語れない
そちらの分野は私の勉強不足だ

分野が違うことによる意見の相違のようなので、
私はもうこの辺りでフェードアウトしたい

34:デフォルトの名無しさん
12/01/03 20:16:59.85
>>31
そこで言う関数の規模とは、一体どういう意味での規模なのか。
俺自身が触ってきたコードから言うと、
筋のいいOOライブラリのメソッドと関数型言語の関数定義は
同じぐらいの粒度だと思う。行数も同程度。もちろんJavaじゃないぞ。


35:デフォルトの名無しさん
12/01/03 20:25:45.57
>>31
面白い述懐だな。宣言性、計算順序性、独立性、関数規模、デバッグ容易性・・・
「各宣言を独立に扱える」というのは、「関数間にまたがってまで計算順序を
意識する必要がない」とようないう意味だね?

36:デフォルトの名無しさん
12/01/03 20:46:59.65
>>34
その筋のいいOOライブラリが何なのか教えてください

37:21
12/01/03 21:27:08.07
>>35
> 「関数間にまたがってまで計算順序を意識する必要がない」とようないう意味だね?

こちらこそ、なるほどなと思わせる解釈だが、私の言いたかったことは半分正解

当然ながら計算を追うには複数の関数を跨がないといけない
関数Aの中で関数Bと関数Cを使っていたら、
関数Aの最終的な値が「計算される仕組み=計算過程」を知るには
関数Bも関数Cも計算を追わないと絶対にわからない

ただ、関数Bや関数Cは(関数Aのlet節やwhere節で宣言されたものでないかぎり)
普通は関数Aの環境からは独立しているはずだ
もちろん互いの環境とも独立しているはず

であれば、関数Bの計算は、関数Cの計算とは全く関係ないはずだ
参照透過性ゆえに「自動的に」そうならざるをえない

なので、たとえば関数Bのデバッグは関数Cとは独立して行える
これが「各宣言を独立に扱える」ということ

関数Aの計算過程を追うには関数Bや関数Cを跨ぐ必要があるが、
関数Bや関数Cの計算過程を追うには関数間をまたぐ必要がない
だから(私が言いたかったことに関しては)半分正解

ちなみに、関数Bの戻り値に関数Cを適用すればまたがるだろという意見もあろうが、
それでも関数Cを計算する仕組みは変わらない
関数Cを引数の値によって計算そのものを変える事もできてしまうが、
そこまで行くと筋の悪るすぎるHaskellプログラムだから論外だ

38:デフォルトの名無しさん
12/01/03 21:39:32.21
まとめると
・参照透明性はすばらしい
・遅延評価は糞
ということでよろしいか

39:21
12/01/03 21:43:24.13
>>34
> そこで言う関数の規模とは、一体どういう意味での規模なのか。

期待させたのなら申し訳ないが、大した意味は全く無い

言葉が足りなかったな
その関数の規模が小さいほど、みんなで「そろって」デバッグしやすい
というニュアンスで言いたかったんだ

貴方がOOの例で言った関数の規模ときっと同じ意味だ
中でどれほど長い式の計算をしているか、という程度の曖昧な意味だよ

一つの関数内で where 節などでたくさん内部関数を宣言してたりして式が大きいと、
その関数を複数人でデバッグするということは、現実的になかなか難しいからね
いくつかの外部の小関数に分けてあれば、それぞれの小関数をみんなでデバッグできる

もちろん、各小関数が独立しているからこそ、みんなでデバッグができる

40:デフォルトの名無しさん
12/01/03 21:47:23.46
>>37
基本的に了解なのだが、
>関数Aの中で関数Bと関数Cを使っていたら
この場合でも,関数Aの計算過程は関数Bのそれと関数Cのそれから
独立だよね?(細かい確認でスマンが)

41:21
12/01/03 22:03:55.69
>>40
すまん、いつも言葉が足りなくて誤解を与えてしまうな

「関数Aの計算過程を知る」の定義によるだろうね

>>37 では、内部で使ってる関数の内容も含めて関数Aの計算過程と暗に定義していた
だから独立はしてなくて、関数Bや関数Cも知らないとね、と

内部の関数は含めず、純粋に関数Aの中での式を知るという定義なら、独立している
きっと >>40 はこちらの意味で受け取ったんだよね

42:デフォルトの名無しさん
12/01/04 03:24:45.46
>>38
そんな簡単に分けられへん。

43:デフォルトの名無しさん
12/01/04 08:21:01.96
>>38 >42
というかコインの表と裏。

44:デフォルトの名無しさん
12/01/04 11:05:48.35
スレを読みに来て腹減ってしまったがな。 スパゲティ食べたくなった。。。。

45:デフォルトの名無しさん
12/01/04 11:06:26.92
だれか githubからスパゲティなhaskellプログラムさがしてくれ

46:デフォルトの名無しさん
12/01/04 11:15:45.18
Agdaのsrc/full/Agda/Auto/以下がお勧め

47:デフォルトの名無しさん
12/01/04 11:23:18.51
このなかで圏論に手を出してる香具師おる?

48:デフォルトの名無しさん
12/01/04 11:29:39.22
最近出そうして打ちのめされた
基礎からやるならまず集合論でいいの?

49:デフォルトの名無しさん
12/01/04 12:13:15.78
数学で集合論って言うと、ZFC、巨大順序数とかその辺だから、離散数学辺りから。
集合、位相、束、代数、グラフ、論理の初歩をまとめたような本。
列挙したのをちゃんと理解してないと圏論は歯がたたない。

例えば↓が網羅的で練習問題回答がしっかりしてるから独学に向いてる。
URLリンク(www.amazon.co.jp)
これじゃ初歩的すぎるというのなら推薦図書スレで、
自分の数学能力を話した上で相談したらどうか。

50:デフォルトの名無しさん
12/01/04 12:35:49.88
>>49
あざっす
立ち読みしてみるわ

51:デフォルトの名無しさん
12/01/04 13:12:29.45
>>47
おるよ。なにか話してみてくれ。

52:デフォルトの名無しさん
12/01/04 13:51:46.30
>>48
どの辺りで打ちのめされたのかによるよ

俺は
Conceptual Mathematics: A First Introduction to Categories
URLリンク(www.amazon.co.jp)

これを読んで、難しかったり、意味が分からなかったり、
納得できなかった部分に出会ったら、その都度他の資料に当たったり、
数学系の掲示板で質問したりしてた

とりあえず古典的な集合の意味が分かって、
単射・全射が分かって、モノイドが分かれば、
圏論の入門書はけっこう読み進められると思う
(圏論の入門書の中でも必要な集合論を必要最小限説明してるし)

抽象的すぎて「飽きる」可能性は大いにあるが

53:デフォルトの名無しさん
12/01/04 13:59:21.34
集合論って前提がほとんどないから
勉強しはじめるには良い分野だと思う

54:デフォルトの名無しさん
12/01/04 14:06:02.43
プログラミング出来るなら概念としては分かってるところも多いしね

55:デフォルトの名無しさん
12/01/04 14:16:07.06
モナドとモノイダル圏って何か関係あるんですか?
join(T^2 -> Tな自然変換)がモノイドになっているっていう話ですか?

56:デフォルトの名無しさん
12/01/04 14:17:40.48
ああ、モノイドは単位元もいるのか…

57:デフォルトの名無しさん
12/01/04 15:51:22.79

           ______
          r〃〃〃 f7⌒ろ)
           l∥∥∥ ||   f灯
            |∥∥∥ ||   | |
            |儿儿儿._」∟⊥厶
           〔__o____o_≦ト、
.          i / ⌒  ⌒  ヽ )
          !゙ (・ )` ´( ・)   i/
          |  (_人__)    | \
          \  `ー'    /  / ー- 、
.          ,ィ(⊆≧リ≦⊇)〃   /     rク\
.       /   | ̄r少}¨ ̄〃   /    /′ ヽ
      〃 l   |  l| | l| 〃    /     /    └ヽ
     /    l  |l | |l/″   /      !  厂    \
    く,  Y   ! l」fレト!    /       | /        1
    丿  |   | 丿} じ’  /      | /         |
   /     l   | `¨      /      レ′        |

             真の思考停
    (在位 2009年9月16日~2010年6月8日)

   民主朝の初代考停、言行不一致、虚言、脱税、
   そして外交において巨大な負の遺産を築いた。

58:デフォルトの名無しさん
12/01/04 17:03:46.51
>>52
>圏論の入門書はけっこう読み進められると思う
読み進んでもイミフと思われ

59:デフォルトの名無しさん
12/01/04 17:06:48.83
モナド則ってなんでこんなに遠回しな言い方するの?
[1] (return x) >>= f == f x
[2] m >>= return == m
[3] (m >>= f) >>= g == m >>= (\x -> f x >>= g)

60:デフォルトの名無しさん
12/01/04 17:25:19.49
これ以上ないってほど直球のように見えるが

61:デフォルトの名無しさん
12/01/04 17:27:45.77
>>59
それが「遠回し」と言えるのなら、
遠回しでないもっと簡単な表現に置き換えてみてほしい

62:デフォルトの名無しさん
12/01/04 18:17:34.27
おれは集合論の順序完備化あたりでうちのめされた・・・orz

63:デフォルトの名無しさん
12/01/04 20:55:50.83
>>60
そうか。そういう人もいると思うが、通常そういう人は、「何でも理解しちゃう」
人が多いんだよね。
>>61
簡単な表現かどうか以前に、まずこれとは別の表現は見つかる?

64:デフォルトの名無しさん
12/01/04 21:10:30.32
>>59 は「この表現が理解できない」のではなく、
「なぜ遠回しな言い方をするのか」と訊いている

これは、遠回しではない言い方を知っている上で、
そのような表現ではなく、なぜ敢えて遠回しにするのか、
という意味で訊いているように俺は解釈した

ならば、その遠回しではない言い方に置き換えて表現してみてはくれないだろうか

それとも、俺の解釈が間違っていたか?


ちなみに、俺は少なくともモナド則に関してはこの表現で理解できたから、
別の表現を探す気は起こらない

65:デフォルトの名無しさん
12/01/04 21:46:10.84
具体例を知らないのに圏論だけやってもダメなんだ

66:デフォルトの名無しさん
12/01/04 21:46:16.22
father(son(x)) = x は遠回しに見える。それぐらいの意味だ。
後はなんちゅうことないことだ。

67:デフォルトの名無しさん
12/01/04 21:53:17.25
>>65
だけど圏論によい具体例があまりないんだ。
なにかよい例を知っているか?
圏の例は基本的だが,圏の圏の例がより実践的だと思うが。

68:デフォルトの名無しさん
12/01/04 21:53:23.57
モナド則は、returnと(>>=)で>>59みたいに書くほかにreturnと(<=<)でも書ける

[1] return <=< x == x
[2] x <=< return == x
[3] (a <=< b) <=< c == a <=< (b <=< c)
[4] (a <=< b) . f = a <=< (b . f)

どっちがシンプルに思えるかは人に依るかも

69:デフォルトの名無しさん
12/01/04 22:14:27.60
>>68
こりゃますます常人には分からんな。
スマンが間単に読み方を教えてくれんかな?

70:デフォルトの名無しさん
12/01/04 22:18:57.72
>>69
(<=<)はControl.Monadで定義されてるよ。定義は、
f <=< g = \x -> g x >>= f

71:デフォルトの名無しさん
12/01/04 22:42:02.17
定義なんだからモナド則はこれっていう以上の何が必要なんかわからん。
遠回しもくそもないだろ。

72:デフォルトの名無しさん
12/01/04 22:43:16.38
素直に、モナド則が理解できないから詳しく説明してほしい、と言えばいいのに

表現が遠回しだとか、それこそ遠回しに伺っても、期待する返事は来ないぞ

(まぁ、単刀直入に訊いても、期待する返事が来るとは限らんけど)

73:デフォルトの名無しさん
12/01/04 22:46:17.58
この人は相変わらず質問がヘタだな

74:デフォルトの名無しさん
12/01/04 22:59:11.16
>>71 >>72
この人たちは定義というものはなにかを定義していさえすればよいものだと
思っているらしい。

75:デフォルトの名無しさん
12/01/04 23:02:28.21
マジで何言ってんのお前

76:デフォルトの名無しさん
12/01/04 23:03:18.65
   ∧_∧   
 ( ´∀`)< ぬるぽ

77:デフォルトの名無しさん
12/01/04 23:06:15.65
先月と、先々月の数学セミナーの圏論の歩き方におもいっきり載ってたろ・・・。

78:デフォルトの名無しさん
12/01/04 23:12:52.94
いや同じものを定義するのにも分り安い方法とそうでない方法があるのは普通のことだろ

79:デフォルトの名無しさん
12/01/04 23:14:30.33
>>66
それのどこが何に対して遠回しなのかを説明してくれ
そうすれば、君が >>68 の何に対して遠回しと感じているのか分かるかも知れん

father(son(x)) = x

これは、左辺にある x に対する2個の(この順の)変換が右辺と同等である
という事を示していると思う

このような意味を表すのに father(son(x)) = x を持ち出すのが遠回しと感じるのなら、
君ならどう式で表現するのだろうか?

80:デフォルトの名無しさん
12/01/04 23:24:29.25
せっかく突っ込んで書いてくれたんだから読んでやれよ・・・。

81:デフォルトの名無しさん
12/01/04 23:34:44.98
早くもっと簡潔で直接的なモナド則の書き方書けよ

82:デフォルトの名無しさん
12/01/04 23:48:28.90
>>79
>father(son(x)) = x
>これは、左辺にある x に対する2個の(この順の)変換が右辺と同等である
>という事を示していると思う
うん。だがそれはその式を単にそのまま読んだだけだと思うんだ。
なにが言いたいんだこの式は?何が言えてるんだこの式は?とは思わな
いかい?
まあそういうことなんだが、皆さんイライラしているようだし、この辺
で寝るよ。かまってくれてありがとう。

83:デフォルトの名無しさん
12/01/04 23:55:17.37
f(g(x)) = xという形の等式が直感的に何を意味するかは慣れないと分かりにくい
でも一旦慣れれば問題なくなるし、
この内容を簡潔に表現するにはこの式しかないと思うようになる(f . g = idもあるけど)
モナド則も似たようなもんじゃね

84:デフォルトの名無しさん
12/01/05 00:09:23.77
俺が分からないのはお前らのせいって言いたいだけじゃん。

85:デフォルトの名無しさん
12/01/05 00:22:26.47
>>82
> だがそれはその式を単にそのまま読んだだけだと思うんだ。
> なにが言いたいんだこの式は?

全く逆だ

「x に対して2個の変換 son と father をこの順で適用したものは x と同等である」

という、たまたま今は日本語で表された 「意味」 が何よりも先に先にある
(この意味を人に伝えるには何かの言語で表す以外ないから、たまたま日本語で表した)

この意味を数式という言語で表せば father(son(x)) = x となる
この意味を英語という言語で表せば・・・
この意味をヒンドゥー語という言語で表せば・・・お任せする

モナド則も意味が先にあって、それをHaskellの式で表す方法のひとつとして >>59 がある
他にも >>68 の様に表す方法もあるし、もしその意味を日本語で表すなら・・・

ということだ

86:デフォルトの名無しさん
12/01/05 00:31:08.78
もしかして数学の定義を使って証明したことがないじゃなかろうか?

87:デフォルトの名無しさん
12/01/05 03:04:58.01
関手fmapと自然変換returnと自然変換joinが「モナド」になる
っていうのが一番簡潔で直接的なモナド則の書き方

>>= は \f->\g->join (fmap g f)によって定義できる二次的なもの

88:デフォルトの名無しさん
12/01/05 03:54:01.40
[1] join . join == join . fmap join
[2] join . return == id == join . fmap return

89:デフォルトの名無しさん
12/01/05 14:48:38.07
犬論で拳論でもいいけど、謙論を忘れずに。

90:デフォルトの名無しさん
12/01/05 14:52:37.50
>>49
計算論 計算可能性とラムダ計算
買ってみようと思う。
他におすすめある?

91:デフォルトの名無しさん
12/01/05 14:55:33.27
プログラミングの道具としての圏論ならばalgebra of programming一冊各種証明を手で追いながらみっちりやれば充分

92:デフォルトの名無しさん
12/01/05 15:20:01.29
中古で六万かよ

93:デフォルトの名無しさん
12/01/05 15:49:55.57
>>92
Amazon.com 本店(米)の中古はもっと酷い 916.21 ドル

でも、Amazon.co.uk なら中古が 20 ポンドで売ってる(国際便もあるみたい)

94:デフォルトの名無しさん
12/01/05 17:09:38.32
大学講義の離散数学で単位ギリギリとった俺は>>49くらいがちょうどいいかな

95:デフォルトの名無しさん
12/01/05 17:47:12.97
もしそれが恥ずかしくないのなら、>>49 でもやばいかも

96:デフォルトの名無しさん
12/01/05 17:49:28.01
 URLリンク(blog.ezyang.com)

MITの学生さんだって。みな頑張れ

97:デフォルトの名無しさん
12/01/05 17:53:03.61
>>91-3
どうせ大学の図書館探したら転がってるだろうから、みることは可能だろうよ。

98:デフォルトの名無しさん
12/01/05 18:37:14.15
お前らは何百年同じ話を続けるつもりなんだ?

99:デフォルトの名無しさん
12/01/05 18:46:42.96
あと1億年と2000年間

100:デフォルトの名無しさん
12/01/05 18:51:23.55
いや、あと数年で終わらせるから待ってろ

101:デフォルトの名無しさん
12/01/05 19:17:34.36
>>99
8000年過ぎた頃からもっと繰り返したくなった

102:デフォルトの名無しさん
12/01/05 20:56:35.84
>>87
そうだね。
>>86
むしろ定義しか使わん。公式を使ったことはあまりないが。
>>85
>「x に対して2個の変換 son と father をこの順で適用したものは x と同等である」
数学世界の閉じこもりならそれでよいが、それでは世間と話ができんだろ。
>>84
理解できてる、理解できてない、なんてことはまあつまらんことだ。

103:デフォルトの名無しさん
12/01/05 22:02:39.10
85-86への返答からだと、
何を分かってないのか分からんのじゃないかと思う。

104:デフォルトの名無しさん
12/01/05 22:14:39.66
>>102
[1] モナド則の意味をできるだけ平易な日本語で表現してほしいのか、
[2] 単にライブラリドキュメントに書かれたモナド則の表現が遠回しだと言いたいだけか
[3] それ以外の事が言いたいのか

[1] なら素直にそう言え

[2] なら言いたいだけ言っていれば良い

[3] ならハッキリと意思を伝えろ

105:デフォルトの名無しさん
12/01/05 22:18:19.52
この人はもう無理だろ
ネタでやってるとしか思えないぐらい質問が要領を得ない

106:デフォルトの名無しさん
12/01/05 22:49:24.22
定義に従うのもいいけど、定義のないものは徹底的に無視するのも数学では重要だと思う
Haskellの範囲で定義されていないことをわざわざ調べて付け足す必要はない

107:デフォルトの名無しさん
12/01/05 23:04:55.33
モナドじゃないけど、adjunctionの定義は「何が言いたいんだ?」ともどかしかったなあ。
あのhom(FY,X) = hom(Y,GX)という定義式がなぜねじれた形になってるのか、
ずっと疑問だった。

108:デフォルトの名無しさん
12/01/06 10:40:36.54
腐: ホモだから

109:デフォルトの名無しさん
12/01/06 10:59:56.72
ほむほむ

110:デフォルトの名無しさん
12/01/06 12:54:31.23
随伴なんて単なる関手の圏における同型な対象にすぎない

111:デフォルトの名無しさん
12/01/06 15:20:01.72
URLリンク(ja.wikibooks.org)
圏論知らないなりに↑の説明読んだんだけど、
>モナド は圏から同じ圏へいくつかの追加の構造を提供する特殊な関手
ってところにちょっと引っかかったので2点質問させてください。

1.例えばInt と Maybe Intは別の圏に存在する対象だと読みながら勝手に想像してたんだけど、
この説明からいくと同じ圏に属していると考えてOK?
あるいは、Dまでいかない、C'ぐらいの内部的な圏みたいな概念がもしかして存在する?

2.Haskellにおいて圏から別の圏への変換にあたる操作って、具体的には何なんでしょう?

112:デフォルトの名無しさん
12/01/06 16:06:41.22
1.同じ圏の対象とも別の圏の対象とも考えることは可能。
そのリンク先ではHask圏という、Haskellの型が対象で関数の値が射とする圏を考えているので、
その文脈の限りではIntとMaybe Intは同じ圏の対象だと考えて良い。

2.Functor型クラスがHask圏からHask圏への変換(自己関手)を表現していると考えられる。
class Functor (f :: * -> *) where
fmap :: (a -> b) -> (f a -> f b)
この定義の内、f :: * -> *のところがHask圏の対象である型を、別の型に写像する関数を表現している。
また、fmap :: (a -> b) -> (f a -> f b)のところが射を写像する関数を表現している。

113:デフォルトの名無しさん
12/01/06 16:15:39.92
>>112
ありがとうございます、1については多分納得しました。
2は質問が悪かったです。
自己関手ではなく、明確に別の圏と考えられるものに変換しているような関手の具体例が
Haskellにあれば教えて欲しかったのです。

114:デフォルトの名無しさん
12/01/06 16:31:14.92
普通の型と[a]のようなリスト型が別の圏の対象であると解釈すれば
Functor型クラスが別の圏に変換する関手だ、と考えることもできるよ。
何を圏と考えるかの問題。

115:デフォルトの名無しさん
12/01/06 16:36:15.59
>>114
書いてから、何を圏とするかで変わるよな、とは思ったのですが意図を汲み取って頂けて嬉しいです。
Hask圏で考えると、Haskellにおいて別の圏にあたる概念はなさそうですね(?)。

116:デフォルトの名無しさん
12/01/06 16:45:49.97
>>107
それ俺も分からない。なぜ?

117:デフォルトの名無しさん
12/01/06 16:48:49.32
Hask圏のサブセットを別の圏と考えたりして色々考えることはできそう。

118:デフォルトの名無しさん
12/01/06 20:58:56.44
?一気にレベル上がったな
>>115
よくわからんが、型を集合(Set圏の対象)と考える場合、HaskellのFunctorは
型から型(集合から集合)への対応で、Set圏で完結していると考えられるから
基本無理なんじゃない?
あるとしたら集合からなにか別の対象を構成して圏自体を構成するとか必要になるのじゃないかと思う。

119:デフォルトの名無しさん
12/01/06 21:59:44.43


 東京にある6つのキー局の内、製作から財務まで一貫して朝鮮人が行ってるテレビ局が1つ
 中国共産党から毎年大量の反日工作費が流れているテレビ局が2つ
 もろに北朝鮮と繋がっているテレビ局が1つ  
年寄はまだまだテレビという外国人に騙され続ける


120:デフォルトの名無しさん
12/01/06 22:17:19.97
>>116
>>110

121:デフォルトの名無しさん
12/01/06 22:37:50.72
説明してくれ。

122:デフォルトの名無しさん
12/01/07 01:57:09.16
まだやってんのか?

123:デフォルトの名無しさん
12/01/07 13:33:31.17
>122
Let's join us!

124:デフォルトの名無しさん
12/01/07 14:49:07.40
>>59
[1] flip(>>=) f . return == f
[2] flip(>>=) return . f == f
[3] flip(>>=) g . flip(>>=) f == flip(>>=) (flip(>>=) g . f)
この定義から分かることは
f と g と return には flip(>>=) を適用できること
flip(>>=) f の戻り値の型は f の戻り値の型と同じ (引数の型だけ変わる) ということ

つまり、戻り値の型は変えられないが引数の型は変えられるようなものを表現したいんだと思う

125:デフォルトの名無しさん
12/01/07 15:59:51.70
>>124
うん。勿論[1]-[3]は、>>=やfなどの型についてのそういう制約を前提にして
いるが、[1]-[3]はそれ以上の条件を表現しているよね。

126:デフォルトの名無しさん
12/01/07 16:31:12.63
>>125
== が成立する条件が難しいと思う
f==g なら f の型と g の型は等しいとは思うが、それ以上は難しい

127:デフォルトの名無しさん
12/01/07 23:46:02.70
== を「型が等しい」と解釈するならモナド則は自明
別の意味があるなら == を定義するべき

128:デフォルトの名無しさん
12/01/08 09:04:29.08
>>107 >>110
hom(X,Y) = hom(FX,FY)

129:デフォルトの名無しさん
12/01/08 10:07:40.92
それはほむ関手と普通の関手Fの合成関手

130:デフォルトの名無しさん
12/01/08 10:39:44.40
Y:=(1/F)W

131:デフォルトの名無しさん
12/01/08 11:54:54.22
式だけ書いておけば後は汲みとれるはずだというやつは本当に大嫌いだ。
まさしくクソメン。

132:デフォルトの名無しさん
12/01/08 12:05:09.42
>>131
だからさ、詳しく説明して欲しいのなら素直にそう言えって何度言ったら・・・

説明を求めていないのなら無視しろよ

133:デフォルトの名無しさん
12/01/08 12:08:42.39
ほむの中でFが増殖する気持ち悪い関手

134:デフォルトの名無しさん
12/01/08 12:10:29.13
違うね。これはそういう問題じゃない。
それに無視して暗に黙認を形成することは少なくとも俺には絶対にできない。
そういう表明だ。

135:デフォルトの名無しさん
12/01/08 12:16:57.29
そもそもスレチだ。

136:デフォルトの名無しさん
12/01/08 12:17:54.40
>>134
黙認しないのなら、しっかり質問しろ

お前は「嫌いだ」としかまだ言っていない
嫌いだと表明するだけでは残念ながら何も起きないぞ

式だけ書いておけば・・・と言っておきながら、
その式について何も訊いていないだろ
>>130 にとっては、お前がこの式の何が分からないのかが分からない状態だと思うが


137:デフォルトの名無しさん
12/01/08 12:21:07.73
もう構うなよ…
この人は自分で調べないから絶対に具体的な質問出来ない人だよ

138:デフォルトの名無しさん
12/01/08 12:24:51.53
>>136
何か起こす?そんなの期待してるから何も出来ないんだよ。

そもそも圏論はスレ違いだ。

139:デフォルトの名無しさん
12/01/08 12:32:03.12
別に説明して欲しい訳じゃなくて、>>130のやりかたがコミュニケーションとして酷いといってるんじゃないの

140:デフォルトの名無しさん
12/01/08 12:34:44.10
けんかはやめてくれ。みんな俺が悪いんだから。

141:デフォルトの名無しさん
12/01/08 12:49:17.63
わかればいいが、普段からそんな話の展開をしてるなら改めたほうがいい。

142:デフォルトの名無しさん
12/01/08 13:05:02.48
>>141
不粋だな

143:デフォルトの名無しさん
12/01/08 13:07:29.45
template haskellの機能を使ってモジュール内で定義されてる関数の名前全部取得するような事ができるみたいなんだよ
これをどうやって実現してるかというと、どうやら展開時に自分自身が記述されてるファイルをIO使って読み込んで解析してるらしい
よく聞くコンパイルタイムIOという空恐ろしいものはこうやって使うのかといういい実例だと思ったね

144:デフォルトの名無しさん
12/01/08 13:15:03.18
>>143
template haskell って地味に良い拡張機能だよな
HaskellDB で使って実感したわ


対応した IDE ができるともっと良いが

145:デフォルトの名無しさん
12/01/08 13:20:27.44
まともなIDEがない時点でC以下

146:デフォルトの名無しさん
12/01/08 14:15:39.33
IDE で C と比べたって意味無いよ

IDE で言語選ぶわけじゃないし

147:デフォルトの名無しさん
12/01/08 14:16:43.08
ghc-modじゃ不足でしょうか、、、

148:デフォルトの名無しさん
12/01/08 14:55:26.81
文句あるなら造れ
そして英雄となれ

149:デフォルトの名無しさん
12/01/08 14:56:05.77
IDEで言語選ばないの?
あなたはIDEで言語を選ばないの?
多くの人はIDEで言語を選ばないの?
すべての人はIDEで言語を選ばないの?

150:デフォルトの名無しさん
12/01/08 15:02:26.58
ドカタが仕事にありつける言語にはIDEがある、が正解

151:デフォルトの名無しさん
12/01/08 15:03:00.33
量化を取り除くと自己言及の誤謬に陥るのでNG

152:デフォルトの名無しさん
12/01/08 15:15:52.21
>>147
ghc-mod って、template haskell に対応してたっけ

たとえば、Template haskell のチュートリアルに

-------------------------------
module TupleReplicate where
import Language.Haskell.TH
tupleReplicate :: Int -> Q Exp
tupleReplicate n = do id <- newName "x"
return $ LamE (VarP id)
(TupE $ replicate n $ VarE id)
-------------------------------

という例がある

$(tupleReplicate 2) が a -> (a, a) という型の関数
$(tupleReplicate 3) が a -> (a, a, a) という型の関数
と ghc-mod は教えてくれる?

言っておくが、ghc-mod がクソとか役に立たんと言ってるわけではない

153:デフォルトの名無しさん
12/01/08 15:19:15.80
>>152
やったことないです、、、
@kazu_yamamotoさんに聞いてみルトいいかも

154:デフォルトの名無しさん
12/01/08 15:25:29.61
IDE有る無しで開発効率に影響するのなら、
もちろん言語選択時に考慮するだろ

155:デフォルトの名無しさん
12/01/08 15:27:02.91
統合開発環境の「統合」って、最近流行った「絆」と同じセンスだよね

156:デフォルトの名無しさん
12/01/08 15:36:00.48
C#とかは言語設計段階からIDEと相性良くなるように考えられてると感じる

157:デフォルトの名無しさん
12/01/08 15:40:42.17
>>152
foo = $(tupleReplicate 2)と展開した上で名前に束縛すればfooについて当然型名がかえって来るけど
確かhaskellのインタプリタ(not ghci)が走ってるプロセスを持ってて
バッファの内容を食わせた上で指定した文字列でそいつに問い合わせてるから、
トップレベルで名前を持ってない定義だと上手く参照してくれないんじゃないかと思う


158:デフォルトの名無しさん
12/01/08 15:59:20.60
勝って兜の緒を締めよ開発環境

159:デフォルトの名無しさん
12/01/08 17:11:37.66
>>118
> よくわからんが、型を集合(Set圏の対象)と考える場合、HaskellのFunctorは
> 型から型(集合から集合)への対応で、Set圏で完結していると考えられるから
> 基本無理なんじゃない?

結局は、解釈、モデル化の仕方の問題だけど、
関数以外のArrowクラスのインスタンスを射として考えるならば、
それはHask圏=Set圏の射ではないから、
Hask圏の部分圏と考えることはできない圏を考えていることになる

160:デフォルトの名無しさん
12/01/08 19:13:49.14
震災前

     /::::::::::::::::::::::::::::::;;::ノ ヽ;::\
    /::::::::;;;;;;;;;,,,;;...-‐''"~    ヽ:;::l
     |:::::::::::|    岡田 異音    |ミ|
     |:::::::/     ,,,  ヽ,、   '|ミ|  
     '|:::::::l    '''""   ゙゙゙゙`   |ミ|
       |:::::|.  ,,r ‐、   ,, - 、  |/
     ,/⌒|  ノ ・ _), (. ・ `つ|
     | (   "''''"    |"'''''"  | 
      ヽ,,.        ヽ    |
       |       ^-^_,, -、   |   
         |    _,, --‐''~    ) |  マニフェストもう守れない。どうしよう・・・・ 
         'ヽ  (   ,r''''''‐-‐′ / 


震災後

     |:::::::::/            |ミ|
     |::::::::|   ,,,,,    ,,,,,   |ミ|
     |彡|.  '''"""''   ''"""'' |/
     /⌒|  -=・=‐,   =・=-  |
     | (    "''''"   | "''''"  |  
     .ヽ,,         ヽ    .|  キリッ
        |       ^-^    |
   .     |     ‐-===-   |   大震災が起こったのだからマニフェストの破綻も致し方ありません
         ,\.    "'''''''"   / 
朝鮮民主党
     おわり

161:デフォルトの名無しさん
12/01/09 20:15:30.30
すっごい初心者ですまないんだけど

x=10
x=11

これってHaskellでどう書くの?

162:デフォルトの名無しさん
12/01/09 20:19:11.15
書けない

163:デフォルトの名無しさん
12/01/09 20:36:13.49
>>161
関数型は変数の意味が違うよ。適当な教科書を読んでみましょう

164:デフォルトの名無しさん
12/01/09 20:41:21.78
こう書くんだよ

main = do
let x = 10
let x = 11
print x

165:デフォルトの名無しさん
12/01/09 21:27:31.04
>>164
サンクス

166:デフォルトの名無しさん
12/01/09 23:34:33.20
>>164をこう↓できると思ったんだけど無理だった、何故?
main =
 let x = 10 >>
 let x = 11 >>
 print x

167:デフォルトの名無しさん
12/01/10 00:08:36.44
>>166
do
let ***
###

これは、プリプロセッサで次のように変換される

let *** in do ###

これを踏まえて考えれば・・・

168:デフォルトの名無しさん
12/01/10 07:53:20.13
2-3 Finger Tree を閃いた奴、発想が良いな

169:デフォルトの名無しさん
12/01/10 09:41:18.37
民主党には朝鮮人など外国人のなりすまし、スパイが約90名在籍している

野田内閣は過半数が帰化人

野田はどうだろうか
韓国人から賄賂を貰い、韓国人の集いに出席している野田は


170:デフォルトの名無しさん
12/01/10 15:47:47.65
>>158
東郷開発環境wwwwwww



って誰か言ってくれると思ったのに。。。

171:デフォルトの名無しさん
12/01/10 19:42:08.90
申し訳ありませんでした

東郷開発環境wwwwwww

172:デフォルトの名無しさん
12/01/10 20:31:46.91
G13型トラクターか...

173:デフォルトの名無しさん
12/01/11 03:08:02.86
東郷開発環境wwwwwww

174:デフォルトの名無しさん
12/01/11 18:47:00.09
論理的な発想ができない連中がなぜHaskellのスレッドにいるのか不思議。

175:デフォルトの名無しさん
12/01/11 18:55:22.75
論理的思考と等式推論を使えることに相関は無い

176:デフォルトの名無しさん
12/01/11 19:22:23.15
>>167
こうか
main =
 let x = 10
 in let x = 13
    in print x

つーかこの式って(>>)か(>>=)を使って表現出来ないの?
副作用にはモナドを使うんじゃないの? わかんないです><

177:デフォルトの名無しさん
12/01/11 19:25:03.27
>>175
勝手に変な方向に誘導するなよ
>>174 は論理的な思考ではなく「発想」と言っている

発想、つまり ヒラメキ☆ だ

178:デフォルトの名無しさん
12/01/11 19:25:13.02
letはλ抽象でモナドを使った式は関数適用
ラムダ計算の項としてみたら全く別物

179:デフォルトの名無しさん
12/01/11 19:32:06.33
>>176
そう

最後の print 関数が副作用を持っている
だから「この」 main関数の型は IO () だ

君はちゃんと副作用にはモナドを使っているんだよ
なにが分からん?

> つーかこの式って(>>)か(>>=)を使って表現出来ないの?

もしかして、こういうこと?

main = return 10 >> return 13 >>= print

180:デフォルトの名無しさん
12/01/11 22:20:24.86

800 自分:名無し募集中。。。[] 投稿日:2012/01/08(日) 22:00:50.04 0
AKBブーム捏造の裏

サウンドスキャンの売り上げでさえほとんどが業者の自社買い他社買いで
資金洗浄した金額がオリコンの枚数×CDの価格って感じかね
URLリンク(livedoor.blogimg.jp)



181:デフォルトの名無しさん
12/01/11 23:18:15.23
>>176

同じことをC言語で書くとこんな感じ

void main() {
 const int x = 10; {
  const int x = 13; {
   printf("%d", x); }}}

副作用があるのは最後のprintfだけ。
途中のx=13は代入ではなくてたまたま名前が同じ新しい定数の定義。

182:デフォルトの名無しさん
12/01/11 23:52:21.03
Haskellでオブジェクト指向ってどうやるの?

183:デフォルトの名無しさん
12/01/12 07:42:44.45
オブジェクト指向のどの部分を真似したいかによる
(オブジェクト指向を直接的に支援する機構はない)

184:デフォルトの名無しさん
12/01/12 10:52:41.77
HaskellでCを真似しながらCでオブジェクト指向を真似する
間接的ヒラメキ

185:デフォルトの名無しさん
12/01/12 11:51:38.40
HaskellでOOPをやる方法
URLリンク(www.haskell.org)

186:デフォルトの名無しさん
12/01/12 16:10:46.59


2chやニコニコ動画に民主党から反日工作費が流れていることが知られるようになってきた。
民主党が用意した資金で工作員が2chを荒らしていることもだんだんと知られるようになってきた


187:デフォルトの名無しさん
12/01/12 21:48:47.06
パッケージを cabal install する時に、
ghc にオプションを渡す方法ってありますか?

例えば -XFlexibleInstances とか

188:デフォルトの名無しさん
12/01/12 21:53:26.27
cabal install --ghc-options=-XFlexibleInstances

189:デフォルトの名無しさん
12/01/12 22:08:16.42
>>188
もしかして、cabal install --help で表示それるオプション リストの
--with-PROG=PATH や --PROG-options=OPTS などの PROG って、
ここに ghc や c2hs などのコマンド名を入れろって事か

どおりで --with-PROG=ghc なんてゃってもエラーが出るわけだ

やっと最後に表示されてる
The flags --with-PROG and --PROG-option(s) can be used
with the following programs:
の意味が分かったよ

ありがと

190:デフォルトの名無しさん
12/01/13 12:53:13.89
型変数を伴うシグネチャを持つ関数を、
ある型で特殊化することはできるのでしょうか

たとえば元々 f :: [a] -> a という関数があったとして、
a が Int 型の時は別の計算をさせたいから f :: [Int] -> Int
という型の「同名の」関数も欲しい場合です

下記のように型クラスを作るしか方法はないでしょうか
そうすると、Int 型以外の型にも全て
インスタンスを宣言しないといけないので大変です

class F a where
f :: [a] -> a
f = 汎用的な計算

instance F Int where
f = 特殊な計算

instance F Bool
instance F Char
・・・

191:デフォルトの名無しさん
12/01/13 13:59:50.39
OverlappingInstances拡張を使って、instance F a

192:質問です
12/01/13 18:40:35.10
モナドのデータ m a と 関数 f :: a -> m b を使って、
モナドのデータ m b を作り出すことがなんで『合成』なの?

193:デフォルトの名無しさん
12/01/13 18:47:24.24
どこでそんな表現が使われてた


194:デフォルトの名無しさん
12/01/13 18:53:11.74
複数の小さいデータを組み合わせて大きいデータを作るなら合成でいいんじゃね

195:質問です
12/01/13 19:01:34.54
>>193 ここです
URLリンク(tnomura9.exblog.jp)
>>= 演算子はMaybe型関数とMaybe型関数を
合成する演算子になる、とありました

196:デフォルトの名無しさん
12/01/13 19:21:57.88
>>=は自然変換joinで自己関手を写像したものだから
Maybe圏からMaybe圏への関手だ、ぐらいの表現で良いのでは
合成と言うのは違う気がする

197:デフォルトの名無しさん
12/01/13 19:32:17.88
>>191
OverlappingInstances拡張がどのようなものか見てきました
URLリンク(www.haskell.org)

なかなか難しいですね、がんばって解読してみます

ありがとうございました

198:デフォルトの名無しさん
12/01/13 21:08:33.18
2つのモナドm1,m2の合成の自然な定義はあるのでしょうか?
直積?


199:デフォルトの名無しさん
12/01/13 23:01:33.65
さいなら。

200:デフォルトの名無しさん
12/01/13 23:59:10.31
野田改造内閣に早速疑惑浮上

@aritayoshifu 有田芳生
捜査当局が内偵を続けている農水疑惑。詳細な怪文書まで出回っている。3億円の
行方はどこに?

@minorucchu ジャーナリスト 田中稔
野田改造内閣を揺るがす、農水省3億円スキャンダルの怪文書。二人の議員名が浮上。
34分前 webから
URLリンク(twitter.com)

鹿野と筒井らしい
自公は問責も視野に調査開始だって

201:デフォルトの名無しさん
12/01/14 09:49:15.55
あれだけ他パラダイムをdisりまくったその口で
ハスケルはメタパラダイム言語だとか
ふざけんなってのw

202:デフォルトの名無しさん
12/01/14 09:54:29.57
メタパラダイム言語って言葉の意味が分からないからなんとも言えない

203:デフォルトの名無しさん
12/01/14 10:24:18.99
メタって便利な言葉だよな

204:デフォルトの名無しさん
12/01/14 10:50:14.56
「そろそろパラダイムについて一言言っておくか」ってことだろ
バスに乗り遅れた奴が使う言葉

205:デフォルトの名無しさん
12/01/14 10:54:46.75
マルチパラダイムと言いたかったのではないかと推測してみる

206:デフォルトの名無しさん
12/01/14 11:02:45.90
CでOOPができるしJavaでFPができるだろ
HaskellでOOPもできるんだよ
ただしそのパラダイムの為に設計された言語ではないので
可読性落ちたりするから推奨されないというだけの話

207:デフォルトの名無しさん
12/01/14 11:04:31.60
ぷでゆきさんは1年ぐらい前にマルチパラダイムは幻想とか言ってからそれはないだろうな

208:デフォルトの名無しさん
12/01/14 12:09:55.38
人のいうことを鵜呑みにしていいのかい?

209:デフォルトの名無しさん
12/01/14 16:46:37.25

反日ネット工作員
朝日新聞社→社員約300人
民主党とその取り巻きの資金が入った反日工作会社→数社約450人

朝日新聞の社員は捕まった49歳の編集者を含め新聞記事を書く合間に2chを荒らしている程度とみられているが
民主党が用意した反日工作会社はほぼ24時間体制で工作を行っている
工作範囲は民主党が予め工作費を流している2ch、ニコニコ動画を中心にyoutube、個人のブログなどである。



210:デフォルトの名無しさん
12/01/14 20:55:07.12
政治的なアナザー・ワールドの人がHaskellerってありえないよね?


211:デフォルトの名無しさん
12/01/14 20:59:45.86
あの人、言うことコロコロかわるから。
OOは複雑すぎてわからないと言ってみたかと思ったら
OOはしょせんこの程度のモデルに過ぎないからと言ってみたり
全く参照透明ではないw

212:デフォルトの名無しさん
12/01/14 21:44:45.71
>>206
推奨されないと言われても
禁止されているようなものだと思うか、禁止されていないと思うかで全く違う
推奨なんて中途半端なことをするから解釈がコロコロ変わる

213:デフォルトの名無しさん
12/01/15 00:17:59.85
>>211
発言を時間の関数と思えば参照透明。
これがHaskell流だ

214:デフォルトの名無しさん
12/01/15 08:56:17.00
>>201
「メタパラダイム言語」という言葉は、このスレが初出です。
「Haskellはメタパラダイム」というtweetの話をしているんですよね?

Haskellは○○
URLリンク(togetter.com)
>Haskellはメタパラダイム  tanakh 2012/01/13 17:38:41

もともとtanakhは「モナドはメタパラダイム」と主張しているので
モナドを取り込んだHaskellもメタパラダイムと考えたのでしょう。
モナドが様々なパラダイムを実現できると主張する事と
有用でないパラダイムをディスる事は別に矛盾してないのでは?

215:デフォルトの名無しさん
12/01/15 12:31:26.23
民主党が惨敗した参院選直前の政党支持率(2010年7月11日投票)

FNN 2010年7月4日
民主党 29.9% 自民党 16.3%
URLリンク(sankei.jp.msn.com)
URLリンク(www.fnn-news.com)

マスコミに、ダマされるなよ。



216:デフォルトの名無しさん
12/01/15 14:30:28.52
VIPからきました
何から始めるんでしょうか

217:デフォルトの名無しさん
12/01/15 14:44:29.28
テンプレ読むところからだろ。

218:デフォルトの名無しさん
12/01/15 14:45:25.41
そりゃもっともで
読んできます


219:デフォルトの名無しさん
12/01/15 14:51:53.71
なんでvipから来た奴ってわざわざ名乗るんだろうな

220:デフォルトの名無しさん
12/01/15 14:54:38.77
>>219
vipperだから

221:デフォルトの名無しさん
12/01/15 16:57:17.93
>>214
有用でないという証明がまるでできてないのに?
根拠らしきものは、難しくて理解できない、って発言ぐらいだけど…

222:デフォルトの名無しさん
12/01/15 17:00:31.21
それ以前に逐次実行モデルっぽいことができるだけでメタパラダイムとかw
その理屈だとチューリング完全な言語はみなメタパラダイムになるぞww

223:デフォルトの名無しさん
12/01/15 17:30:52.32
「モナドは値レベルでメタプログラミングをするための手段」
っていうのは適切な表現だと思うけどなぁ
継続や動的スコープが欲しくなったら処理系に手を入れずともモナドで実現できるわけだし
モナド変換子でそれらを組み合わせることもできる

224:デフォルトの名無しさん
12/01/15 17:54:23.52
>>221
他パラダイムが有用でないという判断がでたらめでも
「Haskellはメタパラダイム」は別に矛盾しません。

>>222
「メタパラダイム言語」の次は「逐次実行モデルっぽいことができるだけで」ですか。
ソースを示さずに捏造を繰り返している事を自覚してください。

tanakhがモナドで逐次実行モデル以外も実装できると主張しているソース
URLリンク(tanakh.jp)
>モナドから見た命令型
>計算コンテクストの1つに過ぎない
>その他:
> ・論理型
> ・オブジェクト指向
> ・アスペクト, etc…
>これらはモナドのコンテクストとして実装できる

225:デフォルトの名無しさん
12/01/15 18:53:37.75
チューリング完全な言語なら
どんなパラダイムだって実装できる

226:デフォルトの名無しさん
12/01/15 20:41:23.81
>>225
モナドを使えば後付けのパラダイムを言語に取りこめるという話でしょう。
Lispのマクロでもできますが、チューリング完全だけでは無理です。

227:デフォルトの名無しさん
12/01/15 21:05:04.33
パラダイムを言語に取り込めるとやらの定義は?
つーかモナドなんて手続き型言語でも簡単に実装できるが、Haskellを特別視する理由は?
まさかdo構文(ただの構文糖)の有無を特別視してるのか?

228:デフォルトの名無しさん
12/01/15 21:26:47.75
bindはクロージャが無いと無理だし、静的型付けの言語でreturnを多相にするなら型クラスが居るよね

229:デフォルトの名無しさん
12/01/15 21:34:13.26
俺は >>226 ではないが、言いたいことはわからんでもない。
要は抽象化の問題だろ。
手続型がどうとか言う話じゃない。

あるパラダイムをモナドの中に押し込めて隠すことが出来るという意味で「取りこめる」と言ってるんだと思う。
LISP もマクロで覆ってしまえばプログラマはそのライブラリを愚直に使うだけのこと。

抽象度がイマイチな言語でも、もちろん様々なパラダイムに基いたプログラムは書けるけれど、
それはプログラマが意識しながらプログラムを書くということであって、
言語の中に (ライブラリ等として) パラダイムを取込むとは言えないと思う。

ってことだと理解した。

230:デフォルトの名無しさん
12/01/15 22:08:51.73
モナドは全部同じだろ。
具体的なインスタンスを比較しない限り同じに見えるはずだ。それが抽象化だ。
異なるパラダイムを取り込めるのではなく、なぜか同じだから取り込める。

231:デフォルトの名無しさん
12/01/15 22:15:50.51
>>228
静的型付けの言語では、型クラスがないとreturnを多相にできないの?

232:デフォルトの名無しさん
12/01/15 22:24:00.26
暗黙の引数を明示的に与えるようにすれば多相にできるよ
でもそれは、Cでも構造体と関数ポインタ使えばOOPできるよ、というのと同じような話なわけ
モナドをヘビーに使い込むようなスタイルのプログラミングをするなら、Haskellを特別視する理由になるよね

233:デフォルトの名無しさん
12/01/15 22:30:19.48
>>232
型クラスが存在しない静的型付き言語において、
暗黙の引数を明示的に与えるようにする以外の方法では、returnを多相にできないの?

234:デフォルトの名無しさん
12/01/15 22:30:46.35
抽象化をしたいなら特別視なんてやめたほうがいいと思う

235:デフォルトの名無しさん
12/01/15 22:35:55.76
>>233
できないんじゃない?
戻り値の型の情報はどこからとってくるの?

236:デフォルトの名無しさん
12/01/15 22:47:24.22
型というか、型によって選択された実装をどこからとってくるか、だった。ごめんね
多相というのは、つまりoverloading(アドホック多相)のことね

237:デフォルトの名無しさん
12/01/15 22:54:06.87
つまりad-hoc polymorphismを実現する手段として型クラスは必要条件ではないと思った
型クラスはad-hoc polymorphismと型推論を両立するためにless ad-hocにする手段で
型推論を捨てるなりすれば型クラスはなくても多相はできるでしょうと

238:デフォルトの名無しさん
12/01/15 23:29:31.36
モナドであることの利点と型クラスの利点を切り分けられていない人が多い。
モナド則の有難味を感じるのはIOくらい。

239:デフォルトの名無しさん
12/01/15 23:54:42.51
民主党には朝鮮人など外国人のなりすまし、スパイが約90名在籍している
野田内閣は過半数が帰化人

野田はどうだろうか
韓国人から賄賂を貰い、韓国人の集いに出席している野田は

首になった蓮○はシャブで逮捕歴のある人間と仲が良いな。蓮○自身はやってんの?
い-6-1
テレビが言えない民主党のスポンサー=韓国北朝鮮
あとはもうわかるよな



240:デフォルトの名無しさん
12/01/16 07:38:13.19
wxHaskell でバイト配列のポインタ (Ptr Word8) から Image 型を作る方法はありませんか

241:デフォルトの名無しさん
12/01/16 07:41:22.96
>>240
すいません、解決しました

Graphics.UI.WXCore.Image や Graphics.UI.WXCore.Draw 辺りばかり見ていましたが、
Graphics.UI.WXCore.WxcClassesAL に望むものがありました

242:デフォルトの名無しさん
12/01/16 08:39:44.77
>>232
> Cでも構造体と関数ポインタ使えばOOPできるよ、というのと同じような話なわけ

Haskellでもモナドと型クラス使えばOOPできるよ、というのと同じような話なわけだね
OOPを簡潔に書けないからね

243:デフォルトの名無しさん
12/01/16 08:43:19.87
OOPと同じ手段は使えないけどOOPで実現したいことは簡潔に書ける(ドヤ

244:デフォルトの名無しさん
12/01/16 09:33:47.83
>>242
今、他の言語がtype classみたいな機能を導入検討中ですぜ?

245:デフォルトの名無しさん
12/01/16 12:01:33.44
>>232
>モナドをヘビーに使い込むようなスタイルのプログラミングをするなら、Haskellを特別視する理由になるよね
「モナド」と「Haskell」を他の組み合わせにすればどんな言語についても言えることだろ。モナド(Haskell)を特別視する理由に全くなってない

246:デフォルトの名無しさん
12/01/16 12:39:05.61
>>232
IOモナドをヘビーに使い込むようなスタイルのプログラミングをするなら、正格評価をする言語を特別視する理由になるよね

こういうことですか?

247:デフォルトの名無しさん
12/01/16 17:11:15.74
多相=アドホック多相だと思ってるハスケル脳は
多相=サブタイプ多相だと思ってるOO脳と同類だな

248:デフォルトの名無しさん
12/01/16 17:29:56.98
Haskellはadhoc多相だけではないので念の為。

249:デフォルトの名無しさん
12/01/16 19:02:10.12
手続き型言語でも簡単に実装できるが、Haskellを特別視する理由、に対する返答なんだからそれはおかしいんでは
モナドの利点は>>223 >>224 >>226など(>>226はモナドというより、後付けでインスタンスを追加できる型クラスの利点?)

250:デフォルトの名無しさん
12/01/16 19:08:13.39
モナドなんか使わなくたって処理系実装すればいいだろ
他パラダイムを実装する枠組みがモナドである必然性はゼロ。
参照透明である必然性もゼロ。型クラスを使う必然性もゼロ。

251:デフォルトの名無しさん
12/01/16 19:12:22.89
材木を見たら釘を打ちたくなる症候群のハスケル厨が
モナドを使って他パラダイムのエミュレートができると気付いただけ

他パラダイムのエミュレートにモナドが不可欠ではないし
モナドが他パラダイムにベストな解法であるわけでもない
単に、モナドで表現すること「も」できるね、ということでしかない



252:デフォルトの名無しさん
12/01/16 22:44:00.17
where や let 内で定義する関数には INLINE プラグマは付けられない?

253:デフォルトの名無しさん
12/01/16 23:07:15.68
モナドは表示的意味論の種々の技法から抽出されたものだから、
計算に本質的なことはモナド的な見方が出来てしまうのですよ。
圏論バカ的な意味合いで。整理するための優れた枠組みなわけです。

254:デフォルトの名無しさん
12/01/17 00:24:32.62
>>253
お前は形容詞バカだ
本質的な、モナド的な、優れたアレがあると言うが名詞が出てこない

255:デフォルトの名無しさん
12/01/17 00:24:57.94
何の説明にもなってないな

256:デフォルトの名無しさん
12/01/17 00:37:55.98
プラグマを処理するときにモジュールレベルよか下のスコープ見てくれるとは到底思えない

257:デフォルトの名無しさん
12/01/17 07:24:50.58
>>256
モジュールレベルというのはどこまでの範囲でしょうか?

{-# LANGUAGE *** #-}
module Homu where

ここまでですか?

それとも、トップレベルの関数定義に対するプラグマも含まれますか?

258:デフォルトの名無しさん
12/01/17 12:27:54.23
モナドは数学に基づくからその辺の言語とは格が違う
1+1=2が否定できないのと同じこと

259:デフォルトの名無しさん
12/01/17 12:38:09.99
唯一のコンストラクタを持つ型の直和が二つのコンストラクタを持つ型と同型であることと同じかなるほどなるほど

260:デフォルトの名無しさん
12/01/17 16:14:17.74
数学に基かないプログラム構成要素なんて存在する?

261:デフォルトの名無しさん
12/01/17 17:08:53.02
孤高なるや否や

262:デフォルトの名無しさん
12/01/17 17:34:33.19
彼にとっては圏論のみが数学なのだろう。

263:デフォルトの名無しさん
12/01/17 17:36:00.52
モナドは圏論に基づくからその辺の言語とは格が違う
f.(g.h)=(f.g).hが否定できないのと同じこと

264:デフォルトの名無しさん
12/01/17 17:42:57.57
で、モナドって言語なの?

265:デフォルトの名無しさん
12/01/17 17:47:59.53
哲学用語

266:デフォルトの名無しさん
12/01/17 18:37:01.81
>>252
付けられるよ

267:デフォルトの名無しさん
12/01/17 19:06:57.29
>>266
初め付けられなかったから訊いたみたんだが、
今再挑戦したらあっさりできた

どうもレイアウトルールに従ってなかったみたいだ
where {-# INLINE f #-} f x = ・・・
なんてのはできないのね

where
 {-# INLINE f #-}
 f x = ・・・
これならできた
ちょっと不格好になるが仕方がない

助かった、ありがと


268:デフォルトの名無しさん
12/01/19 01:16:44.99



 東京にある6つのキー局の内、製作から財務まで一貫して朝鮮人が行ってるテレビ局が1つ
 中国共産党から毎年大量の反日工作費が流れているテレビ局が2つ
 もろに北朝鮮と繋がっているテレビ局が1つ  
年寄はまだまだテレビという外国人に騙され続ける


269:デフォルトの名無しさん
12/01/19 22:41:54.05
Float型やDouble型などの、負方向の最大値(無限大ではない)や、
最もゼロに近い正の数などを得る方法は何かないでしょうか

270:デフォルトの名無しさん
12/01/19 23:40:17.17
>>269
Hugs> 1/0::Float
inf
Hugs> -1/0::Float
-inf
Hugs> 1/(1/0)::Float
0.0
Hugs> -1/(1/0)::Float
-0.0


271:デフォルトの名無しさん
12/01/19 23:44:42.25
import Numeric.IEEE
-maxFinite
succIEEE 0

272:デフォルトの名無しさん
12/01/19 23:45:01.08
>>270

>>269 でも言いましたが、無限大ではないです
「計算が可能な」負方向の最大値、正方向の最大値です

あと、最もゼロに近い正の数です

273:デフォルトの名無しさん
12/01/19 23:51:23.95
クラッシュするんじゃ

274:デフォルトの名無しさん
12/01/20 00:02:03.11
>>271
ieee754 パッケージを使うのでしょうか

インストールして、ghci 上で使ってみましたが、
m というモジュールが見つからないというエラーが発生します

今までの経験から察するに、MinGW 用の libm.dll という
dll が必要ではないかと思いますが、合ってますか?

URLリンク(gnuwin32.sourceforge.net)
ここから辿れるページで探しているのですが、なかなか見つかりません

今日はもう遅いので後日探してみます

275:デフォルトの名無しさん
12/01/20 00:10:16.65
>>271
ごめんなさい、環境を書き忘れていました

Windows7
GHC 7.2.2

276:デフォルトの名無しさん
12/01/20 16:12:27.09
「ふつうのHaskellプログラミング」ってどうですか?評判がいいですが、結構古いので
ほかのにしようかまよってます。

277:デフォルトの名無しさん
12/01/20 16:58:44.68
>>276
一度手続き型言語を修得した人向けで、読後、読み返しにくい

と言うか、今はプログラミングHaskell一択だろう


278:デフォルトの名無しさん
12/01/20 17:00:08.41
ちょっとでも英語読めるならlearn you(ryが初心者向けとしてはベスト

279:デフォルトの名無しさん
12/01/20 17:17:06.71
マセマティカのように
log 6 - log 2 を 誤差なしにlog 3 ときっちり答えてくれるようなライブラリありませんか?

280:デフォルトの名無しさん
12/01/20 19:56:42.13
>>279
logfloat パッケージというものがあるみたいだ

使ったことがないから(インストールする気もない)分からんが、
LogFloat というデータ型で log x を表現するっぽいから、
もしかしたら LogFloat 6 - LogFloat 2 = LogFloat 3 となるかも知れん

281:デフォルトの名無しさん
12/01/20 19:59:20.97
>>280
すまん、紛らわしい間違いをしたな

もしかしたら、logFloat 6 - logFloat 2 == logFloat 3 となるかも知れん

282:デフォルトの名無しさん
12/01/21 01:24:19.13
Learn You a Haskell はもうすぐ翻訳版が出るんだっけ?
まあ英語ならただで読めるんだけど

283:デフォルトの名無しさん
12/01/21 06:03:22.00
>>276
「ふつうの」は、実際に役に立つプログラムを書きながら Haskell を学ぶという
立場で、その方針はよいと思う。誤植も少ない。古いことは気にしなくていいと
思う。

ただし文法の説明はかなりはしょってあるし、網羅的でもない。モナドの説明は
(まちがってはいないが)ごく簡単で、あれじゃわからないだろうと思う。

Wiki の作りかたの話は、省略した部分が多すぎて、本を読んだだけではさっぱり
わからなかった。


284:デフォルトの名無しさん
12/01/21 09:54:12.35
Haskellerがtailコマンドを実装すると
ファイルを全部読み込むクソコードを書くと
教えてくれる良書 > ふつける

285:デフォルトの名無しさん
12/01/21 13:53:02.40
【プログラミング部】 PHPが100倍速で動くようになったぞー
スレリンク(poverty板)

286:デフォルトの名無しさん
12/01/22 11:23:48.95
>>284
> ファイルを全部読み込むクソコードを書く

Haskellが綺麗に書けるって言ってるときは
大抵こんなのばかりだな

287:デフォルトの名無しさん
12/01/22 13:46:53.61
数値リテラルの範囲をコンパイル時に指定できるGHC拡張はないでしょうか

たとえば

newtype NumPadKey = NPKey Integer -- 0 から 9 に限定したい

let a = NPKey 8 -- ok
  b = NPKey 21 -- コンパイルエラー

こういう事をしたい場合は、
0 から 9 までの 10 個の数値が入った NumPadKey 型の値を返す
10 個の関数(num0 :: NumKeyPad など)を作るなどするしかないでしょうか

288:デフォルトの名無しさん
12/01/22 14:19:09.91
TemplateHaskellというGHC拡張を使えばできるよ!

289:デフォルトの名無しさん
12/01/22 14:27:24.57
>>286
コード上は全部読み込んでるように見えて、遅延評価で必要な分しか読み込まれないわけですが・・・


290:デフォルトの名無しさん
12/01/22 14:29:48.48
>>289
headはそれでいけるけどtailだと全部読むよ

291:デフォルトの名無しさん
12/01/22 14:36:41.48
>>290
tail も弱頭部正規形の形までにしか評価されないんじゃないのか?

292:デフォルトの名無しさん
12/01/22 15:10:57.18
なるほど>>284は真実だな
>>289>>291は馬鹿すぎwww
クソ遅せえコードまき散らすなよw

293:デフォルトの名無しさん
12/01/22 15:25:22.29
ハッシュテーブルが確率に依存するみたいに
遅延評価も木構造のバランスが取れている確率に依存するんだよな

294:デフォルトの名無しさん
12/01/22 15:45:23.45
>>291
UnixコマンドのtailはHaskellでいうlastみたいなもん

295:デフォルトの名無しさん
12/01/22 15:58:12.71
>>290
take 10 $ tail [1..]

296:デフォルトの名無しさん
12/01/22 16:06:01.08
>>295
tail"コマンド"だって書いてるだろアホか

297:295
12/01/22 16:08:14.13
ほんとだ、ごめん

298:デフォルトの名無しさん
12/01/22 16:37:21.25
>>292
俺(>>291)も完全に Haskell の Data.List.tail 関数の事だと勘違いしてた

馬鹿すぎで申し訳ない

299:デフォルトの名無しさん
12/01/22 16:43:56.55
何が問題になってるのか、よくわからん。

メモリに全部読みこむのは「ふつうのHaskell」が getContents を
使ってるからで、Haskell 自体の問題ではないよね。

速度の問題なら、後ろからシークしていくのでないかぎり、どうせ全部
読むんだから問題ないはず。これも Haskell とは無関係。


300:デフォルトの名無しさん
12/01/22 16:52:34.31
>>299
どうしてシーク禁止なんて前提にするんだい?
そこを笑われているのに、わかってないんだなw

301:デフォルトの名無しさん
12/01/22 16:54:23.14
もうちょっと冷静に議論したまえ

302:デフォルトの名無しさん
12/01/22 16:59:54.18
処理速度や使用メモリ量を気にするなら、
Haskell でも結局のところやることは変わらないような気がする

System.IO.hSeek で後ろから一バイトずつ戻りながら、改行コードで区切ってく

遅延評価がほとんど活かせず、手続きっぽい実装になるが、
これ以外に良い実装方法が思いつかん

303:デフォルトの名無しさん
12/01/22 17:14:45.72
そんなDQN本だったっけと思って自分も見返してみた

p.50より引用
> tailコマンドの作りかたにもいろいろありますが、今回は次のような方針で実装しました。
> 1. 行のリストを逆順にする
> 2. 先頭からn行を取る
> 3. 取った部分リストをまた逆順にする

実際のコード、同ページのリスト2.9
> main = do cs <- getContents
> putStr $ lastNLines 10 cs
> lastNLines n cs = unlines $ takeLast n $ lines cs
> takeLast n ss = reverse $ take n $ reverse ss

ここまでに使った関数は putsStr, putStrLn, print, length, take, reverse, lines, unlines
アクションが getContents

入門書の序盤のリスト処理の例題としてはこんなもんじゃないだろうかと思う
ふつける擁護とかしても仕方ないので俺ならこう実装するってのがあれば見てみたい

304:デフォルトの名無しさん
12/01/22 17:17:14.40
コードのインデントが崩れたけど見逃して

305:デフォルトの名無しさん
12/01/22 17:26:38.48
>>303
そうだよね。

おそらく「ふつうの」のネタ元と思われる「Software Tools」(ソフトウェア作法、
Fortran 版)にも tail を作る演習問題があって、解答は書いてないけどランダム
アクセスの話よりずっと前に出てくるので、頭から読むことが期待されていると思う。




306:デフォルトの名無しさん
12/01/22 17:26:50.51
>>290
そりゃ、reverse使ってるからな
Haskellは、アルゴリズムを考えないと本当に遅いし、同じアルゴリズムなら、LLなんて比較にならないくらい早いコードが簡単に書ける
(ただし、ghci/runghcではなく、ghcで実行ファイルになったときに限る)


307:デフォルトの名無しさん
12/01/22 17:34:33.10
>>306
じゃあ tail コマンドを実装するにはどういうアルゴリズムが良いんだろ
という話に若干移りかけている

308:デフォルトの名無しさん
12/01/22 17:41:39.84
>>307
うーむ・・・
自分もアルゴリズムにそんなに詳しくないんだけど、10行と言う縛り固定だったり、何行表示するかコマンド引数で取れるなら、last関数を複数回使ったほうが速そうではある
(EOF見つけるまで関数適用の必要ないと推測)



309:デフォルトの名無しさん
12/01/22 18:18:22.72
こういうのもIterateeがもっと整備されてくれば過去の笑い話になるんだろうな。

310:デフォルトの名無しさん
12/01/22 20:17:33.21
必要な行数だけバッファリングしといて、
EOFきたらバッファを全部出力するのが、
メモリ効率的に有利だろう。O(1)で済むので。
getContentsしたらO(n)になってしまう。
常に「指定した行数 >≒ ファイルの行数」ならどっちも同じだが。

311:デフォルトの名無しさん
12/01/22 20:35:54.39
必要な行に辿りつくまでの計算量はどこへ行ったんだ

312:デフォルトの名無しさん
12/01/22 20:45:16.49
unsafePerformIO使っていいんなら、普通にファイルの後ろから読んでできるな。

使わんかったら無理っぽい。俺には無理。

313:デフォルトの名無しさん
12/01/22 20:46:42.49
空間計算量だよ。

seek可能なら後ろから舐めることもできるが、
泥臭いコードになるからチュートリアル向けのコードじゃないな。

314:デフォルトの名無しさん
12/01/22 20:57:18.53
>>313
ああ、必要なメモリの量もO記法で表すのか。ごめん

315:デフォルトの名無しさん
12/01/22 20:58:16.55
seekが制限されると、他の言語でもパフォーマンス出せないと思うが。



316:デフォルトの名無しさん
12/01/22 21:06:37.77
そんなこといちいち書きこむなよ。

317:デフォルトの名無しさん
12/01/22 21:09:34.27
>>312
君の考えた方法で、unsafePerformIO はどこに使うの?

318:デフォルトの名無しさん
12/01/22 22:32:20.73
unsafePerformIOとかhSeekとか出てるんだから、ちょっと考えれば
わからない?

大したコードじゃないよ。5行くらいで終わる。

319:デフォルトの名無しさん
12/01/22 23:01:59.53
>>310

空間計算量なら

takeLast n xs = diff x (drop n xs) where
 diff xs [] = xs
 diff (x:xs) (y:ys) = diff xs ys

みたいなの使えばgetContents使ってもO(1)で済むよ


320:デフォルトの名無しさん
12/01/22 23:04:16.00
>>318
unsafePerformIO って要らなくない?

321:デフォルトの名無しさん
12/01/22 23:08:59.31
unsafeでなくてはならない意味がわからないんですけど。

322:デフォルトの名無しさん
12/01/22 23:18:32.67
>>320
要らない。さっきようやく気づいた。
まだ、Haskellになれてないもので、、、

でも、Haskellっぽく遅延評価で取り出そうと思うと、
unsafe使わざるをえんね。

まぁ、それを意図してるんだろうけど。

323:デフォルトの名無しさん
12/01/22 23:32:52.07
>>319
モナらないと無理。
getContentsの中身はunsafePerformIOなんで。

324:デフォルトの名無しさん
12/01/23 00:13:13.59
unix の tail コマンドなどを Haskell で実装する場合、
もし hSeek 使って逆から読み取ることをするとなると、
読み込むファイルが utf-8 とかだったらどうするの?

今試しに hSeek で戻りながら hGetChar で1文字ずつ取ろうとしたら、
戻るバイト数が分からんかった

325:デフォルトの名無しさん
12/01/23 00:14:23.33
あ、すまん
バイナリモードで読み取れば良いのか

326:デフォルトの名無しさん
12/01/23 02:32:36.04
>>323

ghc7.0.2で試してみたけど最適化なしでも空間使用量は一定だったよ


327:デフォルトの名無しさん
12/01/23 07:08:50.63
>>323
getContentsの中身ってunsafeInterleaveIOじゃないの?

328:デフォルトの名無しさん
12/01/23 07:31:08.49
iterateeやcondoit使っときなさいって

329:デフォルトの名無しさん
12/01/23 10:13:37.62
tailをHaskellで実装する意義が判らん。
初学者でも出来るような事は、Cみたいな言語で充分じゃないの?

330:デフォルトの名無しさん
12/01/23 10:19:33.95
そういう台詞は実際にコード貼ってから言えよ
負け惜しみにしか見えん

331:デフォルトの名無しさん
12/01/23 11:02:10.67
意外と人多いのね、ここ。

実際に役に立つプログラムにすることを考えると、tail コマンドって
$ bzcat backup.bz2 | tail -10
みたいにパイプで使うことが多いから、結局頭から読む版も作る必要があるよ。

教科書でやるなら、素直に頭から読む版を紹介して、ランダムアクセス版は
練習問題にするのがいいだろうね。

332:デフォルトの名無しさん
12/01/23 11:21:41.80
>>329
HaskellでできることをわざわざCでやる必要がないだろ

333:デフォルトの名無しさん
12/01/23 11:52:08.14
わざわざ泥臭いことをやってはいけないという空気に従うのが逆に面倒だな

334:デフォルトの名無しさん
12/01/23 14:22:10.66
具体化できない奴がやたら抽象化にこだわるみたいな

335:デフォルトの名無しさん
12/01/23 19:22:03.97
>>334
そのできない具体化とやたら拘る抽象化の例を挙げてみて

もしかして具体例もなく、なんとなく抽象的にレスしてるだけとか?

336:デフォルトの名無しさん
12/01/23 20:32:55.92
盛り上がってきたね。

別にプログラムなんて好きなんで作ればいいんじゃない?


337:デフォルトの名無しさん
12/01/23 21:10:58.12
>>335
読解力が爆発してますね
>>333へのレスです

338:デフォルトの名無しさん
12/01/23 21:30:27.63
>>309
イテレーティ解説サイト教えてください!(日本語の)

339:デフォルトの名無しさん
12/01/23 21:30:48.60
>>337
だからさ、お前が「~みたいな」って自分で言ってるじゃん
その抽象的な「みたいな」をもっと具体的に説明してくれよ

じゃないと、それが >>333 の喩えにちゃんとなっているのか、
あるいは >>334 が勝手に喩えていると勘違いしてるだけで、
何も喩えられていないのか、判断に困るだろ

340:デフォルトの名無しさん
12/01/23 21:35:22.98
>>338
「iteratee haskell」で日本語サイトをググってみたか?

たとえば URLリンク(d.hatena.ne.jp)
こんなページがヒットしたんだが



>>337
「具体化できない奴がやたら抽象化にこだわる」事がどういう事か、
自分でもあまりよく分かって(頭の中で整理できて)ないんだろ?
だから、例えばこういう奴とか言って具体例が出てこないんだろ?

341:デフォルトの名無しさん
12/01/23 21:48:59.93
抽象化にこだわってるかどうかは知らんが、
とにかく具体的なコード書く能力が無いのは事実だな
「シーク禁止じゃなければ速いtail書けるんだけど、でも泥臭くなるから……(ぶつぶつ」
とか言いながら実際にはシーク使ったコードは書けない、みたいな

342:デフォルトの名無しさん
12/01/23 21:55:46.74
case of で、あるマッチングと別のマッチングで全く同じ式を計算させたい場合、
どう式を書くのがより合理的なのでしょうか

例えば次のような感じです

data T = A Char | B Bool | C Bool | D Int | E String

f :: T -> Int
f x = case x of
 A d -> g1 d
 B d -> g2 d
 C d -> g2 d
 otherwise -> 0

パターン B b とパターン C d の場合が同じ式になっています

この例の場合、レスの文字数などの関係で g2 d というように関数を適用してますが、
実際は別の関数にするほどでもなく、それでいて短くもないような、
例えば let が2~3行に in が1行程度の式だったりします

2つのパターンの場合に同じ式を計算する事を分かりやすく示したいのですが、
C言語の switch case のフォールスルーみたいには書けないですよね

コピペのミスなどを防ぐには、この例のように関数にまとめて、
それを呼ぶだけの式にするくらいしか手はないでしょうか

343:デフォルトの名無しさん
12/01/23 22:00:11.07
>>339
具体化=泥臭い=hSeekでシコシコ読み込む方法と、すでに出ていることから察するに、
恐らく>>333へ文句言ってると受け取って、こっちの文意が伝わってないのかなと思った
でも>>339では喩えになっているかって言ってるもんな
何かトンデモないこと言ってしまったんだろうか
たしかに>>334は毒づきすぎたから、そこはごめんなさい
議論の邪魔して失礼しました

344:デフォルトの名無しさん
12/01/23 22:13:40.06
誰かhSeek でスマートに実装したtailください

345:デフォルトの名無しさん
12/01/24 07:56:12.73
>>333
言いたいことは分かるが、ある程度は仕方がない

数回経験すれば自然と分かることだが、
Haskellで泥臭くやると、C言語などで泥臭くやる場合以上に
面倒で、スパゲッティで分かりにくくなり、かつメンテが難しくなる

Haskellで泥臭くやるということは、手続き的な、
つまり計算「順序」に過剰に縛られたプログラムを書くということ
順序に縛られているから計算が一本の長い紐になり、
それがソース上の関数群を複雑に縫い止める

C言語などなら、そこから少しずつリファクタリングし、処理単位の小さくし、
縫い合わされた巨大な処理を細かくばらすことは良くある

でもHaskellでは一度複雑に縫い止めた関数群を少しずつばらすのは容易ではない
計算順序を意識しすぎた為にそうなったのであり、その意識を変えなければ無理
考え方そのものを変えた場合、少しずつ修正するよりは全てやり直した方が早い

そうすると、後で全てやり直すくらいなら、初めから意識を変えて、
計算順序に過剰に縛られないように作ることに意識が向くようになる

初心者のうちは「意識を変えなければならない」という事が面倒でたまらないが、
そのうち「わざわざ」泥臭いことをやってはいけないという意識は消えていく
自然と泥臭いことをしなくなる

346:デフォルトの名無しさん
12/01/24 11:09:18.39
>>345
333じゃないけど、それは自分の実感と全然違うな
Haskellで手続き的なコードを書くのは良くやるけど、
Cでやるのに比べて面倒だと思うことはほとんどない
多次元のmutable配列とかがHaskellだと構文的にごちゃごちゃするくらい

リファクタリングについては、なんでそんな結論に至ったのか理解に苦しむ
局所関数定義と高階関数を自在に使える時点でCとは比較にならない

そもそも「計算順序を意識」するのを止めるだけで関数的に綺麗なアルゴリズムが出てくる訳でもない
時間O(1)のtailを実装するには結局seekするしかないんだよ

347:デフォルトの名無しさん
12/01/24 12:11:52.41
だれかHaskellのスパゲティ屋さんのプログラム見せて

348:デフォルトの名無しさん
12/01/24 12:33:17.39
>>347
>>46

349:デフォルトの名無しさん
12/01/24 12:34:10.82
>>346
「計算順序を意識」とは言っていない

「計算順序を意識しすぎる」や「計算順序に過剰に縛られた」と言っている

意識しなければ正しい計算ができない事は承知している

350:349
12/01/24 12:49:06.27
それと

> 時間O(1)のtailを実装するには結局seekするしかないんだよ

分かっている
だから私はtailの時間O(1)の実装には一言も触れていない

>>345 では、わざわざ泥臭いことをやってはいけないという空気になりがちな
私なりの理由を述べた(tailの実装といった具体的な対象ではなく一般論)

やってはいけないとは言いすぎだと思うが、アプリの設計開始時から、
または Haskell によるプログラム開始時から
泥臭いことをやってはいけないというくらいの考えでプログラムした方がいいと思う
少なくとも Haskell では

泥臭い事を考えるのは、そうしなければ目標を達成する術が残っていない場合だけ
本当に最後の最後に考える最終手段くらいのもの

本来はもっと抽象度を高める方向に意識を向けた方が良いと思う
例えば seek で1バイトずつ取得したものを文字と解釈して計算するよりも、
getContentsに任せて「ファイルの内容を計算対象にする」方が抽象度は高い

蛇足かも知れんが、ついでに言えば入門書も抽象度を高める考え方や方法を伝授すべきだと思う

351:デフォルトの名無しさん
12/01/24 14:10:06.15
>>350
お前がそういう意見なのは全然構わん
>>345が「Haskellは泥臭いことをやるのには向かない」と
言っているように読めたので反論しただけ
個人的には泥臭いのを嫌がっていては実用コードは書けないと思っているから

352:デフォルトの名無しさん
12/01/24 15:21:05.01
>>348
TX
クラクラ来た。

353:デフォルトの名無しさん
12/01/24 15:36:49.63
>>350
>本当に最後の最後に考える最終手段くらいのもの

最初でも最後でもどっちでもいいんじゃないの
なぜ順序を決めたがるのか

354:デフォルトの名無しさん
12/01/24 16:01:49.74
>>340
あざっす^^

355:デフォルトの名無しさん
12/01/24 19:15:01.19
>>353
俺は >>350 じゃないので横レスになるが、決める決めないじゃなくて、言語の文化としてより自然なやり方はあると思う。
例えて言うなら、日本語は格助詞があるから語順はある程度自由なはずだが、やっぱり自然な語順はあるだろ。
そんな感じ。

やりたい奴はもちろん最初っから泥臭く書いたってそりゃかまわないが、
たいした理由もないのにあえて泥臭く書くのでは Haskell を使う甲斐が無い。

356:デフォルトの名無しさん
12/01/24 20:34:12.21
つまりムダなIO発生させていい気になってるってことねw
トイならそれでもいいけど実用でそれやったらアホだぞ
どれだけキャッシュの無駄遣いすると思ってんだか

357:デフォルトの名無しさん
12/01/24 20:55:06.07
別に抽象度高めつつ、無駄なキャッシュも減らすようにできると思うんだが、
どっちもどっちだな~。

どっちもあほ。

358:デフォルトの名無しさん
12/01/24 21:08:23.56
>>357
(ふりだしにもどる)
数GBあるログをtailするコードをHaskellで書いてみてくれ

359:デフォルトの名無しさん
12/01/24 21:09:07.58
とりあえず叩き台としてコード書いてみたよ。

tailFile n h = do
 seekable <- hIsSeekable h
 if seekable
  then do
   sz <- hFileSize h
   hSeek h AbsoluteSeek $ max 0 (sz - n)
   hGetContents h
  else do
   takeLast n <$> hGetContents h

takeLast n xs = diff xs (genericDrop n xs) where
 diff xs [] = xs
 diff (_:xs) (_:ys) = diff xs ys


360: [―{}@{}@{}-] デフォルトの名無しさん
12/01/24 22:17:01.53
URLリンク(d.hatena.ne.jp)
性能は出ているらしい
conduit読めないから俺にはいまいち何やってるか分からんが

361:デフォルトの名無しさん
12/01/24 23:33:17.89
批判組早く

362:デフォルトの名無しさん
12/01/24 23:42:03.26
手続き型の言語による実装と抽象度では大差ないか劣るのではないか

363:デフォルトの名無しさん
12/01/24 23:43:15.57
>>359
行数指定できないから0点

364:デフォルトの名無しさん
12/01/24 23:55:11.19
晒した勇気に100点をあげたい。

365:デフォルトの名無しさん
12/01/24 23:58:01.89
間とって50点

366:デフォルトの名無しさん
12/01/25 00:21:24.87
相乗平均なら0

367:デフォルトの名無しさん
12/01/25 01:31:32.52
行数指定時用のコードを書いみたよ。

なんとなく遅延IO使ってみたよ。Iteratee使えるならそっちの方がいいんじゃないかな。

hGetLinesReversed :: Handle -> IO [String]
hGetLinesReversed h = hFileSize h >>= lazyLoop h [] where
 lazyLoop h rest pos = unsafeInterleaveIO $ loop h rest pos
 loop h rest pos
  | pos < 0 = return [rest]
  | otherwise = do
   hSeek h AbsoluteSeek (max (pos-blockSize) 0)
   xs <- replicateM (fromInteger (min blockSize pos)) (hGetChar h)
   let (hd:tl) = lines (xs++rest)
   (reverse tl ++) <$> lazyLoop h hd (pos - blockSize)
 blockSize = 128

368:デフォルトの名無しさん
12/01/25 02:10:21.02
遅延IOとな
結局unsafe使う以外に方法って見つかってないんだよね?

369:デフォルトの名無しさん
12/01/25 04:13:13.51
普通の getContents とかも遅延IOだけど……


370:デフォルトの名無しさん
12/01/25 06:30:19.08
>367
これを使ってO(1)のtailを作れたら神だな。


371:デフォルトの名無しさん
12/01/25 07:24:35.01
>>368>>367 が unsafe 系を使ってる理由を
「処理速度を出す為」だと思ってるんじゃないだろうか

372:デフォルトの名無しさん
12/01/25 07:57:17.27
>>370
普通に書けばファイルサイズに対してO(1)時間になるんじゃね?

373:デフォルトの名無しさん
12/01/25 21:53:21.47
unsafe使わずに書いてみた。
ファイルサイズチェックしてないので、10行無かったり、小さすぎるのは駄目だけどね。

main = do
h <- openFile "test.log" ReadMode
hGetLinesTail h 10 0 >>= putStrLn
hClose h

blockSize = 128
hGetLinesTail h l pos = do
xs <- hGetContentsSeekFromEnd h pos
if l > (length$lines xs) then hGetLinesTail h l (pos + blockSize)
else return xs

hGetContentsSeekFromEnd h pos = do
hSeek h SeekFromEnd (-pos)
replicateM (fromInteger pos) (hGetChar h)



次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch