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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/11/07(火) 21:24:26
haskell.org
http://www.haskell.org/

日本語サイト
http://www.sampou.org/cgi-bin/haskell.cgi
http://shidot.dyndns.org/hs/

過去ログ
関数型プログラミング言語Haskell
Part1 http://pc.2ch.net/tech/kako/996/996131288.html
Part2 http://pc2.2ch.net/test/read.cgi/tech/1013846140/
Part3 http://pc8.2ch.net/test/read.cgi/tech/1076418993/
Part4 http://pc8.2ch.net/test/read.cgi/tech/1140717775/
Part5 http://pc8.2ch.net/test/read.cgi/tech/1149263630/

関連スレは>>2
関連書籍は>>3

・2chの仕様により、行頭の半角スペースは表示されません。
 コードをインデントしたいときは、代わりに または全角スペースを使うことができます。
0698デフォルトの名無しさん2007/02/13(火) 01:28:02
>>697
うざい
0699デフォルトの名無しさん2007/02/13(火) 01:59:40
>>695=698
気持ちよく書き込んでいたところすまないね。
ここはそういう話をする所じゃないんだよ。
関数名が長いだとか短いだとか、ハンガリアンがどうのこうの、コメントはこうかきましょうだの、
ここの常連はそういう話はとっくに聞き飽きてるの。
07006982007/02/13(火) 02:11:06
>>699
695 ではない.
必要ない書き込みでスレを無駄に消費しているお前がうざいだけ.
これも無駄なレスではあるが.
お前の無駄な書き込みがこのスレから消えてくれることを切に願う.
0701デフォルトの名無しさん2007/02/13(火) 03:22:57
>>700
> これも無駄なレスではあるが.
わかっていて書かずにはいられないとは、リアル厨房か?
どうせ何も本質を理解していないんだろう?
半年ロムってろよ。
0702デフォルトの名無しさん2007/02/13(火) 08:42:38
>>694
2chで「素人は引っ込んでろ」って、馬鹿?
むしろ玄人様が学会にでも行けよ。
0703デフォルトの名無しさん2007/02/13(火) 12:34:09
>>702
興奮してるのと、摩訶不思議な2ch観を持ってるのは十分に伝わってくるけど、
文章全体としては何が言いたいのかさっぱりわからない。
0704デフォルトの名無しさん2007/02/13(火) 13:59:52
>>690
elispもHaskellもよくわからないけど
haskell-indent.el l.319 の :trype を :type にするとエラーは出なくなった
07056932007/02/13(火) 18:44:48
>>699
>関数名が長いだとか短いだとか、ハンガリアンがどうのこうの、コメントはこうかきましょうだの、
俺だってソフトウェア工学の話がしたいわけじゃない。
>>691が言っているような単目的のコードを快適に書き散らすには
関数名の長さは重要だと思っているから、そう書いた。

それから、判り難かったかもしれないが、>>693>>692へのレス。
0706デフォルトの名無しさん2007/02/13(火) 23:02:55
副作用を禁止して型とかの制限機構を入れたLispってことでいいのか?

0707デフォルトの名無しさん2007/02/13(火) 23:36:34
関数型プログラミングしか出来ない(出来るが非常に回りくどい)関数型言語は
結局生産性悪いと思うんだけどどうだろ
Lisp系みたいなマルチパラダイム言語が一番使いやすいなぁ
07086982007/02/13(火) 23:48:28
それを言っちゃあお終いよ
0709デフォルトの名無しさん2007/02/13(火) 23:50:42
>>707
今の段階ではね。
でも、まだ研究が煮詰まってないから何とも言えないな。
0710デフォルトの名無しさん2007/02/13(火) 23:50:43
ど素人が質問するけど、
Haskellでなんちゃらエンジンみたいなの作る場合、
他の言語と比べてけっこういいもんができるそう?
0711デフォルトの名無しさん2007/02/13(火) 23:53:28
Haskellでなんちゃらエンジンを作れる人が他の言語でなんちゃらエンジンを作ると良いものができるんじゃない?
0712デフォルトの名無しさん2007/02/14(水) 00:05:22
言語が違ったぐらいで出来栄えがそんなに変わるかなあ。
とか。
むろんケースバイケースだけども。
0713デフォルトの名無しさん2007/02/14(水) 00:18:33
>>707
Haskellみたいに関数型と手続き型が普通に使えれば十分だと思ってしまうんだが、
そうでもないものなの?
0714デフォルトの名無しさん2007/02/14(水) 01:40:35
普通には使えないと思う
0715デフォルトの名無しさん2007/02/14(水) 02:03:12
ひさしぶりにHaskellをGHCでやってみた
なんでこんなにコンパイル遅いの?
だれのせい?
頭のいい奴がつくってこの出来?
0716デフォルトの名無しさん2007/02/14(水) 02:47:05
>>715
Cコンパイラと比べてないか?
言語仕様がどれだけ複雑か考えただけでも遅くなるのは当然だろ
0717デフォルトの名無しさん2007/02/14(水) 02:56:37
なんで当然なのか教えてくれ
0718デフォルトの名無しさん2007/02/14(水) 03:10:02
直感
0719デフォルトの名無しさん2007/02/14(水) 03:28:07
>>717
言語仕様が複雑だからだろ。
0720デフォルトの名無しさん2007/02/14(水) 03:52:54
無限リストって怖くね?
0721デフォルトの名無しさん2007/02/14(水) 03:57:33
OCamlと比べてもコンパイルが遅いのは遅延評価とかモナドとか型クラスとかのせいですか?
0722デフォルトの名無しさん2007/02/14(水) 06:16:39
コンパイルの遅さよりもバイナリのでかさの方が問題だ
0723デフォルトの名無しさん2007/02/14(水) 06:24:24
D は言語仕様複雑だけど速い。
要は、

・ 言語仕様が高速なコンパイルに向いているかどうか
・ 最適化をどのくらいやっているか
・ コンパイラのコードが洗練されているか

とかの問題。
0724デフォルトの名無しさん2007/02/14(水) 09:45:34
>・ 最適化をどのくらいやっているか
>・ コンパイラのコードが洗練されているか

はともかく

> ・ 言語仕様が高速なコンパイルに向いているかどうか

は、高速なコンパイルができる→機械語との対応が簡単→言語仕様が簡単、
って言わないのかな‥‥

0725デフォルトの名無しさん2007/02/14(水) 10:34:11
人間にとっての容易な仕様と、コンパイラにとっての容易な仕様は別物、
ってことじゃないかなぁ。

Dの場合、「コンパイラ実装に優しい言語仕様」というのをはっきり掲げてるわけだけど、
それは通常の会話に出てくる「シンプルな言語仕様」というのとは、指しているものが
だいぶ異なっているような気がする・・・。
0726デフォルトの名無しさん2007/02/14(水) 11:27:04
まあコンパイルなんてふつうは遅いものじゃん。
スクリプト言語みたいに実行できるDが異常
0727デフォルトの名無しさん2007/02/14(水) 21:24:06

おい、カスども聞いてくれ
ようやくまともにHelloWorldが書けるようになった高卒の俺が
圏論勉強してみっかーと思ってWikipedia読んでみたんだ
http://ja.wikipedia.org/wiki/%E5%9C%8F%E8%AB%96

アホだろこの説明はw
翻訳がおかしいというか、書いてる奴が説明する気ゼロなんだよ

そもそも「圏論」とか書くから難しそうなんだ
「カテゴリー論」にすれば、すっげー簡単そうなイメージになるのに

あと「圏」のページでは「定義域」、「余定義域」とかいう意味不明な用語がでてくるが、
「射」のページでは「ドメイン」、「コドメイン」と翻訳してある
用語を統一してないのはWikipediaの特性上しょうがないけど、
ドメインって訳したほうが100倍イメージしやすいよな

円周率を3とするよりも、3.14として難しくしたほうが、学習上、良いのはわかる
けど、圏論の説明はあまりにもひどすぎる
頭が悪いとしか思えない

ということで、AAで圏論 Coming soon!
0728デフォルトの名無しさん2007/02/14(水) 21:59:17
数学の専門用語の和訳には数学の文化があって、
「カテゴリー」みたいな一般的な用語であっても、
専門用語と分かるように難しい言葉を当てることが多い。

一方、情報化学では、カタカナのまま使うことが多いので、
その辺、語感に温度差があるように思える。
"Categories for Working Programmers" みたいなのが
あると、なかなか楽しい気はする。


> AAで圏論 Coming soon!
期待してるぜ!
0729デフォルトの名無しさん2007/02/14(水) 22:11:11
> AAで圏論 Coming soon!
wktk!!
0730デフォルトの名無しさん2007/02/14(水) 22:12:33
数学用語ってかっこいいよな
0731デフォルトの名無しさん2007/02/14(水) 22:45:54
VIPPERの俺様がWEBに転がっている情報処理の2006年3月号で
圏論を勉強してやっているのだが、定義4までは理解できるが、
肝心のモナドが出てくる定義5と6が意味不明だ。

天才エスパーが3行で解説してプラトンのイデア界のモナドに俺を接触させろ!おねがい (ぅふ
0732デフォルトの名無しさん2007/02/14(水) 22:54:40
まずはその定義をここに書くんだ
0733デフォルトの名無しさん2007/02/14(水) 23:09:56
>>732
ttp://www.ipsj.or.jp/07editj/promenade/4703.pdf

浪人の先生 これでございあす。
前半は糞クイズでございやすが、後半がモナド入門でやす。

4と5の間には越えられない壁がw

おねがいするお!
0734デフォルトの名無しさん2007/02/14(水) 23:44:33
>"Categories for Working Programmers" みたいなのが

The Haskell Programmer's Guide to the IO Monad ― Don't Panic
http://stefan-klinger.de/files/monadGuide.pdf
こんなの?
0735デフォルトの名無しさん2007/02/15(木) 00:11:39
>>733
3行で説明するのは俺には無理.

まず定義5.これは実際に手を動かすと見えてくるので,
具体例でやるのが良いと思う.以下はその pdf にもある例.

1. リスト函手
・型 A に対し T A は A のリストを作る:
  T A = [A]
・関数 f :: A -> B に対し T f :: [A] -> [B] は次の関数を作る:
  T f = map f
・μ_X は X 型のリストのリストをならして X 型のリストを作る:
  μ_X = concat
・η_X は X 型の値 x からそれだけからなる [X} 型のリスト [x] を作る:
  η_X = singleton = (:[])

これらを図に代入して,ちゃんと可換になることを確認するよろし.
0736デフォルトの名無しさん2007/02/15(木) 00:18:09
こっちも同様に確認するとμ,ηの雰囲気がより分かるかも.

2. Maybe函手
・型 A に対し T A は Maybe A を作る:
  T A = Maybe A = Just A | Nothing
・関数 f :: A -> B に対し T f :: Maybe A -> Maybe B は
  (T f) (Just a) = Just (f a)
  (T f) Nothing = Nothing
・μ_X は Maybe (Maybe X) を Maybe X にする:
  μ_X (Just (Just x)) = Just x
  μ_X (Just Nothing) = Nothing
  μ_X Nothing = Nothing
・η_X は X の値 x を (Just x) にする:
  η_X x = Just x
0737デフォルトの名無しさん2007/02/15(木) 00:49:19
やっと分かった!
drop 5もreverseもnullも自然変換で、
map succやallは自然変換でないと。
前者は構造のみを扱い、後者は要素が絡んでいることを反映しているのか。

これ考えた奴は天才だな。
0738デフォルトの名無しさん2007/02/15(木) 00:50:21
次に定義6.こっちも具体例が条件を満たすことを確認すると見える.

1. リスト函手.これはありがたみが分かりづらい.
・f* = flatten . map f

2. Maybe函手.
・f* = Just . f

Maybe がこれでハッピーなのは,次の具体例を考えると分かる:
「バッグからアドレス帳を取り出し,
 今日誕生日の人を探し,携帯電話を取得する」
これを関数合成で次のように書けるとうれしい:
 getPhone . findBornToday . getAddressbook
ただ,各関数の自然な型は
 getAddressbook :: Bag -> Maybe Addressboo(もってないかも)
 findBornToday :: Addressbook -> Maybe Person(いないかも)
 getPhone :: Person -> Maybe Phone(もってないかも)
なので合成ができない.そこで,* を使って
 getPhone* . findBornToday* . getAddressbook
と書いてやると型があってハッピー.Haskell ではこれを
 getPhone <<= findBornToday <<= getAddressbook
と書けるようになってる.
0739デフォルトの名無しさん2007/02/15(木) 01:06:12
定義5の可換を具体例で示すことはできた。
が、『μが結合則、ηが恒等元の役割をする』というところがピンとこない。
なにとぞ、悟りの光をお与えください。

0740デフォルトの名無しさん2007/02/15(木) 01:29:09
「結合則」という意味:
 左側の図で上側を通る計算はμを中置記法で書き,
 TμT = T と簡約しないでおくと
  T T T A --> (TμT) T A --> (TμT)μT A
 となる.同様に下側を通る計算は
  T T T A --> T (TμT) A --> Tμ(TμT) A
 となる.これが(任意の A について)等しいのだから,雰囲気は
  (TμT)μT = Tμ(TμT)  …代数で言うところの結合則

「恒等元」という意味:
 右側の図で左側の三角形の真ん中を通る計算は
 ηT = T T と簡約しないでおくと
  T A --> ηT A --> ημT A
 右側の三角形の真ん中を通る計算は
  T A --> Tη A --> Tμη A
 これが恒等写像 id_TA に等しいのだから,雰囲気は
  ημT = Tμη = T  …代数で言うところの恒等元,単位元
0741デフォルトの名無しさん2007/02/15(木) 03:45:58
>>740
dクス 結合法則のほうは分かったw  中置記法が味噌かよwww
中置記法で書くと確かに結合側に見えるw
麻呂は前置記法で書いていたので、どう見ても結合法則ではなく可換を意味しているようにしか
見えなかったでおじゃるw


恒等元のほうは、まだ分からんw
ηだけで恒等元??  (ημ)で恒等元? 
でもサ変と右辺でημとμηでひっくり返っているし

もう3行ばかり解説頼むw
0742デフォルトの名無しさん2007/02/15(木) 07:50:31
>>741
一般に,二項演算 * に対して e が恒等元であるとは
任意の a に対して e * a = a * e = a を満たすことを言う.
μを中置記法で読めば,最後に出てくる式はこれと同じ.
0743デフォルトの名無しさん2007/02/15(木) 09:20:05
>>740
凄い! なんかわかった気になる。
そうか、μをfunctor間の演算とみなせばよかったのか。

ところで>738の例で
Maybe functorがf* = Just . f
とあるけど、これでfindBornToday*が
Addressbook -> Maybe Person
から
Maybe Addressbook -> Maybe Person
になるんだろうか?
fをもちあげないといけない気がするんだが…
0744デフォルトの名無しさん2007/02/15(木) 10:25:48
>>743
そのとおりで,こちらのミス.手抜きをしたのがいけなかった.以下が正しい.

f* (Just x) = Just (f x)
f* Nothing = Nothing
0745デフォルトの名無しさん2007/02/15(木) 10:35:57
ああまたミス.f* (Just x) = f x,f* Nothing = Nothing.起きたばかりだけど寝てくる.
0746デフォルトの名無しさん2007/02/15(木) 18:09:27
lispとどっち勉強するか迷ってます
lispよりも強力なのがhaskellってことでいいのでしょうか?
強力というのは最小限の手間で複雑な処理がかけるという意味で


0747デフォルトの名無しさん2007/02/15(木) 18:40:24
>>746
迷ったなら両方やっとけば。
Lispは風呂敷。なんでもリストでつつんでしまう。良く言えば柔軟。悪くいえば節操がない。
Haskellはディナー用食器セット。テーブルマナーがわかっていれば心地良い。
0748デフォルトの名無しさん2007/02/15(木) 18:56:11
>>747
>Haskellはディナー用食器セット。テーブルマナーがわかっていれば心地良い。
でも調理は自分で、でも何故かアレルギー反応する人がいるのがおもしろい。

0749デフォルトの名無しさん2007/02/15(木) 19:59:31
昨日は詳しい人がいたのね。

HaskellのMonadって、実はKleisliの方が近いんじゃないか、と思うんだけど、
何でMonadと呼ばれているんだろう?

(T,η, *)と(M, return, flip (>>=))が対応してるのに対して、(T, η, μ)とは
間接的にしか対応してないのに。Monadなんて使わなければ関連する定義
も1つ減って幸せな気がする。
0750デフォルトの名無しさん2007/02/15(木) 22:08:19
対象→例えば数字だったり、式だったり、式+式だったり
群  →対象の集まり
圏  →対象と射の集まり

これで認識あってる?
0751デフォルトの名無しさん2007/02/15(木) 22:21:00
モナドは函手の間の演算だってそういうことですか・・・。
0752デフォルトの名無しさん2007/02/15(木) 22:30:13
>>750
数学の用語としてだったら、群は間違ってる。
群は、可逆な演算の定義された集合の事(厳密な言い方でないけど)。
例えば、整数の集合に足し算と引き算を定義すれば、群である。
圏は一応あってると言っていいと思う。
0753デフォルトの名無しさん2007/02/15(木) 22:33:50
可逆という言葉がわからん
集合という言葉の定義がわからん
0754デフォルトの名無しさん2007/02/15(木) 22:39:02
群はモノイドでかつ任意の元に対して逆元が存在するもの。
0755デフォルトの名無しさん2007/02/15(木) 22:40:22
http://ja.wikipedia.org/wiki/%E5%85%AC%E7%90%86%E7%9A%84%E9%9B%86%E5%90%88%E8%AB%96
0756デフォルトの名無しさん2007/02/15(木) 22:48:49
やっぱりボチボチと圏論わかってきてるひと増えてるんだね。
でも、やっぱりよくわからのだがこれ一体なんの役に立つんだ?
07577502007/02/15(木) 22:50:04
たぶん、オブジェクト指向のようなものだと思うんだが
0758デフォルトの名無しさん2007/02/15(木) 22:55:56
>>749
一般にプログラミング上の専門用語は、
「寓意的・即物的」であることが好まれるからだろう。

"Kleisli" なんていう、
どう読めばよいのかも分からない人名をつけるよりも、 
"Monad" なんて単語のほうがずっとイメージしやすいしね。

この特徴は、プログラミングが「科学」ではなく、
まさに「工学」であることの証拠のように思える。

ていうか、ここら辺はむしろ「科学」のほうが異常なんだと思う。
発見者(又は、偉大な業績を残した先人達)の学問上の
功績を称えるために、発見したものに対して
その人の名前を冠する、という悪しき慣習のために、
新しい概念に対して本当にふさわしい名前をつけることが
出来てないんだよ。
07597562007/02/15(木) 22:56:08
>たぶん、オブジェクト指向のようなものだと思うんだが

なるほど。
でも、だとしたらコストが高すぎる。一体どれだけ時間かかるんだ。

ていうか、いい加減コーディングスタイル確立してくれ。
というわけで偉い人がんばってくれ。
0760デフォルトの名無しさん2007/02/15(木) 23:01:46
>>758
Haskell改名要求キター
0761デフォルトの名無しさん2007/02/15(木) 23:02:08
>>755

data Set
  = Empty
  | Pair Set Set
  | Union Set
  | Infinity
  | Replacement Fun Set
  | Power Set

こんな感じ?
0762デフォルトの名無しさん2007/02/15(木) 23:06:59
>>759
確かにHaskellって名前あんまり良くないかも。
0763デフォルトの名無しさん2007/02/15(木) 23:09:07
>>760
"Haskell" 自体は「専門用語」ではないから桶。
あれは「固有名詞」であって、云わば商品名のようなもの。
どんな名前をつけようが関係ない。
0764デフォルトの名無しさん2007/02/15(木) 23:12:46
>749 >758

そっか、HaskellのMonadと圏論のMonadは別物だったのか…ちょっと驚き
0765デフォルトの名無しさん2007/02/15(木) 23:12:48
で、結局 Kleisli って、どう読むの?
0766デフォルトの名無しさん2007/02/15(木) 23:39:55
クライスリーだそうです。
0767デフォルトの名無しさん2007/02/15(木) 23:40:59
>>742
dクス!! 定義5までは理解した気がするぉ!(^ω^)v 


(T μ η) が (対象 演算子 単位元)か。 しかし対象 T は T 1個だけか?
実は理解してないか?(^ω^;)?


定義6についてはこれからエロ画像見ながら考えるぉ
0768デフォルトの名無しさん2007/02/15(木) 23:44:10
Tは自己函手だ。
μ、ηは自然変換。
0769デフォルトの名無しさん2007/02/16(金) 00:28:35
>(T μ η) が (対象 演算子 単位元)か。

モノイドとしてみた場合の話だぉ。
0770デフォルトの名無しさん2007/02/16(金) 01:03:24
>モノイドとしてみた場合の話だぉ。

モノイドとしてみるならTは集合としてみるべき。
0771デフォルトの名無しさん2007/02/16(金) 01:46:57
>>756
すごく大雑把に言うと,チューリングマシンや
λ計算などがあったところに,新しい定式化として
圏論に基づくものが現れたという背景がある.

現在,普通のプログラマはチューリングマシンや
λ計算を知らなくても特に問題は起きないけれど,
それと同じようなものだと考えるのが順当だと思う.
(もちろん知ってたほうが良いのは確かだけど,
 とりあえず大雑把なところを抑えておけば十分.)

ラーニングコストが高いのは,まだ新しい理論である
ということと,従来の手法よりも数学的に取り扱いやすい
枠組みとして導入されたことがあるので,教育用に
整理されてない現段階では,好きな人がやるものだと
思ったほうがよいと,個人的には思う.
0772デフォルトの名無しさん2007/02/16(金) 01:56:04
>>764
別物というとちょっと語弊があって,
Kleisli triple と monad は一対一対応するので,
どちらで定義しても「本質的には同じもの」になる.

言い方としては,
 Haskellでは monad は Kleisli tripleで定義される
というのが間違いないと思う.
0773デフォルトの名無しさん2007/02/16(金) 02:06:17
>>771
まだまだ未開拓なのか・・・。

>>772
>Kleisli triple と monad は一対一対応するので,
>どちらで定義しても「本質的には同じもの」になる.

!!ですよね。
0774デフォルトの名無しさん2007/02/16(金) 02:45:29
     ...| ̄ ̄ | < この話はいつ終わるのかね?
   /:::|  ___|       ∧∧    ∧∧
  /::::_|___|_    ( 。_。).  ( 。_。)
  ||:::::::( ・∀・)     /<▽>  /<▽>
  ||::/ <ヽ∞/>\   |::::::;;;;::/  |::::::;;;;::/
  ||::|   <ヽ/>.- |  |:と),__」   |:と),__」
_..||::|   o  o ...|_ξ|:::::::::|    .|::::::::|
\  \__(久)__/_\::::::|    |:::::::|
.||.i\        、__ノフ \|    |:::::::|
.||ヽ .i\ _ __ ____ __ _.\   |::::::|
.|| ゙ヽ i    ハ i ハ i ハ i ハ |  し'_つ
.||   ゙|i〜^~^〜^~^〜^~^〜
0775デフォルトの名無しさん2007/02/16(金) 02:52:32
ほかの面白そうな話が始まったら
0776デフォルトの名無しさん2007/02/16(金) 03:09:00
main = この話 >> main
0777デフォルトの名無しさん2007/02/16(金) 04:22:40
いや、この路線でいこう。

おれは、参加できないが。
0778デフォルトの名無しさん2007/02/16(金) 11:52:48
結局、実際に有用なのはモナドのどの性質なんだ?
射の合成則なのか? 

対象に順番に射が作用しているという点で、結合則を利用しているようには見えないんだが?

ちんぷんかんぷんだぜ
0779デフォルトの名無しさん2007/02/16(金) 13:40:19
python経由でならc++もよべるんですよね?
0780デフォルトの名無しさん2007/02/16(金) 15:02:44
ごめん,だいぶ長文になった.うざかったらスルーしてくれ.

>>778
「射の合成則」は monad ではなく圏の性質なので
これを落とすと圏論で議論ができなくてうれしくない.

Monad を Kleisli triple (T,η,*) で定義したとき,
どれが利いているのかと言うと「全部そろって意味がある」
という答えになってしまう.

では,どんな意味があるのかというと,標語的に言えば,
「monad は『計算』をモデル化できる構造」
となる.これはもう少し説明すると η, * が実際にどう働くかが
見やすくなるので,せっかくだから Haskell の計算をモデル化してみる.
0781デフォルトの名無しさん2007/02/16(金) 15:09:47
続き.本当は以下の例は正しい Haskell の計算モデルでないし
定義もいくらか怪しいけれど,イメージということで許していただきたく.

>>778
例として
 sqr x = x * x,dup x = 2 * x
という関数を考え,sqr (dup 3) という『計算』を考えてみる.
いわゆる手続き言語ではこの式は
 sqr (dup 3) = sqr 6 = 36
と『計算』を次々と『値』に潰していくので
型は常に整合しているんだけど,Haskell では
 sqr (dup 3) = (dup 3) * (dup 3) = ...
『計算』そのものを『計算』していく.これは sqr の型を
考えるとちょっと奇妙.だけど monad (T,η,*) を
 T:X を「X を返す『計算」にうつす函手
 η:『値』をその値を取り続ける『計算』にする自然変換
 *:『値』を取る『計算』から『計算』をとる『計算』への変換
と定義してやり,sqr (dup 3) が本当は
 sqr* (dup* (η3))
を意味していると思うと,きれいに理解できる.
(この η, * は Kleisli triple の条件を満たしている.
 ほかの計算モデルでも η, * は同じような役割を果たすので
 Kleisli triple の条件が必要なのが理解できる)
0782デフォルトの名無しさん2007/02/16(金) 20:16:29
>781

おお、何だか凄そうな人が!
いくつか質問させてください。

(1)
> T:X を「X を返す『計算」にうつす函手
> η:『値』をその値を取り続ける『計算』にする自然変換
> *:『値』を取る『計算』から『計算』をとる『計算』への変換
という定義から、
> この η, * は Kleisli triple の条件を満たしている.
は必ず言えるのでしょうか? 上の定義は型に関してKleisli tripleの条件を満たす+ηが自然変換
ということだと思うのですが、「ηが自然変換」ということからKleisli tripleの3条件が出てくるのでしょうか?

(2)
Kleisli tripleの3つめの条件
g* o f* = (g* o f)*
の直感的な意味はなんでしょう?

(3)
λ計算はCCCで普通に解釈できるのにsqr x = x * x,dup x = 2 * xになると
Kleisli categoryが必要になるのは、名前があるからでしょうか?
0783デフォルトの名無しさん2007/02/17(土) 01:44:14
>>780-781
Haskellの旦那!ありがとう、かなり理解がすすんだぉ(Vipperなりに)。
>>733の定義6でKleisliトリプレットがモナドを為す事も、そこからKleisliカテゴリをだす事も
示せた(と思う ^ω^;)。


T μ (T μ T) = T μ (T*・T) = T*・(T*・T)
(T μ T)μ T  = (T*・T)μ T  = (T*・T)*・T

こんな感じで射だけを先に色々合成できるので、遅延評価を記述するのに便利
という風に納得したぉw

sqr* (dup* (η3)) = (sqr* ・ dup)* ・ (η3)

こんな風に使える?みたいな?
0784デフォルトの名無しさん2007/02/17(土) 01:50:55
(T μ T)
泣き顔に見える
0785デフォルトの名無しさん2007/02/17(土) 02:07:03
頼むからその記号のそれぞれが何を意味してるのか説明してくれ。
0786デフォルトの名無しさん2007/02/17(土) 03:20:06
この一連の流れ凄いけどいくつか自作自演しているだろ。
レスポンスがおかしい。
0787デフォルトの名無しさん2007/02/17(土) 03:44:06
>>782
(1) 普通の計算の定義を採用すると,きちんと証明できる.
(満たさない計算もあるだろうけれど,直感に反する気がする)
ηが自然変換であることは Kleisli triple の条件に含まれている.

(2) 『計算』の合成が,直感と整合することの保証.
右辺が何を意味してるかを考えると,左辺が出る.

(3) その式くらいなら CCC で解釈できるんだけど,それは本当に
「自然」な解釈なの? ということで Kleisli でやることを
考えたそうな.なお,λ計算を monad で解釈するためには,
Kleisli + CCC + 整合性みたいな構造が必要.
0788デフォルトの名無しさん2007/02/17(土) 08:42:43
ηが自然変換であることも重要なん?
0789デフォルトの名無しさん2007/02/17(土) 09:44:29
要するに、f : A -> T(B)という型の関数の集まりに対して、それが圏を構成するのに必要な
合成演算子とIdの条件を示した、ってことなのかな。
で、圏を構成すると、合成について閉じることと結合法則は保証されるから嬉しい。
まあ嬉しいが、弱い嬉しさだなあ…。
0790デフォルトの名無しさん2007/02/17(土) 10:26:39
>>788
技術的には自然変換でないと monad の有用な性質が
成立しないので困る,ということがある.
概念的には自然変換の自然っぷりに関連するんだけど,
 ηは『値』を『計算』として解釈しなおすだけなんだから,
 それが自然変換にならないわけがない.
というのが自分の持ってるイメージ.
0791デフォルトの名無しさん2007/02/17(土) 10:30:47
> monadの有用な性質
って結合法則?
なんとなく、自然変換にしとくと、添字を省略した等式変形が出来るというイメージが
0792デフォルトの名無しさん2007/02/17(土) 10:55:45
>>791
有用な性質はたくさんあって,例えば結合法則を含む性質
として「monad と代数が一対一対応する」という定理がある.
ほかにもいくつもの定理や普遍性が成立する.

もちろん自然変換自体が扱いやすいのもそうですね.
0793デフォルトの名無しさん2007/02/17(土) 11:12:37
>>785
記号の定義は>>733に引用されているPDFに書いてある。
ジンマシンが出そうな式だが。
0794デフォルトの名無しさん2007/02/17(土) 12:17:53
>>785
意味は存在しない。というより意味をつけてしまうとダメだ。
なんのためにモナドにまで抽象化したんだって話になる。
個々のモナド(Maybe,List)とかに落とせば意味はつけられるからそこを考えたほうがいい。
0795デフォルトの名無しさん2007/02/17(土) 18:02:05
モナドの合成は、Kleisli category上ではどういう操作に対応するの?
0796デフォルトの名無しさん2007/02/17(土) 19:43:20
>>795
函手 F 上の monad と G 上の monad が与えられたとき,
合成函手 F G 上の monad を構成することが合成に相当する.

合成には複数の方法があることも,全く存在しないこともある.
0797デフォルトの名無しさん2007/02/17(土) 20:38:44
ListのKleisli tripleが
(T1, η1, *1) = ([], \x->[x], \f->\xs->map f xs)
MaybeのKleisli tripleが
(T2, η2, *2) = (Maybe, Just, \f->\x->case x of { Just v->f v; _-> Nothing })
とすると
ListとMaybeの合成は
(T3, η3, *3) = (T1 . T2, η1 . η2, *1 . *2)

にはなりそうもないね…
■ このスレッドは過去ログ倉庫に格納されています