トップページ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の仕様により、行頭の半角スペースは表示されません。
 コードをインデントしたいときは、代わりに または全角スペースを使うことができます。
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やろうかと思うんだけど
おまえら実況板並みに教えてくれないか?
08568552007/02/24(土) 06:05:17
終了しますた
0857デフォルトの名無しさん2007/02/24(土) 09:34:02
>>855-856
ワロタ
0858デフォルトの名無しさん2007/02/24(土) 17:37:24
855≠856
だってだれもレスくれねーんだもん
バベル見て寝たわ
0859デフォルトの名無しさん2007/02/24(土) 18:05:10
>>858
夜中の2時にいきなりでレスも糞もねーだろw
VIPじゃねーんだぞwwww

昼間に犯行予告をしとけよ
0860デフォルトの名無しさん2007/02/24(土) 18:43:30
犯行予告は犯罪だからその教唆も明らかに犯罪ですね。
0861デフォルトの名無しさん2007/02/24(土) 19:01:36
アスペルガーの馬鹿はすっこんでろ!
0862デフォルトの名無しさん2007/02/25(日) 02:59:15

             ∩___∩
             |ノ⌒  ⌒ ヽ
             / ●)  ●) |
        Let's  |   ( _●_)  ミ  Haskell♪
            彡、  |∪| 、`
              /  ヽノ  ヽ
             / 人    \\   彡
           ⊂´_/  )    ヽ__`⊃
                / 人 (
               (_ノ (_)
0863デフォルトの名無しさん2007/03/03(土) 00:14:49

 い ま か ら ハ ス ケ る か ら お し え て く れ
0864デフォルトの名無しさん2007/03/03(土) 00:36:30
なんでも聞きなさい。
0865デフォルトの名無しさん2007/03/03(土) 00:41:35
よーし、じゃあまだ「ふつうのHaskellプログラミング」で
Map関数までしかすすんでないんだけど、
いきなりWikiつくりはじめちゃうぞーー
0866デフォルトの名無しさん2007/03/03(土) 01:00:05
>>865
ちょwwwそれ無謀wwwwwww
0867デフォルトの名無しさん2007/03/03(土) 02:24:52
はははは 父さん元気な子は大好きだぞー
0868デフォルトの名無しさん2007/03/03(土) 02:29:12
いやーだってね
基礎を勉強したところでコードは書けるようにならないじゃない
なんか作ろうとしたほうが5倍くらい早くおぼえれる

そうだろ?父さん!
0869デフォルトの名無しさん2007/03/03(土) 02:54:28
>>868
君が一番上達する方法はしらないから、自由にすればいいよ。
0870デフォルトの名無しさん2007/03/03(土) 02:57:20
ところでこれWikiの完璧なソースはどこにあんの?
0871デフォルトの名無しさん2007/03/03(土) 09:58:10
本の丸写しだけは勘弁してほしい
0872デフォルトの名無しさん2007/03/03(土) 12:54:39
そんなアホなことはしない
0873デフォルトの名無しさん2007/03/03(土) 16:31:01
日本語よりサンプルコードの方が学習しやすい、って人もいるけど、
Haskellでそれができるとしたら「型」の概念に対して
相当鋭敏な感覚を持ってないとむつかしいような気がする。

javascriptとかだったらなんとなく見よう見まねで動きそうな気もするが。
0874デフォルトの名無しさん2007/03/04(日) 00:46:42
モナド変換子おもすれー

import Prelude hiding(either)
import Control.Monad.List
both, either :: a -> a -> ListT [] a
both a b = return a `mplus` return b
either a b = lift [a,b]
main = do
  -- Both Bill and Mary loves either Martha or John.
  print $ runListT $ do
    lover <- both "Bill" "Mary"
    lovee <- either "Martha" "John"
    return $ lover ++ " loves " ++ lovee

  -- Either Martha or John is loved by both Bill and Mary.
  print $ runListT $ do
    lovee <- either "Martha" "John"
    lover <- both "Bill" "Mary"
    return $ lover ++ " loves " ++ lovee

結論: 自然言語にも副作用があるというのにHaskellときたら(略
0875デフォルトの名無しさん2007/03/04(日) 14:31:37
> both, either :: a -> a -> ListT [] a

こんな書き方できるの初めて知った
0876デフォルトの名無しさん2007/03/06(火) 23:57:05
関数言語むつかしいよ
こういうプログラムをつくってみようと思い立ってもまったく書けない
あれ?文法どうだったっけ?みたいな
0877デフォルトの名無しさん2007/03/07(水) 00:13:36
>>876
手続き型言語で培った慣れが役に立ちにくいというだけであって、
学習の難しさはさほど変わらないんじゃなかろうか。
初めてプログラミングを習った人は大抵、
「思い立っても全く書けない」状態を経験するだろう。
0878デフォルトの名無しさん2007/03/07(水) 10:43:06
Haskellに限ればリスト覚えたら大体何とかなる希ガス
0879デフォルトの名無しさん2007/03/07(水) 20:46:20
そんなおれになんか課題だしてくれないか
ふつうのHaskellプログラミングでMAP関数のとこまでは読んだ
08808392007/03/07(水) 21:28:52
lispちょっと勉強してきました
cのプリプロセッサを強引に前処理としてかませば
lispのマクロと同じことができるかも
0881デフォルトの名無しさん2007/03/07(水) 21:36:55
どういう勉強をどれくらいしたのかは知らないけど、lispのマクロについてもっと勉強した方がいいよ。
0882デフォルトの名無しさん2007/03/07(水) 21:37:05
>>879
テキストファイルの各行を30文字に切り詰めるプログラム。
0883デフォルトの名無しさん2007/03/07(水) 21:39:07
>>880
Cプリプロセッサは実質的にチューリング完全だから能力は十分だけど、
Haskellの方がメタなことをするのに適していないような気がする。
例えば、局所的に型を宣言することができないとか。
0884デフォルトの名無しさん2007/03/07(水) 22:49:05
880じゃないけど
>Cプリプロセッサは実質的にチューリング完全だから能力は十分
これってホント?ループがかけないような
0885デフォルトの名無しさん2007/03/07(水) 22:49:53
局所的に型を宣言?ってどゆこと?
0886デフォルトの名無しさん2007/03/07(水) 22:50:39
自己includeでループはできそう。
0887デフォルトの名無しさん2007/03/07(水) 23:20:39
なるほど、define,ifdefとか組み合わせたらいけそうだな、納得
0888デフォルトの名無しさん2007/03/07(水) 23:46:56
881です。CPPがチューリング完全だとは知らなかった。その点は謝りたいと思います。


ところで、どうもまだ混乱しているんですが、自己includeのループをどう止
めたものかがわりません。 ifdef とかで何とかなるもんなの? define の再
定義では上手く行かないと思うんだけど。

たとえば階乗を計算するコードって、どんな概形になりますか?
# スレ違いすぎ?
0889デフォルトの名無しさん2007/03/07(水) 23:48:14
BOOST_PP
でループはできる
08908392007/03/07(水) 23:55:48
>>881
http://practical-scheme.net/wiliki/wiliki.cgi?Scheme%3aScheme%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9e%e3%81%ae%e3%83%ac%e3%83%99%e3%83%ab10
まだレベル1から2ぐらいです

これ以上勉強したらhaskellには戻ってこないと思う
0891デフォルトの名無しさん2007/03/08(木) 00:11:56
>>888
適当だけどこんなん用意して
#include<boost/preprocessor/slot/slot.hpp>
#ifdef N
    #define BOOST_PP_VALUE N
    #include BOOST_PP_ASSIGN_SLOT(1)
    #define BOOST_PP_VALUE 1
    #include BOOST_PP_ASSIGN_SLOT(2)
    #undef N
#endif
#if BOOST_PP_SLOT(1) == 0
    #define X BOOST_PP_SLOT(2)
#else
    #define BOOST_PP_VALUE BOOST_PP_SLOT(2)*BOOST_PP_SLOT(1)
    #include BOOST_PP_ASSIGN_SLOT(2)
    #define BOOST_PP_VALUE BOOST_PP_SLOT(1)-1
    #include BOOST_PP_ASSIGN_SLOT(1)
    #include __FILE__
#endif
こんな風に呼び出す。
#define N 6
#include "fact.c"
main(){
    printf("%d\n",X);
}
あとはC++関係のスレで
0892デフォルトの名無しさん2007/03/08(木) 00:42:45
>>888
俺が念頭に置いてたのはこんな感じ。
http://lists.boost.org/Archives/boost/att-46646/lambda.cpp

>>885
let data Foo = ... in ...
のように式の中で即席の型を作れると、C++のテンプレートの
真似ができるかと思ったが、良く考えるとそうでもなかったかも。
■ このスレッドは過去ログ倉庫に格納されています