トップページ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の仕様により、行頭の半角スペースは表示されません。
 コードをインデントしたいときは、代わりに または全角スペースを使うことができます。
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)

にはなりそうもないね…
0798デフォルトの名無しさん2007/02/17(土) 22:03:30
手続き型に首まで浸かったVipper様が今晩もやってきましたよ。
Kleisli Triplet に関して、手続き型言語へのアナロジー表現で意味を考えてみた。

総本家カテゴリ: 引数:A (値型) 返り値:B(値型) 関数: f:A→B (値型→値型)

元祖カテゴリ: 引数:A (値型) 返り値:TB(参照型) 関数: f:A→TB (値型→参照型)

  ↓ 関手 η:Id → T   (Idは値型を保つ、Tは参照型を意味する。)

分家1カテゴリ Id: 引数:A(値型) 返り値:TB(参照型) 関数: f:A→TB (値型→参照型)

分家2カテゴリ T: 引数:TA(参照型) 返り値:TB(参照型) 関数: f:TA→TB(参照型→参照型)


次に * は、値型引数の関数を参照型引数の関数に変換する演算子とみなす。

f:A→TB、 f*:TA→TB の意味は、同じ関数fの、それぞれ(値型引数A、参照型返り値TB)
バージョンと(参照型引数TA、参照型返り値TB)バージョンに相当する。


Kleisli Triplet が満たすべき3つの性質の、この表現での意味。

・η*_A = Id_A   の意味は、値型引数を参照型にする関手ηの引数の型を、*が参照型にするのだから、
               η*_Aは、参照型の引数TAが、そのままになる恒等変換 Id_A

・f* 。η_A = f   の意味は、値型引数を参照型引数にして、参照型バージョンの関数に
          突っ込んだ結果と、引数が値型のバージョンの関数に突っ込んだ結果が同じになること。

・g* 。f* = (g* 。f)*  の意味は、参照型引数バージョンの関数f*,g*を合成するのと、
               値型引数バージョンfと参照型引数バージョンの関数g*を合成
               した上で、その合成関数の引数を値型から参照型に変えたものは同じ物。
0799デフォルトの名無しさん2007/02/17(土) 22:21:44
この場合のKleisliカテゴリは、

・対象Cは値型変数と参照型変数
・関数 f は値型引数→参照型返り値、関数 f* は f の参照型引数、参照型返り値バージョン
・恒等写像η_A とは、値型変数を参照型変数へ変える関数。
 (ηが関数 f に作用すると、f ⇒ f* の変換をする演算子)
・二つの関数 f と g の合成が、g* 。f になるのは、fが吐くのは参照型の返り値だから
 g は参照型の引数をとる g* バージョンでないと困るから。

となる?

これは、アトムを値型、リストを参照型とみなしたリストモナドと等価かな?(^ω^?
0800デフォルトの名無しさん2007/02/18(日) 11:24:35
monadに依存している時点でHaskellは既に敗北しているよな
0801デフォルトの名無しさん2007/02/18(日) 11:53:02
liskell キタ━━━━━━(゚∀゚)━━━━━━ !!!!!
0802デフォルトの名無しさん2007/02/18(日) 11:56:06
>>800
ネタにマジレスいくないとおもうけど
モナドじゃなかったら何を使えばよかったと思う?
0803デフォルトの名無しさん2007/02/18(日) 12:40:55
>>802
副作用を許す
無駄に副作用をなくすのにこだわりすぎ
0804デフォルトの名無しさん2007/02/18(日) 12:46:15
副作用のある関数とない関数に別の型を与えるかどうか、と言う話で、
結局、どれだけ細かく型を付けるかによるトレードオフだよな。
俺は別扱いするのがコストに見合うと思うが。
0805デフォルトの名無しさん2007/02/18(日) 12:46:57
ピュア言語に汚れろというのはナンセンスだろw
OOPL同様ピュアを反面教師としてハイブリッド型が生まれるのだ。
0806デフォルトの名無しさん2007/02/18(日) 12:51:37
>>805
そういう話じゃない。
藻などを使うのが理想的かどうかってことだろ。
0807デフォルトの名無しさん2007/02/18(日) 12:54:19
手続き型な人には不自然といわれ
関数型な人には関数的じゃないといわれる
IOモナドの何と不憫なことか
0808デフォルトの名無しさん2007/02/18(日) 13:11:09
ギリシャ文字フリーキャンペーン中です
0809デフォルトの名無しさん2007/02/18(日) 13:11:55
ΣをSigmaと書きましょう
0810デフォルトの名無しさん2007/02/18(日) 13:49:10
Concurrent Clean の一意型はどう思われますか?
0811デフォルトの名無しさん2007/02/18(日) 14:21:23
>>808
バルバロイはすっこんでろ!
0812デフォルトの名無しさん2007/02/18(日) 16:17:19
ギリシャ文字ってうざいよね
0813デフォルトの名無しさん2007/02/18(日) 16:53:02
>>806
海草なども使えばいいってことですか?
0814デフォルトの名無しさん2007/02/18(日) 22:07:24
ようやく元の馬鹿スレに戻ってきたなw うれしいぜ
0815デフォルトの名無しさん2007/02/18(日) 22:28:20
もったいぶった馬鹿よりはマシだな
0816デフォルトの名無しさん2007/02/18(日) 23:24:26
このスレは正真正銘のHaskeller達で構成されているわけではなくて、
Haskelになんとなく関わっていることで自分が賢くなったと思い込みたい人間が大半だからな。

その事実をはき違えて、スレの流れをHaskell本来のレベルに引き上げてもらっては困る。
0817デフォルトの名無しさん2007/02/19(月) 01:11:27
モナドが「副作用のある計算」をエミュレートするために
使われることばかり宣伝されるのが,悪影響なんだと思う.

モナドは,副作用どころではなく,もっと広いクラスの計算を
統一的な枠組みで定式化できることが本当の利点だと思うし,
副作用に限定しても,どのような副作用が入るかを厳密に
定式化できる構造を与えられることのほうが大切と思うがなあ.
0818デフォルトの名無しさん2007/02/19(月) 01:34:21
もと物理屋さんなのですが
圏論って勉強するの大変ですか?
集合論と郡論まではなら勉強したことあります
0819デフォルトの名無しさん2007/02/19(月) 01:45:56
このスレで聞くってことはプログラミングに関連するところさえ
勉強できればいいってこと? そうなら、まあまあ簡単。
PierceとかBarr,Wellsを読んで、具体的な分野の論文見れば
あっさりと追いつける。分からなかったら辞書的にMacLane。
0820デフォルトの名無しさん2007/02/19(月) 03:11:00
>>818
こんなところで質問する程度のやる気では無理
0821デフォルトの名無しさん2007/02/19(月) 17:35:02
>818
その質問に対して現状においてもっとも適切に答えをくれる場所
あるだろ・・・。
0822デフォルトの名無しさん2007/02/19(月) 18:02:06
>817
IOモナドは他のモナドとちがって
随伴使ったモナドと解すべきなんだと思う。

つまり
普通のモナド: Maybe, List, etc..
随伴で構成されたモナド: IOモナド

IOモナドで全部副作用と名のつくものを一括で処理しているのが
いろいろな鯨飲の元なんだと思う。
IOモナドを役割ごとにもっと分割させないと。
本当にIOモナドはI/Oだけ扱えばいいんだと思う。
0823デフォルトの名無しさん2007/02/19(月) 18:02:53
×鯨飲
○原因
0824デフォルトの名無しさん2007/02/19(月) 18:49:00
>>819
この本ですか?
http://www.cis.upenn.edu/~bcpierce/tapl/index.html
0825デフォルトの名無しさん2007/02/19(月) 18:50:02
>>819
psファイルがあるのですね
http://www.let.uu.nl/esslli/Courses/barr-wells.html
0826デフォルトの名無しさん2007/02/19(月) 19:55:30
>>796
函手F上のモナドってなんだ?
あんまりよくわかっていないことを言わないほうがいい。
モナドは函手じゃなくて圏の上で構成される構造だ。
だから「自己」函手なわけだよ。
0827デフォルトの名無しさん2007/02/19(月) 19:56:52
>あんまりよくわかっていないことを言わないほうがいい。

すまん。訂正。どんどんいってけーーーー。
俺もよくわかってないし。
0828デフォルトの名無しさん2007/02/19(月) 20:52:05
>>822
> 随伴で構成されたモナド: IOモナド

これってどういう意味?
IO monad = (IO, η, μ)
のIOが、何かの左 or 右随伴になってるってこと?

Listだって集合の左随伴だと思うが…
0829デフォルトの名無しさん2007/02/19(月) 20:53:18
> Listだって集合の左随伴だと思うが…
集合へのforgetful functorの随伴ね
0830デフォルトの名無しさん2007/02/19(月) 21:20:57
>>826
モナド (F,η,μ) で,特に F を明示したい場合に "monad over F" という
言い方をすることがあるので,それほど変ではないと思うよ.
0831デフォルトの名無しさん2007/02/19(月) 21:34:40
「圏論の基礎」と格闘中…
こういう話に追いつけるのはいつになることやら。
0832デフォルトの名無しさん2007/02/19(月) 22:05:34
>>829
!!!
マジで!ちょっとまてわからん。orz
orz
0833デフォルトの名無しさん2007/02/19(月) 22:09:08
>>828

あー。早とちり。

>のIOが、何かの左 or 右随伴になってるってこと?

そういう意味じゃない。どういう意味かと聞かれたら
そこを現在勉強中です。
うまく答えれません。正直そんなナチュラルに答え返されるとは思わなかった。
0834デフォルトの名無しさん2007/02/19(月) 22:16:50
>>833
モナドと随伴は一対一対応する.
(随伴が与えられると,そこからモナドが構成できる.逆に,
 任意のモナドに対して,それを構成するような随伴が存在する)
よって IO に対してそれに対応する随伴があるのは当然.

ということを言おうとしてると思って,IO の随伴を求めたけど
全然直感的でないものしか得られなかった.

これって何か解釈あるのかな? 参考文献お願いします.
08358332007/02/19(月) 22:18:07
ちょっと即興で考えて見ます。
ちょうどそれを考えられる材料がそろってきたので。
期待しないでください。
0836デフォルトの名無しさん2007/02/19(月) 23:30:53
圏論とチューリングマシンやラムダ論法って、同じ記述力なの?
それともどれかがより大きな記述力があるの?

なんで圏論なのさ?チューリングマシンでは駄目なのかよ!

チューリングがホモだからって差別してんじゃないわよ!
0837デフォルトの名無しさん2007/02/20(火) 00:02:47
>>831
コンマ圏がマンコ圏に見えて困るでしょ?
0838デフォルトの名無しさん2007/02/20(火) 01:50:36
>>834
モナドを構成する随伴は一般に複数あってそのうちの一方の端が Eilenberg-Moore の
構成でもう一方の端が Kleisli の構成、だよね。
端というのはある圏の始対象と終対象という意味で。
0839デフォルトの名無しさん2007/02/20(火) 02:46:29
10年間はlispが最強だったみたいですが
今の最強はhaskellでしょうか?
http://www.shiro.dreamhost.com/scheme/trans/beating-the-averages-j.html
この人達が絶賛するlispのマクロに対応する機能も
haskellは持ってるのでしょうか?
0840デフォルトの名無しさん2007/02/20(火) 02:49:25
10年間 -> 10年前
0841デフォルトの名無しさん2007/02/20(火) 14:18:13
>>839
Haskellにはマクロはない。
Lispのことは良く知らないけど、記述力という点で
Haskellより弱いとは思えない。
0842デフォルトの名無しさん2007/02/20(火) 14:55:20
手続き型言語の方が記述力は高いもんな
0843デフォルトの名無しさん2007/02/20(火) 15:35:07
手続き型かどうかは関係なくね?
第一級の関数とかマクロとかパターン照合とかが使えるかどうかが大きいと思う。
0844デフォルトの名無しさん2007/02/20(火) 16:14:12
>>843
それは記述力とは関係なくて、エラー抑制の効果があるだけ。
0845デフォルトの名無しさん2007/02/20(火) 18:53:11
記述力ってのは型システム(の緩さ)で決まるのですよ。
その結果、Lispの方がちょっとHaskellよりも記述力が高いのですよ。

でも、多くの場面では、カチカチの型が憑いているメリットの方が大きいと思うけれど。
0846デフォルトの名無しさん2007/02/20(火) 19:30:22
冷静に考えてみると、動的型言語と同等の力が必要ならいつでも
Data.Dynamicを使える訳で、そうしないのは気持ちの問題に過ぎないのかも。
型安全でないHaskellライブラリなんて寒気がする、とか。
0847デフォルトの名無しさん2007/02/20(火) 20:01:39
>>844
マクロをエラー抑制だけと言い切るのはちょっとw
ttp://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?Scheme%3a%e3%83%9e%e3%82%af%e3%83%ad%e3%81%ae%e5%8a%b9%e7%94%a8
0848デフォルトの名無しさん2007/02/20(火) 20:04:38
どこでもevalれないと同等とは言いたくないぜ。
メタな要素がまざると、型とか意味論的に都合が悪いのかな
0849デフォルトの名無しさん2007/02/20(火) 22:41:56
つ hs-plugins
0850デフォルトの名無しさん2007/02/20(火) 22:43:04
ああ、まあ hs-plugins の eval は IO だから「どこでも」じゃないな
0851デフォルトの名無しさん2007/02/20(火) 23:01:37
HaskellのevalはIOとして外側の世界に出して行うしかない。
LispのevalはLispの世界で定義されている。
この差は大きいと思う。
0852デフォルトの名無しさん2007/02/20(火) 23:02:53
動的なプログラムはデバッグきつい。
性的なほうがいいね!
0853デフォルトの名無しさん2007/02/20(火) 23:11:08
最初はきついかも知れんが、動いていればだんだん滑らかになるよ。
きつい方が気持ちよい
0854デフォルトの名無しさん2007/02/24(土) 00:52:28
>>831
圏論の基礎は数学者向けの基礎なので、
普通の人は違う本を読んだほうがいいらしい。
0855デフォルトの名無しさん2007/02/24(土) 01:58:15

これから初心者の俺が朝まで生Haskellやろうかと思うんだけど
おまえら実況板並みに教えてくれないか?
■ このスレッドは過去ログ倉庫に格納されています