4 :
潜伏していた1@このスレはパート2です:02/02/16 17:03
5 :
このスレはパート2です:02/02/16 17:08
というわけで、いきなりbottomってしまいましたが頑張りましょうage
>>4 一番下のやつってやる気起きるのか?
英語苦手なんでちゃんと読めてないのですが
とりあえず Haskell を勧めてはいないような…。
7 :
このスレはパート2です:02/02/16 18:35
なんで使ってくれないんだ? という原因を検証しているようですね。
なんで使ってくれないんだ? と訴えられると、
「よっしゃ一肌脱いだる」とか思うのは、俺だけですかねぇ。
#その割に未だ偉そうなプログラムは書けていませんが。
> なんで使ってくれないんだ?
そんなに Haskell 側に立ってる感じでもないような。
module A where
data A a = A a
f = id
g :: a -> a
g = A.f
h :: a -> A a
h = A .f
10 :
デフォルトの名無しさん:02/02/18 12:20
age
11 :
デフォルトの名無しさん:02/02/18 15:06
>>8 胴囲
どっちかというと、Haskell擁護者よ。
Haskellを普及させたいなら、もっと頑張れみたいな。
たしかにHaskellには、一般向けアプリを作りるには足りないものが多いなー。
TCP/IP鯖作るにしても、ライブラリ作るところから始めなきゃいけないし。(多分)
鯖にTimeOut処理付けるにしても、Timer関数ないし、競争書き込みもしないから
各関数にTimeOut処理付けるしかないのかな?
と言うわけでParalell Haskell燃えー。(といっても何かは知らんがね)
> と言うわけでParalell Haskell燃えー。(といっても何かは知らんがね)
どうしてそういう結論につながるんだよ!
と思ったが、前スレに出てた Paralell Haskell で書かれた web server のことで…か。
とりあえずあれは Paralell Haskell だからライブラリがあるわけでなく
ただ単に GHC に付いてる ライブラリ使ってるだけっぽいですよ。
いやー。
こんな関数がほしいのよ。(Haskell消防なので笑わないでね)
readWithTimeOut :: Socket -> Int -> Maybe String
readWithTimeOut s ms = timer ms Nothing || read s
関数timer::Int->a->aは指定された時間簡約が停止する。
その後2番目の引数を返す
関数read::Socket->StringはTCP/IPにデータが来るまで簡約が停止する。
ソケットからByte列をStringとして返す。
演算子||は、競争書き込み。全ての最初に帰ってきた値を値として返す。
他の簡約は、もちろん正常に停止、消去(GC?)される。
もちろん a = b || c || dと複数書ける。
(競争に負けた簡約は、どうしたらいいんだろう?うーん、キャッシュしておく?)
ってParallell G-mahineを実装しているHaskellでも可かな?
このようなことのできる処理系あったら誰か教えて。お願いします。
Parallel と Concurrent ってどう違うんですか?
お前はどう違うと思うんだよ
16 :
デフォルトの名無しさん:02/02/19 21:28
Hugs98にはWin32グラフィックライブラリがついているが、
コンパイラ(GHC)の方にはグラフィック関係のライブラリない
みたい。Hugsでライフゲーム作ってみたけど、遅いので
コンパイルしたいが、GHC使ったことないので教えてくれ。
アニメーションもストリームにしちゃうから、グラフィックIO
も遅延評価じゃなきゃいけないが、このあたりがライブラリー
の作成を難しくしているのかな。
17 :
デフォルトの名無しさん:02/02/21 16:56
なんと、同じ名前で新スレとは!
なんたる!
19 :
デフォルトの名無しさん:02/02/21 17:23
>>1 は Haskellにお詫びしろ。
貴様は代入を行った(笑
実はMonadを使って回避されています……ってワケにも行かないか。
>>19
22 :
デフォルトの名無しさん:02/02/21 20:29
17=18=19 の自作自演じゃない。
参照透明性くずすな。
私は17しか書きこんでないっ!
失礼。
17−20うまくオチが決まってたので、チャチをいれたくなった(笑)
もしかしたら、再帰呼び出しなのかもしれないな(笑
#だとしたら次スレも同じ名前?(笑
「おっ、Haskell スレにいっぱいレスが付いてる」と思ったら…
代入と配列(あるいは大きなオブジェクトの部分更新)とMonadの関係について
丁度悩ましい思いをしてるトコなもんで(w。
>>25 その場合、このスレに関する型推論はどうなるのでありますか?(w
28 :
面白そうだけど、調べた事ないー:02/02/22 19:53
>>27 やってたやってた、蓬莱軒行った奴がそういうテーマ。
なんか、プログラムの停止性と関連付けて、
停止する関数と停止しない関数に分けるのかな?
多相型と関連付けると、ちいと面倒な結果になりそう...
#真面目に調べたことないけど
>>28 蓬莱研?もしかすると物理的に近所かもしれない……(w。
ちなみに特に関心があるのはその実装と効率なんでスヨ。
今、メインで悩んでる課題ではないんだけどね。
30 :
デフォルトの名無しさん:02/02/24 05:33
ghcを使ってちょこちょこ簡単なプログラムを
作って遊んでます。が、しかし!
コンパイルが異常に遅いです。
ghcってHaskellで書いてあるんですよね?
だとしたらHaskellで書かれたプログラムは
遅いということになったりして・・・鬱
実際にghcでアプリケーション作ってる人の
感想を聞かせてください。
31 :
デフォルトの名無しさん:02/02/26 14:59
hoshu age
32 :
デフォルトの名無しさん:02/02/26 15:00
33 :
デフォルトの名無しさん:02/02/28 04:08
乱数を生成関数では、素直に考えると
参照透明性が確保できませんよね?
(実行するたび帰り値が違うんですから。)
なんとか参照透明性を確保する方法ってないのでしょうか?
誰か教えてください。
34 :
デフォルトの名無しさん:02/02/28 04:13
>>32 おおHaskell.NETのBetaすか?
いいですねー。
今度Downしてみよう。
>>33 「入力」の仲間だと思えば継続(continuation)かMonadかなぁ。
無限リストで乱数列を表し遅延評価というのも、
形式的には面白いが実際に書くと重いだろうなぁ。
まー、擬似乱数を線形合同法とかでつくるなら、
お手軽には直前に出力された数を呼出し毎に渡すとか……。
Linux の /dev/random みたいなものかと
39 :
デフォルトの名無しさん:02/03/01 09:20
>>36 重くなるっていうか、乱数って最新の一個だけが必要なことが多いから
過去の値が全部リストになって残ると、沢山利用した時にメモリを無駄に圧迫するかなと。
GCで回収されるならまだいいんだけど。
>>39 参照されていないオブジェクトは回収されないんですか?
41 :
デフォルトの名無しさん:02/03/02 04:02
>>40 クライアントは再帰中なので、
生成された乱数は、参照可能だからかな?
そりゃ、回収されんわな。
42 :
デフォルトの名無しさん:02/03/02 11:59
>>37 IO monadは、最初は本当に入出力用だったのに、
後からいろいろと付け足したのだと思われ。
別々のmonadにすればいいじゃん、と思うかもしれないが
一緒に使いたくなったときに困る。
monadの合成は、理論的に自明じゃない問題があるので。
43 :
デフォルトの名無しさん:02/03/02 13:59
乱数乱数って普通言うけど、実際は乱数系列のことでしょ
だから
>>36のやり方は別に特殊じゃないよ。
つーか、素直にIO monadな
>>36使え。
末尾再起じゃなくて乱数リスト回収できない事気にするくらいなら、
リストよりでかいスタックを解放するようにプログラム書き換えろ。
sagesage
46 :
デフォルトの名無しさん:02/03/05 18:35
たまには age ておこう。
47 :
言語障害なんです:02/03/08 04:49
Haskellのモナドは正直言ってかったるい
49 :
デフォルトの名無しさん:02/03/13 07:58
age
あーそうだ haskell もやらなきゃ..
51 :
デフォルトの名無しさん:02/03/19 22:40
>>52 実行時までどんな関数が来るのか分からない
らむちゃんなんだから全然違うだろ。
>>51 lambda liftingというのは、
一言で言えば、自由変数を除去する変換の事です。
・funarg問題がなくなる
・環境の扱いが簡単になる
・lazinessの境界がはっきりする
などなどの利点があります。
lifterはその変換器の名前です。
Super combinatorというのありました。(これは変換後のλ式の名前)
Prentice-Hallから処理系実装の本が出ていましたが、
> それと関数型言語にある代表的な最適化処理があれば教えてください。
こういう観点で非常にいい読物だと思います。
# 今やMicrosoft Research(CLI!)のSimon P. Jonesのが一冊、
# もう一冊はHughesじゃなかったかな? 教科書になって答えがWebで配布された奴。
驚きなのはcombinatorが非常に古い概念であるにも関わらず、
λ計算において非常に本質的な役割を担うことです。
>>53 > 実行時までどんな関数が来るのか分からない
> らむちゃんなんだから全然違うだろ。
λ式ちゃんは、Lisp野郎ほど酷くないですけどね。
奴の場合、cons, eval, macroと何でもありなので。
>>57 なんだか大変そうですね。これホントに自分でやってるのかな?(藁
仕事でcygwinを強いられるSimon萌え!
論文発表打ちage
61 :
デフォルトの名無しさん:02/03/26 05:40
>>54 コンビネータ、結合子ですか?
圏論?λ理論の話でしたか?
うーん難しい。
62 :
デフォルトの名無しさん:02/03/26 23:57
>>61 理論的には難しいとおもうけど、
"Implementing Functional Languages: tutorial"
には実装についてわかりやすく書いてありますです。
63 :
デフォルトの名無しさん:02/03/27 00:00
>>62 サイモン パイソン ジョーンズさんがM$用に書いたやつだよね?
どのチャプターに書いてあります?
(ファイルは持ってるんだけどねー。軟弱ものなので読んでません。)
> Peyton
ペイトン
65 :
デフォルトの名無しさん:02/03/27 09:17
>>63 Lambda lifting については 6章
コンビネータ実装のはなしは
"Implementation of Functional Programming Language"
というよく似た名前の本の方でした。これも、どこかのWEBサイトで公開
されてたとおもうですだす。
66 :
デフォルトの名無しさん:02/03/28 04:41
>>65 "Implementation of Functional Programming Language"
本の方は簡単に見つかったけどなー。
判らない。くそー。
67 :
Super Combinator:02/03/28 10:27
68 :
デフォルトの名無しさん:02/03/28 10:28
Peyton Jonesは前に学会で会ったとき、冬のロンドンを裸足で歩いてた…。
別に変人じゃなくてナイスガイなんだけど。発表は楽しいし。
>>67 コンビネータといえばCL式
どんなCL式でもIKSを組み合わせたものまで分解できるらしいけど
どうやって?
あとSの意味が判らない。どう使うんだろう?
I = \ x -> x
K = \ x y -> x
S = \ x y z -> x z ( y z )
でも相手にしないでください。
頭正規形(hnf)って何?といぐらいのレベルですから。
ラムダ理論も知らないんですから。
70 :
Super Combinator:02/03/29 09:40
>>69 > あとSの意味が判らない。どう使うんだろう?
> S = \ x y z -> x z ( y z )
Distributor.
Combinator式は、グラフとして素直に表すことができるから、
部分グラフは、元のプログラムを分割したものと考えられる。
部分プログラムxと部分プログラムyの両方に引数zを渡し適用するのが役割。
x側では引数zは必要なければ、
(K x' z) (y z)
てな感じになる。(x ≡ K x')
(x z)を(y z)に適用するのは、部分プログラム同士を結合する方法が、
「適用」以外にはないから。Combinator logicやlambda calculusでは。
RAM(Random Access Machine)ではメモリ参照で、データを扱うわけだけど、
Combinator logicやlambda calculusでは、どんどん受け渡していくことになる。
# lambda calculusのβ簡約をメモリ参照で直感的に理解している人も多いと思うが。
71 :
デフォルトの名無しさん:02/03/29 19:23
>>69 I=SKK
Raymond Smullyan の "To Mock A Mockingbird" という本が楽しめます。
翻訳も出ていたと思う。
72 :
デフォルトの名無しさん:02/03/29 20:47
>>71 『ものまね鳥をまねる』森北出版 isbn 4-627-01901-7
みなさん、親切な解説有難うございます。
「プログラミング意味論」 横内寛文著
「計算論 計算可能性とラムダ理論」 高橋正子著
と読み理解しようと奮闘中なのですが、計算機屋の私にはさっぱりです。
しかし理論はむずかしーな。
一度ものにしてしまうと効果絶大なんですけどね。
もうちょっと、がんばってみます。
>>71 >I=SKK
む。なるほど。
上の本で書かれていましたが、改めてみると こういう意味だったんですね。
Sの機能が、ちょっとわかった気がしました。
>>70 >Distributor.
>
>Combinator式は、グラフとして素直に表すことができるから、
>部分グラフは、元のプログラムを分割したものと考えられる。
>部分プログラムxと部分プログラムyの両方に引数zを渡し適用するのが役割。
中略
>(x z)を(y z)に適用するのは、部分プログラム同士を結合する方法が、
>「適用」以外にはないから。Combinator logicやlambda calculusでは。
なるほど。
Sで式同士を組み合わせる。
もしくはSで式を分解できるということなんでしょうか?
>>71 >『ものまね鳥をまねる』森北出版 isbn 4-627-01901-7
ttp://www.morikita.co.jp/bunya/kensaku-bunya.cgi?id=67 よさそうな本ですね。購入したいと思います。
74 :
Super Combinator:02/03/29 22:49
>>73 > 両方に引数zを渡し
だから'分配器(distributor)'です。
Sはドイツ語だったかの頭文字だったはず。
K=cancel
GHC 5.02.3 がリリースされました。
ただいま amortization の勉強中。
分かったような、分からんような・・・
ということは分かってないんだなぁ。
76 :
Super Combinator:02/04/10 00:36
>>75 amortizationは、時間のかかる処理を、複数の操作に対してひとまとめにして、
平均の計算量オーダーを下げる手法のこと。
木、ソートされたテーブル、pure functional arrayなどの
再構成、構造調節などで利用される事が多い。
77 :
デフォルトの名無しさん:02/04/10 20:28
amortizationって何ですか?
どういう物なのか興味あるなー。
教えてSuper Combinatorさん。
> amortizationは、時間のかかる処理を、複数の操作に対してひとまとめにして、
> 平均の計算量オーダーを下げる手法のこと。
そのような雰囲気は分かるのですが、「分かったぞ!」という実感が
まだ伴っていません。もう少し勉強します。
.NETというのも名前はよく目にするものの中身はさっぱり分からない
のですが、Hugs98 for .NET というものがリリースされたようです。
http://galois.com/~sof/hugs98.net/
79 :
デフォルトの名無しさん:02/04/11 10:18
Cormen, Leiserson, RivestのIntro. Algorithmsに
amortized analysisの章がありますよ.
80 :
デフォルトの名無しさん:02/04/11 11:31
たとえば固定長配列に1ずつ要素を追加していくことを考えます。
満杯になったら新しく大きい配列を用意して全部コピーして追加。
このとき、初期サイズ1で1ずつ大きくして行くとN要素追加するの
に合計コピー回数は1+2+3+…+NだからO(N*N)。定数Cずつ大きく
していくとしても、コピー回数がC分の1になるだけだからO(N*N)
は変わらない。ところが2倍ずつに大きくして行くことにすると、
1+2+4+…+NだからO(N)になるのね。しかし「1個追加するときの
最大計算量」はどの方法でも(その1個であふれた場合はどのみち
コピーするんで)変わらない。逆に言えば、最大計算量を考える
変わりにN個の操作全体の計算量を考えてその平均を取ると
1個追加する際の平均的な計算量はO(1)だよね、っていうのが
amortized analysis。
81 :
デフォルトの名無しさん:02/04/12 21:11
82 :
デフォルトの名無しさん:02/04/13 19:28
なんか今はnot foundになっちゃうけど、それってChris Okasakiのページだよね。
>>81 だったら、そうだと思う。
でもこのスレの人でも、英語は壁になるんだ…。自動翻訳希望?
そうです。
他力本願全開。
> 逆に言えば、最大計算量を考える
> 変わりにN個の操作全体の計算量を考えてその平均を取ると
> 1個追加する際の平均的な計算量はO(1)だよね、っていうのが
> amortized analysis。
これは良く分かります。ただ、これだけだと amortization などという
言葉を持ち出すまでもなく、単に「平均」ですよね。(違うのかな?)
もし単に平均コストのことを言っているだけだとすると、
banker's method だの physicist's method (
>>79の本では
accounting method と potential method)だのの技法を使い、
多くのページを割いて解説するほどのことじゃないように
思うんです。
>>80の例の場合、配列の確保がサイズに関係なくO(1)で行えると
仮定すると、あふれたときに1度に全部コピーするのではなく、
新しい要素が追加されるたびに要素を2個ずつコピーすることに
すれば1個追加する際の「最大の」計算量がO(1)となります。
結局、amortizationの何が良く分からないのかということを
改めて考えてみますと、amortized analysisで得られた平均
計算量が、平均ではなくて最大の計算量となるような実装が
いつも得られるのだろうか、ということであるような気が
してきました。
まだ良く分かっていません。変なことを書いていたらごめんなさい。
85 :
デフォルトの名無しさん:02/04/15 10:08
>>84 > これは良く分かります。ただ、これだけだと amortization などという
> 言葉を持ち出すまでもなく、単に「平均」ですよね。
「最悪」の場合の1ステップあたりの「平均」ではないでしょうか。
86 :
デフォルトの名無しさん:02/04/17 14:32
87 :
デフォルトの名無しさん:02/04/17 17:53
89 :
デフォルトの名無しさん:02/04/19 00:40
このスレを見て面白そうだと思いHugsを入れてみた関数型の素人です。
最初はやはり名前を入力させてXXXさんこんにちは、だと思い試したのですが
putStr "123" とか getLine とか単体では動くのに、次のように組み合わせるとエラーになります。
Prelude> putStr getLine
ERROR - Type error in application
*** Expression : putStr getLine
*** Term : getLine
*** Type : IO String
*** Does not match : [Char]
一行入力をそのままエコーすることを意図しているつもりなのですが、何故でしょうか?
91 :
デフォルトの名無しさん:02/04/22 03:35
色々試しているのですが、次のコードで
ERROR "ファイル名":3 - Type error in function binding
*** Term : sel
*** Type : a -> IO a
*** Does not match : a -> a
*** Because : unification would give infinite type
というのが消えてくれません。
module Main (main) where
sel x = do putStr "(y/n) ? "; c <- getChar
return (
case c of
'y' -> sel (x + 1)
'n' -> x
_ -> sel x)
main = do putStr (show (sel 0))
selの型は Int -> IO Intのつもりなのですが、型を明示しても駄目です。
いじっていると、IO (IO Int)みたいな型がエラー報告で出るときもあります。
このコードはどうすれば通るのでしょうか?
それと、IOを重ねる意味は無いように思えるのですが、IO (IO Int) というのはどういう状態なのでしょうか?
質問ばかりで申し訳ありません。
>>91 case c of
{'y' -> sel (x + 1)
;'n' -> x
;_ -> sel x}
この式の型は何でしょう?
IO Int …のつもり…です。
それをreturnで返していますから、selの返値もIO Intで、
selの型は Int -> IO Int …
エラーになるということは、間違った理解なのでしょうけれど…
sel (x + 1) と sel x が IO Intなのに、'n' の時の x がただの Int だからいけない…?
とすれば、ただの Int を IO Int に揃える必要があるということですか?
> IO Int …のつもり…です。
> それをreturnで返していますから、selの返値もIO Intで、
return の型は Monad m => a -> m a です。
>>91 のケースだと m は IO。
> とすれば、ただの Int を IO Int に揃える必要があるということですか?
うん。で、そういう場合に return を使う。
sel x = do
putStr "(y/n) ? "
c <- getChar
case c of
'y' -> sel (x + 1)
'n' -> return x
_ -> sel x
以下のコードで動作しました。ありがとうございます。
module Main (main) where
sel x = do putStr "(y/n) ? "; c <- getChar
case c of
'y' -> sel (x + 1)
'n' -> return x
_ -> sel x
main = sel 0 >>= putStr . show
(r <- case …にしてその後にputStr "/"とreturn rを続けて書いたら、'n'を打った時も表示されたので)
この場合returnはcaseから抜けているだけですよね?
doを使っている場合も、returnを書かなくても、最後の式が返値になるのですね。
97 :
デフォルトの名無しさん:02/05/01 14:16
return は関数であって、命令ではない。
IO型にするだけで、脱出はしないということですか?
99 :
デフォルトの名無しさん:02/05/02 00:29
返り値という表現に違和感を感じので。
深い意味はないです。return は、返り値を
もって呼び出し元へ帰る命令ではなく、単に
a 型の値を m a 型の値に写像する関数だと
いってみただけです。
試してみたら、returnの後に文を続けた場合、途中returnに渡した値は無視されて、最後の値が採用されているようです。
成程…Haskellのreturnはreturnしないのですね。
101 :
デフォルトの名無しさん:02/05/02 02:43
のぶさんのHaskell-MLに登録してみましょう
102 :
デフォルトの名無しさん:02/05/03 01:36
return とか戻り値をCチックに理解しようとしてる時点でもうダメでしょうって
感じかも。関数型言語の発想が根本からわかってない。
IOモナドって一見して普通の手続き型にも見えますからねえ・・
関数型が全くわからない人は、HaskellのまえにMLを経由した方が良い
というのは正しいのかも。
モナドは手続き型プログラミングの車輪の再発明だって、どっかに書いてあったね
104 :
デフォルトの名無しさん:02/05/03 10:55
俺、いつもはMLしか使ってなくてHaskellは詳しくないんだけど、
Haskell(特にGHC)って例外処理とか、入出力じゃない副作用も
どんどんIOモナドに入ってるじゃん。
モナドの合成が理論的に難しいかららしいけど、そのうちに現実的な
プログラムだと何でも一つのモナドの中で書くことになって、ほとんど
MLみたくなったりはしないの?(手続き型言語とまではいわないけど、
「どこでも副作用」って感じで)
105 :
デフォルトの名無しさん:02/05/03 15:56
>>104 モナドは副作用じゃないのでOK OK。
逆に言うとMLの利点がなくなってくる。
ML、Haskellってお互い仲悪いんですか?
ゆーざーがね
108 :
デフォルトの名無しさん:02/05/03 19:18
仲悪いなんて聞いたこともないぞ。
なかはわるくないです。
MLとHaskelは
ちょっと雰囲気は違うような気はしますけどね。
でもまあそれは両方使ってみれば解ることで。
>106
Haskell-MLというのが有るらしいですYO!
110 :
デフォルトの名無しさん:02/05/04 23:53
Haskellは、純粋関数型言語だから
MLの不純さが嫌なのかも?
どうなの?>ALL
確かにHaskellの処理系の効率が良くなればMLは不要になる。
112 :
デフォルトの名無しさん:02/05/05 01:34
MLとHaskellは設計思想自体が全然違う気がします。
ML(Ocaml)は現実的にある程度の副作用を認めている代わりに
使っているとコンパクトな感じがします。
副作用も使えると言うだけで、副作用のある構文を使わずに書く事は
全然出来ますし、遅延評価もコードによって簡単に実現できます。
未だ出来あがっていないものの、ML2000の仕様書では言語自体に
遅延評価など新しい機能がかなり含まれています。
Haskellは純粋を歌ってはいますが、
結局の所モナドというものに問題を押しこんだだけのようにも思え
美しくないようにも思われます。
仕様もわりとごちゃごちゃしている気がします。
言語の性質上ML並みに速くなる事も難しいのではないかと思います。
MLで副作用使わずにどうやってI/Oするの?
あーなんか煽りっぽくなっちゃってスマソ。俺はHaskellも大好きだよ。(笑)
WadlerとかPeyton Jonesとか面白い人が多いし。(そういう問題か?)
>>113 一応、MLでもHaskellと同様のmonadicなプログラミングスタイルは可能。
MLだと文法的に面倒で、Haskellを使ったほうが楽だから誰もやらないけど…
副作用のある関数型言語は
中途半端な感じが払拭できないということでいいのか?
116 :
デフォルトの名無しさん:02/05/05 15:21
Ruby >>>>>>>>>>>>>>>>>>> Haskell
117 :
デフォルトの名無しさん:02/05/05 17:42
モナドがあまりに手続き型っぽすぎるので、
Haskllを関数型を知らない人に触らせると、
モナドでC言語かよ!ということをやろうとする。
しかして正しく正面玄関から入ろうとすると、難解過ぎる。
MLの方がそういう意味でも適度に関数型な気がする。
純粋関数型を言うならば、遅延ストリームでゴリゴリ書くのが基本に
なってるような言語であるべきかなと思ってみたりする。
118 :
デフォルトの名無しさん:02/05/05 18:12
いいんじゃねえの?
多目的言語なんだから。
119 :
Super Combinator:02/05/05 23:13
>>104 > Haskell(特にGHC)って例外処理とか、入出力じゃない副作用も
> どんどんIOモナドに入ってるじゃん。
最近Haskellの動向は探ってないんだけどこれ本当?
IOErrorがIOモナドmoduleにあって、
HaskellがIOError以外ろくに例外をsupportしないだけなんだと思ってたよ。
勉強中だからよく分かんないけど、state モナドの事?
MLと(Haskellとも)離れますが、
モナドを使うと、手続き型言語を
関数的に解釈することができますか?
122 :
デフォルトの名無しさん:02/05/06 10:53
>>121 「関数的に解釈」の意味がよくわからない。
Haskellでインタープリタが書けるか?
という意味じゃないよね。
123 :
デフォルトの名無しさん:02/05/06 11:38
>>122 モナドを使うと、どうみても副作用な操作でもfunctionalな
操作と解釈できるわけですが、それと同じように手続き型言
語のプログラムに純関数的な意味を与えることができますか?
という意味です。
>>124 Idealized Algolとかいうのがなかったっけ。
126 :
デフォルトの名無しさん:02/05/07 01:16
グローバル変数が見当たらないんですが・・・
>>121 >>124 できません。
強引に無理矢理こじつけることならできるかもしれないけど意味無し。
>>124 モナドを使えば、代入、逐次的実行、手続き型ライクなI/O、例外などを
純関数型の枠組みで扱える。gotoくらいならもともとモナドに関係なく
等価な純関数型言語に変換することができる。
Cは無謀だがMINIMAL BASICくらいなら、純関数型とみなすことは可能だろ
う。
129 :
Super Combinator:02/05/07 20:21
>>124 Denotational semanticsじゃ駄目?
domainの性質がやっかいになるから、いいことないけど。
そもそも「簡単に」できるくらいなら、関数型言語の存在意義が…
130 :
デフォルトの名無しさん:02/05/07 22:49
Haskellで書いたプログラムに、関数的意味を与えうるなら、
手続き型の言語のインタープリタを Haskell で書いたら、
その言語の意味を与えたことになる?
ならない?
>>130 なるんじゃない?
きちんとやれば操作的意味論だろ。
132 :
デフォルトの名無しさん:02/05/08 00:35
結局、Haskellは非正格言語なのが問題じゃない?
実際に各項が何時評価されるか?どういう順番で評価されるか?
ということが予測しづらい(できない)からねー。
その点、正格言語や手続き型言語は評価の順序が一目瞭然だからねー。
Prologにカットオペレータがあるように、Haskellも競争書き込みで
評価の順序を、ある程度コントロールできる様にしたらよいのかな?
>>132 ?? 問題なのは結果であって、
順番なんてどうでも良いだろう。
順番じたいが望む結果に含まれる
(例えば入出力とかGUIとか)なら、
そこだけモナド使えば良いしさ。
134 :
デフォルトの名無しさん:02/05/08 07:47
>>133 133も書いていますがコンピュータの入出力は
ストリームを基本としているものが多いですよね。
しかし、ストリームにとって並び方も結果の内ではないでしょうか?
プログラムは外部と入出力して、なんぼのものだと私は思っています。
ゆえにストリームのようなモノに対して実行順序がコントロールできることは
プログラミング言語にとって重要であると思います。
そうじゃなきゃPrologもカットオペレータなんて付けなかった
と思います。
あと私のような消防には、実行される順序が予測できないと
デバッグしづらいです。(もしかして、こっちが本題か?)
>>134 ほんとに消防だな。Haskellだって
ストリームの順番が狂うわけはないだろう。
ストリームは「いくらでも長くなりうる列」
というデータだ。関数型の基本はデータの値を
求めることなんだから、モナドなんか用いなくたって
ちゃんと求まる。
136 :
チュウボウ:02/05/08 09:56
なんで副作用って困るの? よく聞くはなしでは
副作用あり=>参照透過性がない=>数理論理的でない
数学って、まったく副作用のない構成になっているの?
> 数学って、まったく副作用のない構成になっているの?
副作用がなんなのかわかってる?
138 :
デフォルトの名無しさん:02/05/08 10:04
副作用が無ければ、デバッグ簡単
139 :
チュウボウ:02/05/08 11:10
>副作用がなんなのかわかってる?
オレの理解
状態という一種の記憶域のようなものがあってその値が
変わること。
数学ではオートマトンとか除けば、状態のような概念は
知らない。
141 :
チュウボウ:02/05/08 12:32
順序なしで考えるより、順序を指定されて考える方が楽じゃない?
143 :
チュウボウ:02/05/08 12:49
副作用って、関数が値を返す以外の何かの作用を起してしまうことでしょ。
「なぜ関数プログラミングは重要か」に副作用が無い事のよさが力説されてた。
実感湧かなかったが。
>>143 日本語は主語なんかなくても良い言語だよ。英語カブレめ(w
実際この書き込み(145かな?)のなかに主語のある文は一つもないが、
意味はちゃんと通じるだろ?
オレも人並みにSOE本ながめたりして、haskellの理解に
努めたわけよ。モナドの意味もつかもうとしてがんばった
んだけど、あるときふと、こんなに無理して副作用さけよう
という努力はなんなんだろうと感傷的になるわけよ。
Cでグローバル変数はやめよう、と似たようなもんじゃないの?
148 :
チュウボウ:02/05/08 18:35
>>145 >日本語は主語なんかなくても良い言語だよ
おお、そうであった。日本語は述語だけでつうじるのだ。
日本語こそ真の関数型言語であった。なんてわけないか。
>>146-147 つーか…
プログラムって要するに「入力と出力の関係を記述する」
ってだけで良いはずなのに、状態を持ち出すとよけい面倒に
なることも多いでしょ。
モナドを使い、高階関数を使い、入力と出力の関係だけで
ストイックに記述する。そうすると見えるすばらしい世界
を教えてください。
151 :
デフォルトの名無しさん:02/05/08 19:02
>>149 > 入力と出力の関係を記述する
時系列的な入力と出力の表現には内部状態があった方が記述が楽。
あと、入力の長さが不定なときも。
だから入力に対して反応するタイプのプログラムでは状態記述がないと不便。
>>145 主語がなくていいのは主語が明らか(容易に推測可能)な時だけだよ。
フォーマルな文章では日本語だって主語が必要。ここはかなりインフォーマルだからね。
ちなみに英語でも命令形などでは明らかな主語が省略されている。
152 :
デフォルトの名無しさん:02/05/08 19:14
>>151 なんで、ストリームやモナドなどではプログラムの動作が完了した時点では
入力が決定して、出力も決定する筈ということに注目して、
実行時に対応関係を組み立てるわけだ。
無限列から無限列への対応関係を陽に書くことはできないが、
無限列の有限部分列から有限部分列への対応関係なら書ける。
そしてその対応関係が再帰的に定義できているなら、
限りなく計算を続けられる。
ただ、有限部分列の入力から続きを計算する際に何度も同じ計算が
繰り返される場合がある。そういう場合は内部状態としてメモしておけば
計算効率が改善される。
154 :
デフォルトの名無しさん:02/05/08 19:21
155 :
デフォルトの名無しさん:02/05/08 19:39
無限ストリームはメッソドの呼び出しを遅延評価するように
しておけばJavaなんかでも再帰的に記述できるよ。
>>154 httpプロクシサーバとか。
リクエストは無限列とみなせる。
以前にあったリクエストなら、内部状態としてキャッシュしとけば
速くなる。この場合でも副作用は別に必須じゃないけどね。
多分もっと技術レベルが高かったら萌えるんだろうなぁ。
今はC、C++、C#、Javaで手一杯だよ・・・
>>156 副作用が絡むのは配列やオブジェクトの部分更新とかが絡むときが典型。
もちろん更新する値以外も全部複製してしまえば副作用は消せるが、
効率は・・・・・・(ガクガクブルブル)
----
>>155 遅延評価は評価の仕方を「メモ」って行くわけだが、
結構、後でそのメモ・ツリーを辿るのに時間がかかったりする。
>>157 てひひひー。C#は全然把握してないッスー。
C#っていってももともとは.net frameworkのために作られた言語だからね。
シンタックスだけはJavaに似てるけど。逆に言語から仮想環境を想定するとしたら
どんなものになるんだろね。Hakell、というより関数型言語全般のために
作られたようなもの。あるとしたらどんなもんでしょ?
仮想環境ッスかー?何ッスかー?
162 :
デフォルトの名無しさん:02/05/09 01:26
Parallel Graph reduction Virtual Machine (PGVM) ?
>>135 >ストリームは「いくらでも長くなりうる列」というデータだ。
確かに漏れも、そう思います。ストリーム()
しかし、haskellのモデルではIO入出力はストリーム(ぎリスト)ではないですよね。
ということは結局、評価の順序が入出力に影響するはずですよね。
評価の順序を強制するためにモナドというものを利用しているんじゃないですかねー?
どうなんでしょ。
164 :
デフォルトの名無しさん:02/05/09 01:48
http://www.yfcbookshelf.com/ml_lisp_scheme.htm ここの下の所に「Programming Languages:Concepts and Constructs 2/E」
の「日本語訳版を期待」という文字が見えるんですが、今翻訳中なのでしょうか?
もしそうなら超期待!!
>>158 どうも効率面を問題にされているようですが、
私自身たいして関数型言語の経験はありませんが、
仕事の関係上感じている事です。
コンパイラ作ってると、この副作用がないというのが
結構オプティマイズに有効だったりするので、
結構これからの言語の核にすえるのは悪くないと最近思ってます。
計算の依存関係が明白でないと最近のスーパスカラーみたいに
命令スケジュールが必要だと面倒です。
全体的とはいわなくても部分的には関数型言語が高速化への寄与大きいと考えています。
計算機の並列度が上がってくると、少し考え方を変えてみるのも悪くはないと思っています。
ちなみにモナドはあんまり良くわかっていません。(TT)
だれか教えてくれー
>>163 昔のバージョンではストリームでI/OやってたんだよHaskellは。
I/Oエラーが扱いにくくってなあ…
モナドの方が楽だよ。
>>165 本当ですか?
何時の頃のモノなんでしょう?
処理系の名前とバージョンを教えてもらえませんか?
>I/Oエラーが扱いにくくってなあ…
>モナドの方が楽だよ。
たしかに、そうですね。
うーん、モナドから逃げてるのかなー?俺は
モナドを意味づける(動作を定義する)のにストリーム使えるしね。
168 :
デフォルトの名無しさん:02/05/09 02:46
副作用推進派のかた、もっと高階関数を活用してみては
どうでしょう?
関数も各引数を繋ぐための糊だと考えると
副作用が無いほうが嬉しいのでは?
>>164 効率は計算機上での実行の際のことです。
・・・・・・というか効率を考えた動作をガチガチにプログラマが記述する際に
場合によってはあるほうが便利ということですね。
一方、最適化のためのプログラムの解析においては
一般に副作用がないほうがやりやすいのは確かだと思います。
だからこそ代入を消してSSAなんて形式に落としたりもするんでしょうし。
>>168 行列を配列並みの高効率で実装できる方法があるなら是非そう致したいと。
引数で指されるオブジェクトがコピーのコストが気にならないほど小さいうちは
それほど悩ましくないんですが・・・・・・。
>>170 配列使えばいいじゃん。副作用なしの。
SISALっていう関数型言語がそうやって、スーパーコンでも
Fortranに負けない性能出してたよ。
Fortran厨は他の言語が書けなかったので普及しなかったが。
なんかこのスレ人増えたな。
でついでに、「スーパーコンでも」というよりは
むしろ「スーパーコンのために」開発されたようだ。
スパコン以外にも移植はされているようだが、
どうもメインの技術ははデータ並列っぽい気配が。
もっと詳しく読んでみないと判らない部分もあるが、
そうなると今時のマシンの記憶階層と
マッチするかどうかは些か怪しげ。
177 :
Super Combinator:02/05/09 11:43
MonadとInfinite listの関係について知りたければ、
"Comprehending Monads", Philip Wadler読め。面白い。
>>158 は
>>173 を「Sisal 使えば?」と読んでそうな感じだが
>>173 は「Haskell の副作用無しの配列使え」と言ってるのだろう。たぶん。
>>179 どんな実装してるんでソ。>「Haskell の副作用無しの配列使え」
私が読んだ何件かの「副作用なし配列」の論文は皆頑張っていたけどヤパ−リ
オーバーヘッドが大きくて生の配列ほどには早くない・・・・・・。
181 :
デフォルトの名無しさん:02/05/09 21:06
>>132 >Prologにカットオペレータ
カットオペレータ思い出した。これでProlog嫌いになった。
ところで、Prologも関数型かな? 副作用ないみたいだし。
真偽の2値のみを返すと考えられるかな。もっとも偽の値が
返ればストップするので真のみ返るが。
>>181 関数型じゃないね。論理型。
項の「値」を求めてるわけじゃない。
定理を満足する変数の値の組(代入)を求めている。
両方を組み合わせた関数論理型ってのもあるけど。
183 :
第5世代はどうなった:02/05/09 22:51
>>182 論理式の値を求めるのでなく、妥当な推論をするんだった。
unificationできなきゃ終わりという形式だったね。
Hugsのライブラリーに簡単なPrologあるね。
unificationなんかはもともとhaskellにあるから、
簡単に実装できるようだ。
そういえば、カットオペレーターもhaskellで実装
してたかな。
184 :
デフォルトの名無しさん:02/05/10 00:36
haskellは非正格言語だからデバッグし辛いのでは?
副作用がありまくる手続き型言語や正格言語ではデバッグで
苦労しない。というかデバッグしやすい。
非正格言語の優秀なデバッガって無いからね。
一つでもモデル(非正格言語のデバッガのね)が出来ればね。
>>184 ていうか、副作用が無いってのはようするに
思わぬバグが混入しないようにする効果があるわけだから、
デバッグ以前にバグが混入しにくいのでは?
代わりに呼び出し関係が入り組んでくるからねぇ。
>>186 やっぱ銀の弾丸はないもんだよねぇ。
188 :
デフォルトの名無しさん:02/05/12 02:28
>>186 でもバグが無くなる訳ではないでしょ?
仕様のバグという根絶不可能なバグがあるんだから。
やっぱデバッガ必要でしょ。
>>188 既存のデバッガ的な考えは合わないよね。
>>184 副作用がないので
Unit Test あたりが向いてるかも。
191 :
デフォルトの名無しさん:02/05/13 22:37
192 :
デフォルトの名無しさん:02/05/13 22:39
>>188 仕様のバグとデバッガが関係あるんですか?
副作用が無いんだから、
コードの打ち間違いと理論にだけ気をつければ
やっていけます。
194 :
Super Combinator:02/05/13 22:57
>>192 帰納推論系の人たちで、
間違った具体例の指摘から仕様を直したり、
なんて事が流行ったよね?
そのengineのUI programはdebuggerと呼ばれることが多かった。
なんじゃそら
屁理屈か
196 :
デフォルトの名無しさん:02/05/14 16:02
つまり、従来のデバッガの役割は
非常に少なくなると言うことでいいのか?
197 :
デフォルトの名無しさん:02/05/15 00:14
デバッガの使い道ってバグを取るためだけの物かなー?
デバッガをバグ取りに使わないの?
>>198 プログラミング言語の前に日本語を勉強尻。
201 :
デフォルトの名無しさん:02/05/15 01:24
Stream IOを勉強した頃は、同期関係の bugがあったら取り難そうだなあ、
とおもた。
Monadになったら改善できるのかしらん?
>デバッガの使い道ってバグを取るためだけの物かなー?
他に使い道は?
>>204 ウザイ
「バグ取りの他に使う」と「バグ取りに使わない」の
区別もつかない糞は小1からやりなおせヴォケ
207 :
デフォルトの名無しさん:02/05/15 12:22
208 :
デフォルトの名無しさん:02/05/15 13:45
静的なプログラム検証ツールはデバッガの範疇に入るの?
こういうものが作りやすいのが関数型言語の特徴って言われてるから
そっちに期待しちゃうな。あくまで素人の考えだけど。
lintはデバッガって言うか?
なんでHaskellスレは厨房がワラワラと寄ってくるんだろ。
無視できない何かがあるんですかねー。
211 :
206ではないが:02/05/15 14:28
関数型言語にあてはまるかどうかは知らんが、
他人が書いたプログラム(またはライブラリ)を理解するために
デバッガを使って動作を見るのは、けっこうよく使う手だと思う。
>>208 普通は静的な検証ツールはデバッガには含めないと思うけど、
参照透明性の高い関数型言語では、静的/動的の境界はどう定義するんだろう?
例えば多相型の型エラーをデバッグするのって、静的なのか動的なのか…
言語理論に比べて処理系のセオリーが
弱い気がするのは気のせいでしょうか?
>>211
213 :
デフォルトの名無しさん:02/05/15 15:27
>>203 並列って言うか、そもそも関数型言語は逐次処理でもないじゃん。
木の好き勝手なところを簡約していくっていうか。
そでで再帰的に定義された無限リストの簡約とかまちがうとこわいな。と。
P.Wadlerの入門書にもそれがらみの話あったよねえ?
215 :
デフォルトの名無しさん:02/05/16 01:21
関数プログラミングでは、動作手順を記述するわけではないので、命令プログラミングの
動作をステップ実行する従来のデバッグ手法のイメージとはあいいれないかも。
でも、計算順序を無理矢理いれこむ、モナドIO使いまくりのプログラミングなら
命令プログラミングとおんなじだから、print デバッグができるよ。
216 :
デフォルトの名無しさん:02/05/16 01:39
Windowの表示とかやる場合はモナド使うんですか?
関数型でイベント駆動処理を書くのって、
ちょっと想像できないんですが。
Fudgetあげ
ようとしたけど古いから sage
218 :
デフォルトの名無しさん:02/05/16 14:49
>>216 GTK+HS のサンプルコードとかみてみれば?
>>216 モナドによるI/Oのコードをじっとみつめると
入力列内の文字種に応じて呼ばれるハンドラの集まりとも見えてくる。
それがメッセージ列に変わったと思えば書けそうな気がしてくる。
220 :
デフォルトの名無しさん:02/05/17 06:30
>>205 処理系の実行過程の確認
最適化の結果、プログラマーの予想もしないプログラムに変化したりしないとか
その確認をする。勉強にもなるね。
某本にもデバッガでは、シングルステップを使えと載っていた。目から鱗。
221 :
デフォルトの名無しさん:02/05/17 11:20
>>215 GHCか何かだと、unsafeとか何とかいうモジュールに、
どこでもprintできる関数がなかったっけ。
まさにprintfデバッグのための抜け道として。
222 :
デフォルトの名無しさん:02/05/17 13:19
>>220 それは要するにデバッガがアナライザだって言ってるだけでは?
そういうのとは微妙に話が違うような気がするなー。
つまり、デバッガにはそういうブラウジング機能とは別に
何かあるって言ってるんだろ?
223 :
デフォルトの名無しさん:02/05/17 17:10
>>222 いや、デバッグ以外に使い道があるかどうかって話だろ?
だからアナライザとして使ったり、ってのも答えとしてアリだろ。
224 :
デフォルトの名無しさん:02/05/17 18:54
ナスです。
ウリです。
デバッガっでようするにアナライザだろ。
デバッガがバグを指摘するわけじゃなし。
228 :
デフォルトの名無しさん:02/05/19 20:37
>>221 遅延評価だと、どのprintが先に実行されるかわかんなくねえ?
そんなんでデバッグできるのか?
>>228 何をデバッグしたいかによるけど。
(文字列やファイルの最終的な内容も含めた)計算結果が
正しければ良いなら、別に求まる順序は重要じゃないよね。
まあprintを使うってことは順序も気にするんだろうから、
もともと$!やseqを使いまくってるんじゃないの?
230 :
haskell:02/05/26 07:37
age
231 :
デフォルトの名無しさん:02/05/26 13:54
高階関数に詳しくなりたいので教えて。
232 :
Super Combinator:02/05/26 14:22
233 :
デフォルトの名無しさん:02/05/26 18:09
まさみさまがそんな本書いているとはしらなんだ..
竹内先生の Lisp本もじつは読んでないんだよなあ。
日本語で書かれたHaskell本はいつ頃出ますか?
SMLだって出てるのに……。
>>234 日本のHaskellユーザの数が、初回印刷部数(200)を越えたら。
ユーザの数はどうやって数えるんですか?
うちの研究室だけで10人はいるんだから簡単に超えそうなもんだけど(藁
じゃ、漏れが布教用に3冊買ってやるから、早く出してくれよ。
訳本でいいからさ。
つーかさ、200位だったら、
いろんな図書館に要望しまくれば、
なんとかなるんじゃないの?
>>237 ここのところ素人も増えてるぞ>オレオレ
有明で売れよ! ってことですか?
>>243 東京ビッグサイトの巨大同人誌即売会サークル抽選当選しますた。
でもジャンルはプログラミング言語とはホド遠いけど(w。
>>244 適当でいいからHaskell本もきぼんぬ
買いに行くから(藁
ウチはなんと女装本だぞ。それでも買いに来られるか?(w
って、実際問題としてHaskell本を作る余力はなし。
Haskell本かどうかは分からんが、
R. Birdの「関数プログラミング」第2版を翻訳して出版して欲しい。
流れで近代科学社に。
248 :
デフォルトの名無しさん:02/06/04 19:43
今売ってる「関数プログラミング」も、
みなしHaskell本では。
ぶっちゃけた話、古いわけよ。
250 :
デフォルトの名無しさん:02/06/05 00:02
で。
結局、日本語のHaskellの本て有るんですか?
無いんですか?
(というのか無いのか?)
251 :
デフォルトの名無しさん:02/06/05 02:13
252 :
デフォルトの名無しさん:02/06/05 15:33
F#のサイトより転載。
Purely functional languages like Haskell
are excellent within certain niches,
but many simple programming exercises
can quickly turn into problems that require a PhD. to solve.
大げさだな・・・
うまいこというな〜
255 :
デフォルトの名無しさん:02/06/06 21:13
女装+Haskell本期待age
256 :
デフォルトの名無しさん:02/06/06 23:28
「女装しながら覚えるHASKELL」
257 :
デフォルトの名無しさん:02/06/06 23:29
「HASKELLによる女装プログラミングの理論と実践」
Mocking Bird, "Introduction to Female Attire using Haskell", Price Sale, 2002.
259 :
デフォルトの名無しさん:02/06/07 13:06
Purely functional languages like Haskell
are excellent within certain niches,
but many simple programming exercises
can quickly turn into problems that require a Female Attire. to solve.
ネタスレ化か?
261 :
デフォルトの名無しさん:02/06/07 22:26
女装した場合には、その人の参照の透明性はどう確保されるのでしょうか?
アブノーマルな野郎は消えろ。
264 :
デフォルトの名無しさん:02/06/13 16:21
HTk
>>261 女装は代入ではありません。ラップするだけです。
本人への参照はそのままにしてください。
女装人格←女装関連の知り合い
↓
本人人格←普通の知り合い
私個人は女装人格をそのまま丸投げの委譲によって実装しているので、
実質どっちを見てても服装と化粧以外はさほどかわりません。
>>262 頑健なソフトウェアを構築するには
例外の存在をなかったことにして無視してはいけません。
下らんこと書くな。
つまらんし。
つまらんと不満をいうよりも進んでネタを振りましょう。
>>267
269 :
デフォルトの名無しさん:02/06/23 15:09
おい
>>1よ 聞いてくれ。
昨日、母の葬式に出たんです。享年54歳。
そしたらなんか自分、涙が一滴もこぼれないんです。
で、よく見たら会ったこともないような親戚のおばさんですら泣いているんです。
もうね、アホかと。馬鹿かと。
俺な、親の死を目の前にして放心してんじゃねーよ、ボケが。
目の前に人が死んでるんだよ、母親が。
なんか親子連れとかもいるし。一家4人で葬式か。ほんとありがとう。
パパは息子さんに挨拶してくるから車で待ってなさい、とか言ってるの。いい親父だな。
俺な、親が死んでんだからもっと泣けと。
葬式ってのはな、もっと殺伐としてるべきなんだよ。
死に化粧をみた瞬間いつ涙があふれてきてもおかしくない、
泣くか叫ぶか、そんな雰囲気が普通なんじゃねーか。オレ、なんなんだよ。
で、やっと葬式が終わったかと思ったら、なんか次々と母のことが思い出されるんです。
そこでまたぶち切れですよ。
あのな、今さら思い出したところで意味ねーんだよ。ボケが。
得意げな顔して何が、今度の休みには帰るよ、だ。
俺は本当に休みに帰るつもりだったのかと問いたい。問い詰めたい。小1時間問い詰めたい。
俺、適当に親との距離をとりたかっただけちゃうんかと。
親不孝者の俺から言わせてもらえば今、若者の間での最新流行はやっぱり、反抗期、これだね。
親ってのはいつまでも生きているもんだと思っている。これがガキの考え方。
親の期待をかなえたつもりで一人暮らし。そん代わりコミュニケーション少なくなる。これ。
で、「少しだけ仕送りいれといたから」 「ああ、無理すんなよ」。これ最期の会話。
今になって後悔ばかりが思い出される、諸刃の剣。
まあお前ら若いもんは、ほんの少しでもいいから親孝行しなさいってこった。
270 :
デフォルトの名無しさん:02/06/23 21:05
>>256 それは激しく同意。
つうか、がっこで関数言語やってた奴が、
仕事でオブジェクト指向の世界に戻されると、
「このオブジェクト指向言語の型システムは...」とか、
「RDBの動的型が云々...」って事を無意識に考えてしまって、結構ハマるんだよね。
そーゆー意味で、関数言語関係者を招聘したMS Researchの今後に期待
>>270 というわけでこのスレでは Simon P.J. 先生を「サイモン博士」と
呼ぶことを漏れは提案したいっすけど駄目っすか?
273 :
デフォルトの名無しさん:02/06/26 00:42
Haskellは東大工学部の一部でデフォルトの授業用言語になってて、
そのせいで全国の工学部(の一部)の授業に拡散・伝染してるから、
1000部ぐらいすぐに出ると思ってたんだが、どうよ?
女装じゃ無理かもしれんが…(それとも女装のほうががいけるか!?)
女装って何のこと?
「 Haskell を 1.25 倍使うコピー本」でどうだ。
売り子が女装でなくてじょせーだと嬉しい、ってオイ>漏れ
>>273 うちのことだな>東大工学部の一部
講義で教えてもらうまで名前も知らなかった。
日本語の解説書さえあれば使いたい言語なのだが>Haskell
277 :
デフォルトの名無しさん:02/06/26 20:52
>>276 みんなそんなもんか。
私は大堀先生に感化されてML使ってる。
うん、嬉しい。
出来ればレイヤーさんきぼ。
280 :
デフォルトの名無しさん:02/06/27 22:54
最近のCPUは、条件分岐がたくさんあると頻繁に
分岐予測ミスが発生してストールであぼーんな訳ですが、
関数型言語って手続き型に比べてその辺どうなの?
ガードの存在って影響ある?
CMOVccとかSETccとか使ってくれるのかな。
>>280 予測が当たりまくるタイプの条件分岐なら、
問題無いという話を,漏れは聞いたことがある.
で,外れまくってイヤソなタイプのコードもあって,
例えばブレゼンハムのアルゴリズムは,結構イヤソだ,
という報告も聞いたことがある.
漏れの直感ではイヤソなタイプという気がする.
GHC はバージョンupが烈しいんで,最近の奴は
自分にはようわからん.ココは Haskell 板なんで
Haskell の話と思ったが,もしかして strict な
奴の話も必要 ?
282 :
デフォルトの名無しさん:02/06/29 17:29
>>280 SETccって何?
判定と分岐を分離して、間に命令をはさむDeleySlotの一種のような
ものと勝手に想像したがどう?
283 :
Super Combinator:02/07/01 00:39
SETcc: 条件付き定義命令。
CMOVcc: 条件付き移動命令。
if (条件)
var = X;
} else {
var = Y;
}
を
var = Y;
if (条件) var = X; // SETcc or CMOVcc
に。
もちろんvarはregister割り当てされてるのな。
284 :
デフォルトの名無しさん:02/07/01 02:19
ARMとかに最初っからついてるやつですな。
x86にも最近のはついてるときいて感心した私。
っていうか、関数型言語って naiveな実装だと closure作りまくりで
予測分岐も糞もない、って気がするんだけどだめ?
ちゃんとかりかり tuning する、GHCみたいのだといいかんじになるのかも
しれないけど。よくわからん。
結論: 関数型言語は dataflow machineに実装しよう(ネタ)
285 :
デフォルトの名無しさん:02/07/01 07:52
>>284 ネタとは言い切れん。
いい加減に今のアーキテクチャでのクロック向上ってのも物理的限界が
見えてきたしね。
>>285 そうだそうだ。(煽)
ついでに非同期って正義 ?
Crusoe の内部論理では活かされてるとか
聞いたことがあるけど > 非同期
287 :
デフォルトの名無しさん:02/07/11 09:01
288 :
デフォルトの名無しさん:02/07/11 09:14
GHC 5.04 がリリースされました。
290 :
デフォルトの名無しさん:02/07/12 01:40
さっそくビルド、あげ!
291 :
デフォルトの名無しさん:02/07/16 00:36
292 :
デフォルトの名無しさん:02/07/16 03:03
っていうか、まずその紹介されてる論文の、その章を見れば良いじゃん。(^^;
そしたら、そこからreferされてる論文を次に読むとか…
(citeseerがOKなら英語でOKだよね。)
とりあえず、すでにHaskellを知ってるなら、Cleanって言語の
uniqueness typingって仕組みを使ってみるのが吉かと。
http://www.cs.kun.nl/~clean/で合ってる?>もっと詳しい人
293 :
デフォルトの名無しさん:02/07/16 10:17
linear logic (線形論理) ね。
論理にヨワい自分は岩波の 2 冊本
「コンピュータサイエンス入門」
で、やっとこ様相論理に辿り付いたトコなんで
有意義な助言はできんが...
とりあえずロジックに関してどれくらいわかってます ?
>>291
296 :
デフォルトの名無しさん:02/07/16 22:58
どうして、そんなに遅いの?
>>296 それは言える…
CleanとかMLとかは速いらしいのに!
Haskellは生成されたバイナリよりも、
コンパイラ自体がhaskellで書かれてる
ことによる遅さがちょっとイラつかせる。
また勉強中の身だから偉そうなことは
いえないですね。失礼しました。
Cleanもそうです。
沢山のレスありがとうございます。
>>292 英語は、辞書が在れば何とか読めるという程度です。
「uniqueness typing」ですか。Cleanの特徴の一つらしいですね。
評価するたびに違う(多様?)型を生成するというぐらいしか知りません。
参照透明性は確保されそうですが、使いやすいの?
というぐらいの認識しかありません。もう少し調べてみます。
>>293 私も論理に弱いです。
Linear Ligicと言われても、使った公理は無くなる。
つまり公理の有る無しで状態を表すようにするという位しか
わかっていません。
この認識も間違っているかもしれませんし・・・
つたない英語力と乏しい知識を総動員して何か判りやすい文章、本、論文
は無いかとあさっているという状態です。
>岩波の 2 冊本「コンピュータサイエンス入門」
ですか今度、大きい本屋に行ったときでも見てみます。
>>294 日本でも沢山の所が研究しているんですねー。
みてみます。
>>297 >CleanとかMLとかは速いらしいのに!
non-strict な ML と、strict な Haskell を
比較すんなよ (;_;) せめて LazyML とか
>>301 >岩波のそれは時相論理という論理の解説がメイン。
そうなんですか。買おうかな。
>IPSJ の学会誌とか研究報告が見れるんなら↓あたりが手頃そうだ。
学術誌は・・・。大学生のころは読めたのにね。
地元の大学言ってみような?如何しようかな?
> non-strict な ML と、strict な Haskell を
逆
なんでいつもMLとHaskellはいがみあるばかりなんですか?
CとC++
JavaとC#
PerlとRuby
他にもそういうの多いですがね。
>>305 トチった。シクシク
>>306 別に、いがみあう必要ないじゃん。Standard ML では、
引数は適用される前に評価される、Haskell では、
普通はそうじゃない、ってダケの話。
他のヤツだって。.NET 使いたいなら C# 、
ケータイ用アプレットが作りたいなら Java とか、
現実、選択肢は広く持っていたほうが楽しいん
だからさ。
Haskellってnamespace無いの?
>310
あ、ほんとだ。サンクスコ
312 :
デフォルトの名無しさん:02/07/19 01:13
>>308 SMLでも遅延評価でますよね。
Hsakellほど積極的では無いですが。
>JavaとC#
>PerlとRuby
この変は似たもの同士だからだろ?
哲学板「論理なぜなにスレッド」の最後のレス
http://mentai.2ch.net/philo/kako/996/996975732.html 114 名前: 考える名無しさん 投稿日: 02/03/08 02:04
「論理学」スレの過去ログから。
229 名前: 考える名無しさん 投稿日: 01/12/10 18:21
論理学の基本的教科書とは何ですか?
様相論理とか線形論理を一通り学びたいのですが。
英語のものでいいものを教えてください。
230 名前: ↑ 投稿日: 01/12/10 18:39
A.S. Troelstra, Lectures Linear Logic, CSLI Lecture Notes 29 (1991)
線形論理の入門書で、線形論理のゼロからを勉強できる本です。線形論理導入のモチベーシ
ョンから始まって、様々なヴァリエーションの線形論理とそれらの性質、代数的、圏論的モデル、
proofnetと、基本的な部分はかなり幅広くおさえてあり、そしてとても解りやすいです。しかも周辺
のトピックも広く紹介されているので、その辺を調べながら読めば、線形論理に限らず、証明論
の勉強になるのではないか、と思います。ただし、大きな問題は、GirardによるLinear Logicのオ
リジナル論文(その他、その後のLinear Logic関係のあらゆる論文)と記法が紛らわしい、というこ
と。嫌でも混同しやすいLinear Logicの記号なのに、同じ記号を別の意味で読み替えたりしなけ
ればならず、かなり厄介ですので、それは覚悟の上でどうぞ。
231 名前: ↑訂正 投稿日: 01/12/10 18:43
A.S. Troelstra, Lectures on Linear Logic, CSLI Lecture Notes 29 (1991)
http://www.amazon.co.jp/exec/obidos/ASIN/0937073784/
おひさしぶりの291です。
私にとって言語(英語)の壁は厚いので
そんな立派な本は、ちょっと・・・
という感じです。
とりあえず「コンピュータサイエンス入門」と「線型論理入門」は買いました。
ゆっくり勉強したいと思います。
317 :
デフォルトの名無しさん:02/07/21 13:30
あーまてまて。^^; 最終目的にもよるが、linear typeの勉強をするのに、
linear logicの教科書まで読破する必要はないべ。(してもいいけど)
俺もlogicのほうは耳学問程度だが、linear typeのほうは
関連する研究で論文を発表できたぐらいには理解してる…つもり。
それよりもプログラム理論のお勉強のほうが重要かも。大堀先生の
「プログラミング言語の基礎理論」って教科書なんかどうだ。
線形型までいってないけど、それ以前に線形でない普通の型の理論を
理解しないと。
本を読むにしても、何も予備知識がないときついだろうから、以下で概説。
もし説明が下手で余計に混乱させちゃったらスマソ
HaskellとかMLとか使ってれば、普通の型は知ってることにしていいよな。
言語によっていろいろと書き方は違うが、たとえばintだったら整数だし、
floatやrealだったら浮動小数だし、int -> floatだったら
整数から浮動小数への関数だし、int * floatとか(int, float)とかは
整数と浮動小数の組だし、要するに値を分類してるわけだ。
で、線形型ってのは普通の値の分類をもっと細かくして、
その値を使う「回数」の情報まで付け加えた型なんだ。
テキストだと書きづらいが、int ->1 floatとか
int ->0 floatとかint ->ω floatとか。
それぞれ、「1回だけ呼び出される関数」「決して呼び出されない関数」
「何回でも呼び出させる関数」の型。
で、そんなのが何の役に立つかというと、いろいろとあって
・もう「決して使わない」ことがわかった値はゴミなので、ガベコレできる
・式の遅延評価をするときに、「1回しか使わない」とわかっている値は
後のために覚えなくても良いので、オーバーヘッドを減らせる
・逆に「必ず1回は評価される」ことがわかってる式は、そもそも
遅延評価しなくて良いので、やっぱりオーバーヘッドを減らせる
・同じように、「必ず1回は実行される」ことがわかってる副作用は、
(Haskellのモナドみたく)遅延しなくても良いので、MLみたく
その場で直ちに実行できる(?)
って感じ。最後のは俺がよく知らないので、Cleanとかに詳しい人がいたら
フォローをきぼんぬ。
最後にlogicとの関係だが、linear logicっていう「命題を使える回数」も
考慮した論理があって、linear typeも元々はそこから派生したそうな。
どんな論理かというと、よくある説明なんだが、
命題P = 「あなたは120円を持っている」
命題Q = 「コーラを買える」
命題R = 「お茶を買える」
とおいて、Pと「PならばQ」と「PならばR」の3つが成り立っているとする。
すると、普通の論理ならPを2回ほど使って「QかつR」を結論できてしまうわけだが、
120円でコーラとお茶の両方が買えるってのはおかしいよな。
だから、そういう「使ったらなくなる」ものを考えに入れて、
「命題Pは一回しか使えない」みたいな性質も考慮できるようにした論理が
linear logicというわけだ。上の例だと、Qを結論することはできるし、
それとは別個にRを結論することもできるが、「QかつR」を同時に
結論することはできない。
と、これぐらい知っていれば、後はCleanを使ってみるなり、
上のほうのWadlerのチュートリアルを読んでみるのが
(linear logicの教科書を読破するよりは)手っ取り早いと
思うんだが、どう? もちろん、特定の目的じゃなくて
一般教養としてなら、linear logicの勉強もいいかもしれないけど。
もし英語が苦手だと最初は大変かもしれんが、この手の
(わりと)新しい話を少しでも突っ込んで調べようと思ったら、
何でも英語は避けて通れないと思われ。っていうか、下手な
日本語の解説よりも、上手な英語の説明のほうがわかりやすいかと。
323 :
Super Combinator:02/07/21 15:24
andとorに分配法則が成り立つのと成り立たないのと二種類ある、
それがlinear logic。
>>321みたいなのを特にresource logicと呼ぶことがある。
ええと、323さんはなんでそんな風に思った?^^;
嘘を教わっているか、思い違いをしてそうなので、
例のInformation & Computationをのっとった、Girardの
オリジナルの論文を読むと吉かと思われ。
Girardの「しゃべる」英語は激しいフランス訛りで、
発表を聞いてても個人的に話をしても言ってることが
すげーわかりにくいが(笑)、上の論文はわりとわかりやすい。
誤: Information and Computation
正: Theoretical Computer Science
どうも291です。
みなさんの親切なレスが貰えてうれしいです。
>>319 論文読んでもlinear typeの構造が判ったような気がするというレベル
で止まっていました。なるほど。
linear type関連の論文て意外と少ないような気がしたので、そのバックにある
linear logicを勉強すればlinear typeのことが判るかな?という安易な動機しか
なんですけどね。
でも記号の操作のしかた忘れたなー。完璧に。
あとCleanですか?Downはしてますけど、使ったとき無いです。
うーんCleanも勉強すべきなのかな?
>大堀先生の「プログラミング言語の基礎理論」
この本は持っています。
読んでいますし、3割ぐらいは理解しているつもりです。
型推論も基礎となるアイデアも理解しているつもりです。
>上のほうのWadlerのチュートリアルを読んでみるのが
「Linear types can change the World!」は読んでいます
(20ページ程度の文書なら、英語でも読む気がするんですがね。)
でも、この論文は、317さんの解説のやつとは少し違うかな?
あ、論理カゼを吹かせてしまったのは自分だ。スマソ m(_ _)m
Wadler の解説に目を通してみました。World 型の
ような、捨てたり複製しちゃいけないとかいう値を
導入するための仕掛けが線形型ってことですね。
monad の解説 "Imperative functional programming"
の 4 節にある、評価順序を保証するためだけにある、
受け渡されるだけで値は運ばない変数 w を表面に
引っ張り出して活用する、という感じなのでしょうか。
↑これは激しく勘違いかも。
上の
>>319 で説明されてるところは、Haskellコンパイラ
方面で研究されてる必須性解析やら更新回避解析やらを
プログラマが明示できる/しないといけない、と感じたん
ですが、どうでしょうか。
藁藁
>>329のサイト、ブラウザで画像もJavaScriptもOFFにしてたら、トップページから中に入れない。
しかたないからHTMLソース見てみたら…
><!--
>こういっちゃなんだけど、人のページのソースを見るのはどうかと思いますよ。
>そういう人は今後このサイトには来ないようにして下さい。ええ。
>-->
コワイヨー
あ、上の書き込みだけだと中傷にしか見えませんね。スマソ。
初心者の僕にはとても勉強になりました。つーか、大堀先生の本が読めなくて
ちょっとへこんでたんですけど、書評読んだらすこし元気が出てきました。
がんばるぞー。
>>333 わかんなければソース見てもいいと思うぞ。勉強になる。
あっちが見られる様な媒体で見られたくないものを置いている方が悪いんだから。
スゲ〜
二度と見に行くかよ、と思わせるためにやってるとすれば、
とっても効果的だ。
338 :
デフォルトの名無しさん:02/07/27 00:49
age toku yo
<!--
すぐに出せるようにと思ったんで、
今後の更新予定とかをコメントでつけてましたが、
それらは全部削除しました。
まあ確かにそんなものをつけるべきではないのかもしれませんね。
-->
コメント変わった?
ここ読んでる?
340 :
デフォルトの名無しさん:02/07/27 01:35
>>329 の書き込みは要するに自作自演書き込みって事でしょ。
341 :
デフォルトの名無しさん:02/07/27 01:35
世間が狭いだけでは
>>339 削除した理由が、
「まあ確かにそんなものをつけるべきではないのかもしれませんね。」
誰かに注意を受けたと取るのが一番か。
343 :
デフォルトの名無しさん:02/07/27 09:34
書評も的を射ていないっぽ
スレ違い。
345 :
デフォルトの名無しさん:02/07/27 18:13
CLEANを紹介したのはエライが、
自作自演とか、偉そうにWeb作ってるのはイクナイ。
なぜ自作自演?
とか書くと、これも自作自演と勘違いされるのだろうか?
>偉そうにWeb作ってるのはイクナイ
作っている分だけ偉いです。
ヒガミはイケナイネ。
347 :
デフォルトの名無しさん:02/07/28 08:06
Cleanのページ作ってる奴はここを読んでるやうだな。
Cleanってば名前しか知らなかったので、ページ作ってくれたのは非常に
よろしいと思う。イイ。
だけど、自分の理解が怪しいこととかまで、無理して書いてないかの?
斜めにしか読んでないが、なんか外してるところがある気がちょっとする。
>>339とかもどうかと思われ。
348 :
デフォルトの名無しさん:02/07/28 08:29
Haskellの話をしよ〜ぜ。
349 :
デフォルトの名無しさん:02/07/29 00:25
Haskell がメインの開発言語になってる会社ってありますか?
350 :
デフォルトの名無しさん:02/07/29 08:46
もし、今後 Haskell 本とか書くヒトが居たら、是非
「本書の内容の正否・当否についての質問・意見は、明確で
具体的な理由をつけて、匿名ではなく、
[email protected] まで
お願いします。また、これら以外のことに関する本書への
批判・評論は刑法230条又は231条等に触れる恐れがあり
ますのであくまでも自己責任でお願い致します。」
とでも、表 2 カバー裏あたりに書いとけば良いかも :-)
352 :
デフォルトの名無しさん:02/07/29 10:38
>>351 なんだそれは。
Cleanのページ作った人ですか?
突っ込まれたから、ぼやいている?
Haskellのページとかschemeのページは前からあるけど、
だれも苦情は言わないし、ありがとうしか言わない・・ですが?
「本書の内容の正否・当否についての質問・意見は、明確で
具体的な理由をつけて、匿名ではなく、
[email protected] まで
お願いします。また、これら以外のことに関する著作者への
批判・評論は刑法230条又は231条等に触れる恐れがあり
ますのであくまでも自己責任でお願い致します。」
こうだな、正確には。
>>351 バイアスかけるのは止めてね
Haskellのスレだし。
355 :
デフォルトの名無しさん:02/07/29 11:30
356 :
デフォルトの名無しさん:02/07/29 13:33
357 :
デフォルトの名無しさん:02/07/29 17:34
Haskeルン
ああ、DUAL!ってやつ?
?
>>352 ぼやきか・・・
それはもしかしたらイタイ発言ではなかろうか
なんか俺のカキコのせいで荒らされちゃってますね、スレの皆さんごめんなさい。
もう夏休みに入ってるって事をすっかり忘れてました。
>>362 ハー。
人の振り見て・・・ということで。
Haskell 98 Report が本になるみたいですね。
じゃ、誰かものすごい勢いで日本語版も
出版してくれよな。
368 :
デフォルトの名無しさん:02/08/03 08:55
気づいたら最初のスレが立ってから一年過ぎてる。
最初のころはHaskellスレ限定コテハンも何人かいて妙にまたーりとしていた
気がするのだが、最近廃れっぷりが激しいな。最初のころのような勢いも無いし。
懐 古 う ざ い
よね。
すまん。逝ってくる。
ネタがないんじゃよー
誰かお遊びで作ったプログラムとか貼ってくれませんか?
370 :
デフォルトの名無しさん:02/08/03 15:03
関数型言語初心者です。
Haskellでクイックソートのコードを以前見かけて、こんなにシンプルになるのかと感動しました。
では、バブルソート(二重for文で大小比較の単純なやつ)はどうなるのでしょうか。
iとjを引数にして二重に再帰を繰り返し、takeやdropで切り貼りするしか無いのでしょうか?
もっと効率のいいやり方があるのでは、と思うのですが…
>>370 それらしいものを書いてみようとしたら
選択ソートとバブルソートが混ざったような中途半端なものになった。
bubbleSort :: Ord a => [a] -> [a]
bubbleSort xs = bs xs []
bs [] _ = []
bs [x] rest = x : bs rest []
bs (x1:x2:xs) rest = bs (min x1 x2 : xs) (max x1 x2 : rest)
つか効率を気にすればするほど選択ソートっぽくなると思う。
372 :
デフォルトの名無しさん:02/08/04 05:20
このスレってほとんどコード出てきてないのな。
Haskellは犬ですか?
Haskellerと言ってもその程度。
何故
>>371でソートになるのか悩んで、紙に書いてようやく理解しました。
最小値を取り出して、それを x : bs rest [] で先頭に結合しているわけですか。
bs xs i j なんて関数を作って手続き型そのままにやろうとした俺とはえらい違いです。敬服。
数日間が空いてはっと気付く…
>>371のコードですと、要素数に比例してスタックを消費してしまいませんか?
(半端な知識ですが、末尾再帰になってなく見えます。書き直せないところが厨ですが…)
関数型言語の場合、スタック消費は気にしない方がいいのでしょうか。
377 :
デフォルトの名無しさん:02/08/10 10:05
>>376 関数型言語では基本データ構造のリストが再帰的(末尾再帰ではない)に
定義されているわけで、そもそもスタックを消費しまくることを前提に
作られているでしょうから、スタックの消費をあまり気にしなくていい言語と
して使えるはず。
Haskell のような遅延評価が基本の言語では、自然な再帰のアルゴリズムの
プログラムを、末尾再帰のアルゴリズムのプログラムに書き換えることも、
計算のオーダーが変わるようなもの以外は、あまり、気にすることはない
気がします。
378 :
デフォルトの名無しさん:02/08/10 11:42
よく関数型言語で Xs, とかYsってvariableなんだけど、なんでXsなの?
この最後のSはどっからでてきたの?X,Y,Z,W,Vとかでいいじゃん。
Sなんてつけなくても
x:xs
複数形のsです。
380 :
日曜Haskellerオヤジ:02/08/11 06:22
ものすごい久々です、
現在はプログラミング基礎論の勉強がてら一緒に Haskell もお勉強モードな土日です。
>>368 特に初心者がやるときには、英語を勉強しつつ Haskell の勉強もしようとすると
忙しくなりすぎて、とりわけ社会人だと極度のんびり勉強モードになってしまいます。
そうすると、どうしてもネタが尽き気味になりますよね、
和書の入門書がぜひとも欲しいところです。
大学院の学生さんたちの誰かが執筆してくれればいいんですが、だれか書きませんかね?
Haskell は離散数学とか圏論とかとセットにすると非常に面白い本ができると思うのですがどうでしょう?
あと、圏論の専門本も是非とも欲しいところですね、これも本当にない、
まったくと言って良いほど本がない、あっても絶版ばかりで手に入りません。
シュプリンガーフェアラーク出版の「代数学とは何か」に書かれてあるのが、
手に入りかつ、知っている範囲なのですが、
これは数学の専門書でプログラマには少々というかかなりの難解ぶりです。
自分がなんとか読めそうと感じられる範囲では、
ここ
http://www.etl.go.jp/etl/divisions/~yoshiki/ut97/ にあるんですが、これも内容を充実して製本された本が欲しいところです。
初心者向きといえば、以前工科大のページがあったんですが
消滅してしまっているようです、越田センセまた何かページつくってくれないかな・・
381 :
デフォルトの名無しさん:02/08/11 07:14
プログラムはじめてやるのにラムダカルキュラスは難しすぎる
====================================================================
すみません。初心者なのですがこんな質問に誰か答えていただけるのでしょうか?
function type は
[Key] -> [Token] -> [(Field, Value)]
type Token = String
type Field = String
type Value = String
type Key = String
Key で Token を検索して、結果があればFieldとValueでOutput すると言う
ファンクションです。例えば、
[key] = ["Name","Title","Address"]
[Token]="Name",":","Yamada","Taroh",";","Title",":","Mr",";","Address",":","Tokyo","Shinjuku",";"]
output
[("Name","Yamada Taroh"),("Title","Mr"),("Address","Tokyo Shinjuku")]
になります。
TokenのArrayの中で、Fieldのあとは必ず ':', Valueのあとは ';'
になってます。それと、outputのfieldは単語ごとにスペースでくぎられた1つのstringになります。
誰か、アイデアでもいいので下さい。
すみません何分初心者なもので。 レスお待ちしてます。
=======================================================================
384 :
デフォルトの名無しさん:02/08/20 08:36
>>383 その区切り線には宗教的意味か何かでもあるのか?
Haskellって、
学校の授業でどのくらい使われてるの?
387 :
日曜Haskellerオヤジ:02/08/20 12:50
宿題だとすると・・・そのまま答えを書いたらまずいかな(笑
私だったらこんな感じで作りますかね。
見ているとスペースのところで文字列が切断されていて非常に感じが悪いのでそれをまず結合します。
つづいてこの文字列リストから ":" , ";" を取り除いて出来上がり
388 :
日曜Haskellerオヤジ:02/08/20 12:52
おまけ
結合すべき文字列は直後が ";" ":" でないことに着目すると簡単に作れるでしょう。
「Haskell言語プログラミングレッスン <上> Haskell言語を始めよう」
「Haskell言語プログラミングレッスン <下> 関数型言語を始めよう」
出版準備です。
出版準備?大丈夫かよオイ
ネタだろ…
392 :
日曜Haskellerオヤジ :02/08/20 13:11
よく見てみると、単に複数文字列があるだけじゃなくて、
レコードみたいになっていますね ';' ':' ブラウザはの見分けがつかない
間違っているので上記2レスは無しということでお願いします
';' でいったん文字列リストのそのまたリストに分解して
先頭を順序対の左
上記を取り除いた上での、先頭と末尾を取り除いた文字列の結合を右の順序対として
リストを作ればよいみたいですね。
393 :
日曜Haskellerオヤジ:02/08/20 13:25
>>389 本当ならうれしいですね、ちょっと作ってみましょう、しばらくかかります。
394 :
デフォルトの名無しさん:02/08/20 13:27
個人的には関数の型が気にいらんな。
type Assoc = [(Field, Value)]
lookupAssoc :: [Key] -> Assoc -> Assoc
をつくれ、としたほうが抽象化のレベルがあうのでないか。まあ、
parseAssoc :: [Token] -> Assoc
をつくって
lookupTokens :: [Key] -> [Token] -> [(Field, Value)]
lookupTokens keys tokens = lookupAssoc keys (parseAssoc tokens)
とすれば元の題意にはあうだろうが。
396 :
日曜Haskellerオヤジ:02/08/20 15:52
関数型言語の素人のコードなので変かも知れませんが大体こんな感じになります。
本できたら、このスレッドに報告してくださいね、買います。
type Token = String
type Key = String
type Field = String
type Value = String
hoge_key = [ "Name" , "Title" , "Address" ]
hoge_token = [ "Name" , ":" , "Yamada" , "Taroh" , ";" , "Title" , ":" , "Mr" , ";" , "Address" , ":" , "Tokyo" , "Shinjuku" , ";" ]
-- ここが本体
func :: [Key] -> [Token] -> [(Field, Value)]
func k t = receive [] t
where
receive xcomplete remain
| remain == [] = xcomplete -- 全部完了
| nokey = receive xcomplete raw_recs -- キー無し
| otherwise = receive (rec:xcomplete) raw_recs -- 成功
where
-- 先頭レコードのその以外のレコードの定義
( raw_rec , raw_recs ) = sprit_records remain
-- キーと ':' と結合前の値のリスト定義
-- 必要ならコロンのチェックをすること
( key : ( colon : value_token ) ) = raw_rec
-- キーがあるかどうかの定義
nokey = (has_member k key) == False
-- 値の定義
value = cat_value value_token
-- 整形済みレコード
rec = ( key , value )
397 :
日曜Haskellerオヤジ:02/08/20 15:53
続きです
-- トークン分解と ';' の取り除き
-- 末尾 ';' チェックはしていないので必要なら無限再帰防止策をとること
sprit_records :: [Token] -> ( [Token] , [Token] )
sprit_records token = receive ( [] , token )
where
receive ( x , (y:ys) )
| y == ";" = ( x , ys )
| otherwise = receive ( x ++ [y] , ys )
-- 空白を入れながら文字列の結合をする
cat_value (x:xs) = receive x xs
where
receive complete remain
| remain == [] = complete
| otherwise = receive ( complete ++ " " ++ x ) xs
where
(x:xs) = remain
-- キー名があるかどうかチェック
has_member (key:keys) x
| x == key = True
| keys /= [] = has_member keys x
| otherwise = False
日曜Haskellerオヤジさん ありがとうございます。
なんか、本を出すことで盛り上がってるみたいなのですが。。
すみません、>389 は私ではないです。誰かがネタでやったみたいです。
なのに、期待して答えて頂いて感謝してます。
それと、すぐ宿題ってばれましたね(苦笑)。事実、海外でITを勉強してる学生です。
これはアサイメントで来週提出で7問中、1問だけとけてる状態です。そして、苦肉の策で
このスレに質問をしてみました。そして、みなさんにヒントを頂き感謝してます。
みなさんはかなりの知識をお持ちのようで、私なんてJAVAの教科は自分では得意だと
思ってやってましたが、haskelになると途端にややこしくなり、自分の頭の悪さを、思い知らされてます。
数学の知識がさらに必要となってきてますね。
日曜Haskellerオヤジ さん、参考になりました。ありがとうございます。
ついでにこのアサイメントの全容を貼っときました。(期待しつつ)。自分でやるつもりです。
海外は教科をパスするのがきついですね。
http://www7.big.or.jp/~mb2/bbs/up/img-box/img20020820192929.zip また、質問があればさせていただいていいですか?
お礼のレス遅れてしまってすみません。なんか、私の使ってるプロバ、規制されてるんです。うー
だから、友人にメールで送って、それからレスしてもらってるので。すみません。荒らしではないですよ。
日曜オヤジさん、カコ(・∀・)イイ!!
400 :
デフォルトの名無しさん:02/08/21 09:00
>>383 hogehoge ks ts
= filter (\ (k,v) -> elem k ks) $ map hogera $ hoge ts
where
hoge [] = []
hoge ts = case break (";" ==) ts of
(_,[]) -> [ts]
(xs,_:ys) -> xs : hoge ys
hogera ls = case break (":" ==) ls of
(_,[]) -> (unwords ls, "")
(x,_:y) -> (unwords x, unwords y)
401 :
デフォルトの名無しさん:02/08/21 09:02
uge
402 :
日曜Haskellerオヤジ:02/08/21 22:12
>すみません、>389 は私ではないです。誰かがネタでやったみたいです。
やっぱりそうか(笑)
関数型は脳の回路がスイッチしないとやっぱり大変です、
普段の仕事では普通の言語を使っているので、土日に関数型に切り替えると毎週のように戸惑います。
JAVA 等で使われているオブジェクト指向的な考え方が頭の中に残っているとうまく組めません。
関数型プログラムのコツは写像を追うことと、
自分が欲しい結果を細部に分解しながら欲しいものを定義してゆくことだと思います。
しかし、これは考えても無駄で、なれるしかないです
>また、質問があればさせていただいていいですか?
どうぞ、このスレッドは最近ずっと寂れていたようですし、私が答えなくても
だれかが答えてくれると思いますし、私も書いてみます。
#ダウンロードしようと思いましたが、ファイルはもうアップローダーに残っていないみたいです。
まずfという関数があり、それはトークンの列を受け取って題意の処理を行うと仮定します。
1. 次の関数
g v [v1, ..., vn,":"]++xs=(v++" "++v1++" "++...++" "++vn,f xs)
を作りましょう。
2. gを使って関数fを定義します。関数fは、もしnがリストkに現れていたら
f [n,";",v1, ..., vn,":"]++xs = (n,v1++" "++...++" "++vn):f xs
そうじゃなかったらf xsを返します。fの定義はkのスコープの中で行われるものとします。
3. 最後に二つの関数をまとめてansを作りましょう。ansはキーのリストとトークンのリストをとり、
f,gを内部で定義してfにトークンのリストを渡します。
宿題の答えを書くのもアレなので、こういうかたちにしてみました。
>>403 > 2. gを使って関数fを定義します。関数fは、もしnがリストkに現れていたら
2. gを使って関数fを定義します。関数fは、もしnがキーのリストkに現れていたら
でした。舌足らずですた。
東大の「こ・何とか」って人は何人?
nisseicom.co.jp
>>403 ん、お盆休み明けてのぞいてみれば、だれもレスを付けていないのか・・・
今週末ちょっと考えて見ます。
408 :
日曜Haskellerオヤジ:02/08/31 17:37
やっと週末、必死こいて圏論勉強中の日曜Haskellerオヤジです。
ちょっと読んでみたんですが、正直題意が良くわからなかったです。
これはレスつけられないのでは、と思いました。
出題は、宿題のパターンでよいとは思います。ただし、宿題は自分の良心で自分でやりましょうね。(笑
ちなみに、引数に使ったラベルに意味説明を入れたほうが良いと思います。
いきなり v とか v1 とかで説明されてもわかりにくいです。
v1 v2 ... は入力トークンで、末尾は ":" です、
そのリストを [v1 , ... vn , ":" ] とします。
みたいな感じで書いた方がよいのではないかと感じました。
v はキー・・・・なんでしょうか?
あと、2については、 f の中に g が見当たりません。
( v ++ " "++v1++" "++...++" "++vn,f xs) = (n,v1++" "++...++" "++vn)
なんでしょうか?
409 :
デフォルトの名無しさん:02/08/31 17:43
正直ハスケルってどこで使うの?別に煽りじゃなくて、
どういうところで使われてるか不思議で。shcemeとかは
dr schemeのチュートリアルで結構仕事があるみたいなことを
書いてあったけど。
413 :
デフォルトの名無しさん:02/09/07 12:42
http://www.sampou.org/nobsun/journal/?0320 そこでいう setter って x {foo = "chample"} みたいなのじゃないんすか?
data Foo = Coo { foo :: String, bar :: Integer} deriving Show
x = Coo { foo = "sample", bar = 12345 } -- 初期化
main = print x >> print (x {foo = "chample"})
と、こんなところで半年近くも前の話に質問をしてみるテスト。
414 :
デフォルトの名無しさん:02/09/07 13:11
416 :
デフォルトの名無しさん:02/09/07 23:10
おまえがやって見ろよ
>>416 大して戦果をあげれないと思う。入出力とか弱いし。
Haskell 向きなのを何か考えればアレかもしれんが。
モナドパーサ
7行プログラミングってPerlが一番凄そう。
むしろperlはそのための言語。
>>408 久しぶりにこのスレ覗いてみたら寂れてますねー.
コンピュータサイエンス向けの日本語の易しい圏論の本って需要あるのかな?
424 :
日曜Haskellerオヤジ:02/09/30 14:31
そーですねー、淋しいです。
>コンピュータサイエンス向けの日本語の易しい圏論の本って需要あるのかな?
取り合えず私にはあります、だれか作ってー
離散数学に興味を持ったところ、そのまま勢いでこれも面白くなってきています。
もっとも、一般位相はしらないわ、集合論はしらないわで大変ですが・・・
Haskell という言語はこういうものを勉強するときに便利ですね。
>>423 なぜコンピュータサイエンスに圏論なのか、圏論を勉強すると
プログラムを作成するにあたりどんな嬉しいことがあるのか、
などについて序章あたりに書かれているような本だったら買いたいです。
英語で書かれたのを1冊持っていますが、なかなか読み進めません。
ありがたみを実感できる章にたどり着けばはずみがつくと思うのですが・・。
427 :
デフォルトの名無しさん:02/09/30 22:58
>>426 その本とはなんでしょう?
さしつかえなければ教えてください。
428 :
デフォルトの名無しさん:02/09/30 23:17
圏論ですか、下の本で見たときがあります。
情報数学講座7 プログラム意味論 横内寛文 共立出版 1994.6
それにしてもプログラミング処理系は、実用的にするため色々な拡張が施され
ています。そのため純粋な数学との間には大きな溝が出来てしまってい
るような気がします。
これが圏論だっていうコードを見れば
分かるようになるかも。
Frege構造って何?
>>427 Bird & de Moor の "Algebra of Programming" です。
コンピュータサイエンスの場合,圏論の代数的な面を強く出すよりは
論理や型理論と一緒にやる方がいいと思いますが(代数は等式論理なので)
どうやって動機付けするのがいいのかな.
圏論には多分
- プログラムの意味論を厳密に議論するための言葉を提供してくれる
- 様々なプログラミングのメタファーを提供してくれる
という二つの面があると思いますが,お互いに依存しあっているので
最後まで引っ張っていく書き方というのは結構challengingかも.
きちんと書くと今度は厚くなりそうだし.
>>431 たしかallegoryとか使っているやつですか?
>>433 はい、そうです。
>>きちんと書くと今度は厚くなりそうだし.
執筆する側としては厚い本を書くのは大変だと思いますが、
読む側としては多少厚くても難解な薄い本よりはずっと
ありがたいです。もっとも、431の本をなかなか読み進めない
一番の理由は十分な間を取れていないからで、難解とか言う
以前の問題です。
435 :
デフォルトの名無しさん:02/10/02 22:17
>>432 というような会話を、約10年程前にしてたんですけど、
相変わらずそのスジでは必須科目(wなのですか?
436 :
デフォルトの名無しさん:02/10/02 22:34
多分、答えないと思うけど(w
437 :
日曜Haskellerオヤジ:02/10/04 00:02
>>429 圏論というのは、集合論の代わりになるもので、集合論が「要素」の論理
であるのに対して、圏論は「要素」と「要素」の間の関係の論理です。
集合論を置き換える為の物のようです。( 多分(^^; )
圏論って定義は分るんですけれど、その意味しているところは難解です、いまだに分りません。
しかも定義も注意深く定義を読まないと、いきなり変なところにはまり込んでしまいます。
私は ob(C) が「点」とか書かれていて最初こんがらがっていました。
ついでに射も最初はこんがらがってました。
#といいますか、全部だ・・・
もし分らないのが圏論の定義なら
しょうもない集合でいいので一個具体的に作ってみると少しづつ分ってきます。
たとえば { {false,true} , {0,1} } = ob(C) から出発して
全部作ってみるといいですよ。
#ちかごの感じるんですが
# 圏論 : 関数型
# 集合 : オブジェクト指向
#「点」が中心の時がよいのか「射」が中心の時がよいのか
#時々強烈に的確に記述できる関数型の特徴の正体が見えたような見えないような・・・
438 :
デフォルトの名無しさん:02/10/04 02:09
わたしの、数学から見たイメージでは、
集合論:構成的(実装を扱う)
圏論:公理的(インターフェースを扱う)
射の位相空間での実装は連続写像、群での実装は準同型写像って感じ。
インターフェースのみを使って記述すれば、そのインターフェースを
持っているどんな実装でも成り立つものを作ることができる。
また、インターフェースを前に出すことで、性質を明確に記述でき、
性質の比較ができる。
などのことが、圏論のメリットと感じます。
コンピュータサイエンスで圏論がどう使われているのかは知りませんが。
いや、数学でもあまり知らないんだけど。
439 :
デフォルトの名無しさん:02/10/09 23:28
440 :
デフォルトの名無しさん:02/10/14 04:00
Hugsって、そろそろバージョンアップしたりしないのかな。
テンキーの'/'が効かないのはなぜ?
441 :
日曜Haskellerオヤジ:02/10/15 22:08
442 :
デフォルトの名無しさん:02/10/28 04:33
寝られないので今さっき勉強始めてみました、あげ
443 :
デフォルトの名無しさん:02/10/28 05:04
Haskell ?
なにそれ?
445 :
デフォルトの名無しさん:02/10/28 05:18
446 :
デフォルトの名無しさん:02/10/28 09:38
prologの方がいいよ
んなわきゃねぇ(w
越田先生のチュートリアルいいよ。
公式のドキュメント読んでもいまいちだったけど、
これ読んだらけっこうすんなり入ってきました。
東京工科の学生には負けられません。
`ってどこ?っていうのがFAQかよ(藁
pの横にあるキーボードもありますけどね。
キーマップが違っててもすぐ分かるだろ
わからんキーはかたっぱしから押してみるのが近道だろうが
最近はヘタなキー押すとサスペンドしたりユーザー切り替わったりするらすいな。
なんでこれ以上ボタン増やしたがるのかわからんよ。
あのー、スレ違いなんですけど。。。
454 :
名無しさん@Emacs:02/10/29 18:38
越田先生の
fibStep :: (Integer, Integer) -> (Integer, Integer)
fibStep (u, v) = (v, u+v)
fibPair :: Int -> (Integer, Integer)
fibPair n
| n == 0 = (0, 1)
| otherwise = fibStep (fibPair (n-1))
nacchi :: Integer -> Integer
nacchi = fst . fibPair
このnacchi関数サイコー!
ところでIntegerは最高何桁まで扱えるんでしょうか?
nacchi 10000 ぐらいまでは余裕みたいですが。
(●
(略
456 :
名無しさん@Emacs:02/10/29 20:17
越田先生の10/9の再帰的関数と組の問題を解いたのだけど、
かなり汚いです。だれかスッキリした正解を教えて下さい。
maxOccursTwo :: Int -> Int -> (Int, Int)
maxOccursTwo a b
| a > b = (a, 1)
| a == b = (a, 2)
| otherwise = (b, 1)
maxThreeAux :: Int -> (Int, Int) -> (Int, Int)
maxThreeAux a (b, c)
| a == b = (a, c + 1)
| a > b = (a, 1)
| a < b = (b, c)
maxOccursThree :: Int -> Int -> Int -> (Int, Int)
maxOccursThree a b c =
maxThreeAux a (maxOccursTwo b c)
457 :
名無しさん@Emacs:02/10/29 21:25
越田先生の10/16の「リスト」の問題なんですが、
innerfunc :: Int -> Int -> [Int]
innerfunc num op
| op == 0 = []
| num `mod` op == 0 = innerfunc num (op-1) ++ [op]
| otherwise = innerfunc num (op-1)
divisors :: Int -> [Int]
divisors num
| num <= 0 = []
| otherwise = innerfunc num num
これでリストに要素を追加しようと思い":"を使おうと
思ったのですが、これの型はa -> [a] ->[a]
なので使うことができません。
[a] -> a ->[a]という型の関数はないんでしょうか?
[op]っていう書き方がなんとなくダサい気がします。
そういう関数は組込みであるんでしょうか?
というか組込み関数一覧みたいなのってどっかにありません?
divisors関数を使った素数判定はこうかな?
isPrime :: Int -> Bool
isPrime num
| num <= 2 = False
| length (divisors num) > 2 = False
| otherwise = True
なんとなくHaskellが楽しくなってきました。
東京工科大のやつらがうらやましひです。。。
早くIO使った実用的アプリを作れるところまでいきたいのぉ
459 :
名無しさん@Emacs:02/10/29 22:27
型変換するよい方法はないでしょうか?
hugs上で
>:type "abc"
"abc" :: String
>:type ["abc"]
["abc"] :: [[Char]]
となってしまいます。本当は[String]となって欲しいわけですが、
Charのリストのリストになってしまうんですね。
どうしてなんでしょう? そこで、
>:type ["abc"::String]とかやってみてもダメですね。[[Char]]になります。
:type 1::Intならうまくいくんですが。。。
461 :
名無しさん@Emacs:02/10/30 00:05
>>761 ありがとうございます。
CharとStringの扱いですが、なかなか難しいですね。
おなじくhugs上で
>("aaa","b") == ("aaa", 'b')
というのはもちろんエラーになるわけですが、
Stringとなって欲しいようなところで[Char]と評価されて
しまうので。。。
チュートリアルの図書館データベースの問題で、
type Person = String
type Book = String
type Record = (Person, Book)
-- 図書の返却を行う関数
isData :: Record -> Record -> Bool
isData record1 record2
= record1 /= record2
returnLoan :: Database -> Person -> Book -> Database
returnLoan remove_person remove_book
= [ record | record <- exampleBase, isData record (remove_person, remove_book)]
これだと
ERROR "library.hs":54 - Type error in application
*** Expression : isData record (remove_person,remove_book)
*** Term : (remove_person,remove_book)
*** Type : ([([Char],[Char])],[Char])
*** Does not match : ([Char],[Char])
というエラーが出ます。んー、わからんです。
s/761/460/
でした。すんません。
×returnLoan remove_person remove_book
○returnLoan exampleBase remove_person remove_book
でした。質問忘れてください。m( )m
それでもあれですね。思ったより簡単ですね。
もっとCやPerlと比べて難しいかと思っていたら
そうでもなかった。二日である程度慣れました。
ループを一切使わずに全て再帰で書くのは
なれないうちはしんどそうだけど、見返りとして
バグの出にくいプログラムになるのかな。
これがすらすら書けるようになったら
この言語で仕事してみたいですね。
手っ取り早くHaskellを活用できる分野というと
XMLの処理系でしょうか。
Haskellについてはまだよくは分っていませんが(藁)
他の言語より向いている気がするんですね。
もっとフォーマルなプログラムにおいてこそ
こういった言語は意味をなすのかもしれないけど、
多分そういうのはヘタレには無理だろうし(w
とりあえず、IO、スレッドが使えるまで基礎勉強ですね。
無料で使わせてもらっていて、講義より先に
問題に関する質問をここに書いてしまっては
先生に申し訳ないのでここらへんでやめにしておきます。
先生には入門者用の本を書いてほしいなあ。
>>464 IBMのdeveloperWorksサイトに、HaskellでXMLを云々って記事が有ったね。
既出だろうけど。
>>465 なるほど、それでかな。
Haskellを使ってみる前からXMLの処理には
関数型言語が向いている気がしてたんです。
ただ単に自分が以前DWを読んだだけだったのですね(汗
関数型言語初体験の感想としてなんですが、
JavaやC++ではいかようにも書けてしまうのが
むしろあまりよくないことに思えてきました。
アルゴリズムを素直に表現してそれがそのまま
プログラムになっているという。素晴らしいです。
久しぶりに萌え萌えです。
もっと綺麗に書けるよう努力せないかんですね。
朝起きてから、Haskellスレパート1を見てたのですが、
2chに神が君臨したかのようなレベルですね(汗
自分の書き込みが恥かしくなって来たのでしばらく潜伏します。
早くみなさんのレベルに追いつきたひ。。。
これだけじゃ情報価値なしなのでせめてリンク
純粋遅延関数型言語 Concurrent Clean
http://sky.zero.ad.jp/~zaa54437/programming/clean/ このサイトの書評は私のような初心者には参考になりそうです。
また管理者の人はCleanシステムのドキュメントの翻訳を精力的に
行われています。素晴らしいです。
468 :
デフォルトの名無しさん:02/10/31 21:02
英語サイトで東工大くらいの難易度のチュートリアルってあります?
469 :
デフォルトの名無しさん:02/10/31 21:19
ゲージンはいきなりGentle〜を読んでコード書き出すの?
なんか信じられないんだけど、あれより簡単なドキュメントって
英語じゃみたことないよ。
>>469 情報どうもです。
テーマごとに手ごろな課題がついてて段階的に
ステップアップできるようなのがいいんですが。
もうちょっと探してみます。
471 :
デフォルトの名無しさん:02/11/02 09:19
472 :
デフォルトの名無しさん:02/11/02 11:51
473 :
デフォルトの名無しさん:02/11/02 15:15
Haskell.NETはどうなりますたか?
474 :
デフォルトの名無しさん:02/11/03 11:45
classって使ってます?
ghcのソースコード見ても殆ど使ってないんだけど、、、
C++がめんどくさくなるとという理由から敬遠されるのと
同じような理由で型クラスも使われてないとか?
477 :
デフォルトの名無しさん:02/11/07 21:57
I/Oとかの副作用処理って、モナドがファイナルアンサーですか?
他に良い方法無いの?(Haskell固有の話じゃなくて)
自分で考えろ
480 :
デフォルトの名無しさん:02/11/10 23:22
ユニークな型ねー。
これだけで解決?
>>478 あなたも一緒に考えましょうよ。
他にもあるよ。
・lazyなストリームとみなす。
・continuationを使う。
482 :
デフォルトの名無しさん:02/11/11 01:28
そもそもLazyなのがいけないんだろ
このスレ相変わらずプログラムコード量が著しく少ないねぇ
>>481 その2つの方法もありますね。
でも古典的(あまり普及できない)方法なのでは?
>>482 > そもそもLazyなのがいけないんだろ
‥‥‥誰もつっこまないのか。
っつうかオレ釣られた?
面倒なんで突っ込む必要なし
苦労の割にありがたみが少ないということかもね…。
嫌いじゃないんだけど、導入の旨みが苦労に勝っていると証明できないんで、
最近はLazyにも個人的に放置気味…。>Lazy Evaluation
代わりにという訳でもないが最近は部分評価野郎になってまつ。
(その上、HaskellどころかJava野郎に成り下がってまつ(w。)
488 :
デフォルトの名無しさん:02/11/17 23:10
ガイシュツな話題。
Lazyが悪い訳じゃないのに・・・・
>>477 他にも色々なアンサーがありますよ。時制理論とね。
透明参照性を保つためには、時間とか状況とかを導入すれば良い。
効率性の問題に行き当たる
>>488 もちろん悪くはないんだ。漏れも個人的には好きだ。
ただ好みの問題を越えて、
実装の苦労と実行効率を補ってなお十分にいいと言い得るかが問題…。
>>489 >>490 実行速度も、もちろん気になるので言語に新しい要素を導入するときは
慎重にするべきですね。
でも構文で制限かければ良いような
もしくは処理系のanalysisによる最適化(正格性判断による末尾再帰とかね)
とかで何とかなりそうな気もします。
だれか何とかして。
492 :
デフォルトの名無しさん:02/11/20 16:59
November 2002 release (November 19, 2002)
We are pleased to announce a new major release of Hugs98. The most important features of this release are:
・ Much improved FFI support (contributed by Alastair Reid), bringing Hugs really very close to the Haskell
FFI specification.
・ Adoption of a significant subset of GHC's hierarchical libraries (contributed by Ross Paterson).
・ An (allegedly) complete implementation of the Haskell98 module system (Sigbjorn Finne).
Most reported bugs have also been fixed; however, some issues still remain. See Hugs Bugs & Features for
further information.
随分とでかくなったな・・・
>>440 バージョンアップしてもテンキーの"/"は効かないままな模様(Winhugs on W2k)
つーか日本語キーボードじゃないと再現しなくて
開発元は気づいてないなんてオチじゃないだろうな。
英語キーボード持ちの人だれか試してプリーズ。
>>495 漏れは英語キーボードだが。
日本語OSでしか再現しないのか?
>>496 英語KBでも効かないか。
ウチにゃ日本語W2kしかないから、英語OSの検証は無理だし。
もうちっと色々してみてダメだったらバグレポするつもり。
新しいHugs、なんかインストーラがおかしくない?
アクセス権の設定とか。
499 :
デフォルトの名無しさん:02/12/02 00:14
誰か、
lispとhaskellとocamlの
メリットデメリットを教えてください。
500get
501got!
新しいhugsにはwinhugsはついてないの?
越田先生の「値しての関数」と「オーバーロードとクラス」の問題が
全然分からない・・・。
誰かお助けを〜
(´-`).。oO(tab-width 4文字にしててはまった。あー悩んだ悩んだ。do で。)
505 :
デフォルトの名無しさん:02/12/05 00:49
HaskellはMS Research所属の人間が関わっているのに、
UNIX指向なんでつか?
さあ
「GHCは」、だった。
いや、GHCの最新版で一番最初に出るのがUNIX版なもんで
512 :
デフォルトの名無しさん:02/12/11 20:50
>502
>新しいhugsにはwinhugsはついてないの?
オレも見つけられない。どこにあるの?
513 :
デフォルトの名無しさん:02/12/14 15:59
514 :
デフォルトの名無しさん:02/12/16 06:01
その面白さを理解できないあなたはHaskellerではなし。
無理にでも笑いなさい。
516 :
デフォルトの名無しさん:02/12/22 11:30
>>516 何処ぞの大学か何かの授業用のテキストじゃないかなぁ.
前の年には毎回配ってたプリントを,次の年は一括して印刷・
簡易製本とかいうパターンって結構あるから
518 :
デフォルトの名無しさん:03/01/06 23:34
んが
IP記録実験
http://qb.2ch.net/test/read.cgi/accuse/1042013605/ 1 名前:ひろゆき ◆3SHRUNYAXA @どうやら管理人 ★ 投稿日:03/01/08 17:13 ID:???
そんなわけで、qbサーバでIPの記録実験をはじめましたー。
27 名前:心得をよく読みましょう 投稿日:03/01/08 17:20 ID:yL/kYdMc
SETTING.TXT管轄でないということは全鯖導入を視野に、か?
38 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:22 ID:rLfxQ17l
>>27 鋭いです。
73 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:27 ID:rLfxQ17l
>ところで、IPが抜かれて何か今までと変わることってあるのでしょうか?
・今までより、サーバが重くなる。
・裁判所や警察からの照会があった場合にはIPを提出することがある。
IP記録するのはいいけど串も規制しないと意味ないよな
フシアナ標準にすればいいのに。
困るのは厨くらいだろ?
>>292 どのIPがどの垢かは、ISPが記録してます。
だから、悪い事すればモデムだろとADSLだろうと捕まりますよ。
始めまして。今私はplorogの勉強をしています。問題集に並べ替えのプログラムがあったのですが、よくわからないのでどなたか教えて下さい。
concatenate([],List,List).
concatenate([Head | This Tail],List,[Head | That Tail]):-
concatenate(This Tail,List,That Tail).
sort([],[]).
sort([Head|[]],[Head]).
sort([Head|[THead|[]]],Result):-
Head <= THead, concatenate([Head],[THead],Result).
sort([Head|[THead|[]]],Result):-
Head > THead, concatenate([THead],[Head],Result).
sort([First|[second|Tail]],Result):-
First <= Second,
concatenate([Second],Tail,Temp),
[First|RTail]=Result,
sort(Temp,RTail).
sort([First|[second|Tail]],Result):-
First>second,
concatenate([First],Tail,Temp),
[Second|RTail]=Result,
sort(Temp,RTail).
それで、これをどう繰り返せばいいのかがわからないのです。何かわかる人がいたら教えて下さい。
これからは馬鹿って書いただけで訴えられる可能性がでてきたわけで
既に訴えられているわけだが。ひろゆきが責任を取ってるだけで。
======2==C==H======================================================
2ちゃんねるのお勧めな話題と
ネットでの面白い出来事を配送したいと思ってます。。。
===============================読者数: 138720人 発行日:2003/1/9
年末年始ボケがそろそろ収まり始めた今日このごろのひろゆきです。
そんなわけで、年末に予告したIP記録ですが実験を開始しています。
「2ちゃんねる20030107」
こんな感じで各掲示板の最下部に日付が入ってるんですが、
20030107以降になってるところはログ記録実験中ですー。
んじゃ!
────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50 ────────────────────────────
そりゃ最初はよほどの大事でもない限りIPを渡すことはしないだろう、
でも物事はだんだんエスカレートしていく物、そのうち密告とかも「誹謗中傷」として
IPを渡すようになる、、、
最近、腐れさん見ないね・・
最高裁への上告は認められなくなったから、これで事実上判決確定だよ。
逆転も何もないって。
勢いで上告なんかしても一発で上告却下(門前払い)だよ。
二審も一審を支持。これに対して上告しようにも、
刑事訴訟と同様、自由に上告できるってもんでもないのです。
民事訴訟法312条 (上告の理由) 1項
「上告は、判決に憲法の解釈の誤りがあること
その他憲法の違反があることを理由とするときに、することができる。」
http://www.m-net.ne.jp/~doba/goto/hon.htm ようするに上告しても今の制度では100%無駄。
これで完全終了ってことか。
>>754 まともじゃない掲示板なんて存在意義ないね。
そういうことならここじゃ意味ないと思うが。
スレタイの日本語、微妙におかしいね。
(前略)815様
落ち着け。お前の感じている感情は精神的疾患の一種だ。
静める方法は俺が(中略)
鯖の前で両目をひんむいて「びっくりするほどユートピア」と唱えながらキュウリを(以下略
なつかし。
ひろゆき
お前にはがっかりした。
2chにも。さいなら。
全部ミギーが書きましたって言えば問題ナッシング
ううん、既存のTripodとかじゃなくて新たにそういうシステムを
作っちゃうの。
どう作るかはわかりませんw
しかし嵐とか不愉快な対策には「こいつがむかつく」と
ひとり1票で投票してきめます。
そしてその人はもうカキコ禁止。
どうやってカキコ禁止にするとかそういうのはわかりませんw
記録されてる分なにかと現社会より厳しくなった感じします、
とりあえず、訴えられたらスレ住人全員で土下座しよう。
ていうか、それくらいの気概で書き込め。
今までひろゆきに丸投げしていた負担を、個人個人で背負えばイイだけの話だろ。
ここからが本当の市民運動のスタートだよ。
マターリしてるのにスレ違いな質問はどーかと。
それに、会社立ち上げたんだし、たぶんにその辺からだろ〜ね。
2chをはけ口にしていた人はどこで憂さ晴らしをするのか少し興味ある
漏れはどこもさくさく行ける。
プロバ次第だと思われ。
漏らすバカが出るだろうというのが一番の問題なんだよ
ごめん、なんで「それを言うなら」になるのかがわからん(^_^;)
後半の批判は批判でいいと思うんだけど、書き込む人間の自己責任ってのとどう関係してるの?
だろ。
461みたいなことばっか起こるだろ。
ろくなことなないな。2ちゃんなんか。
それもやられ損かなぁ?
訴えてやればいいのに。
548 :
デフォルトの名無しさん:03/01/12 15:22
>>1-517 荒らされる前までのリンク。
なんでプログラム技術板で私が覗いてる全スレでやられてるんだか・・・。
全ての責任は当事者同士で解決しろってこと
人が書き込んだものに対して賠償するのもアホらしいしな
ごく当り前な考えだわな
騒ぐ程のもんでもない
わかるか?
プチ法廷ごっこでは、詭弁で開き直る2ちゃん擁護派は強い。
でもリアル法廷ではボロ負け。
過度の期待は禁物です。
(^^)
そんなに世の中が嫌いか。
年収600万円に満たない屑でも愉快に暮らせる楽しい世の中じゃないか。
いちいち爆破するな。
(^^)
556 :
デフォルトの名無しさん:03/01/17 00:03
標準ライブラリ関数のクイックリファレンス本って無いのかな?
入門本は取り敢えず読んだから、
簡潔な説明と簡単な使用例が有ると嬉しいんだけど。
>>554の本は、ちょっと違うみたいだし、
1969年にならないと手に入らないって書いてある……バグってるな。
(^^)
つってもなー、Haskellerにはlurkerが多いらしいからな
www.haskell.org内にも Seward氏の名前はたくさん出てるから、lurkerではないのでは?
荒すな
568 :
デフォルトの名無しさん:03/02/03 22:53
WinHugsでテンキーの'/'が効かない件、
バグか仕様か知らないけど、取り敢えず直してみた。
Windowsでプログラム組んだ事無いんで、変な事してる
かもしれないけど、一応動いたよ。
*** Wintext.c.origTue Aug 6 07:29:18 2002
--- Wintext.cMon Feb 3 21:20:30 2003
***************
*** 2497,2502 ****
--- 2497,2506 ----
goto otherKey;
}
+ if (readKey.KeyCode == '/') {
+ readKey.IsExtended = 0;
+ }
+
return readKey;
}
569 :
デフォルトの名無しさん:03/02/05 16:32
template haskell まだあ〜?
Hoshkell
素朴な疑問Haskell使ってる人たちって情報系の人ばかり?
572 :
デフォルトの名無しさん:03/02/26 20:26
573 :
デフォルトの名無しさん:03/03/12 16:17
11 March 2003 GHC 5.04.3 Released
どこが変わったのかわかりゃしねぇ。
ところで最近寂れてるな。
やっぱもうネタないのかね。
Haskellコミュニティは議論は盛んなんだけどなー
はやく日本語で本出ないかなー。
lazy evaluation ってなんですか?
>>577 値が実際に必要となるまで引数の評価を遅らせること。
要求呼び出し(call by need)
命令型言語ではほとんど実現されていない。
引数の評価は何らかの副作用を伴うことがあり、
引数がいつ必要になるか正確に知るのは難しい。
また、要求呼び出しはスタックによる実現が難しい。
581 :
デフォルトの名無しさん:03/03/16 00:47
Haskellerの中にはまたストリームベースを唱えている人もいるようだが
意味不明でっす
>>583 この板にも居ますよ。たぶん数学屋の方でしょうけど。
ところでデータ構築子って理論的にカリー化できないのでしょうか?
最弱頭正規形を作ればいいのだから可能なのでは?と思いますが。
可能だからといって言語仕様にいれるとは限らないでしょう
その辺は言語設計上の様々な観点を
考慮しながら決定するということで
588 :
デフォルトの名無しさん:03/03/20 11:04
> 586
カリー化されてるんじゃないの?
余裕でっす
されているね、十分。
----code
data Tree a = Node a [Tree a]
instance (Show a) => Show (Tree a)
where show (Node item xs) = show item ++ show xs
-----実行
*Main> :type Node 1
forall a. (Num a) => [Tree a] -> Tree a
*Main> Node 0 (map (Node 1) (map (map (flip Node [])) [[2,3],[4,5]]))
0[1[2[],3[]],1[4[],5[]]]
-----
それとも、もしかして、こんなん?
-----code追加
test (Node a) = a
-----予想実行
*Main > test (Node 0)
0
*Main > test (Node 1 [])
1
-----
上はともかく、下はあってもおかしくないし、欲しいな。
あとで少し探してみるか…。
592 :
デフォルトの名無しさん:03/03/24 02:45
Windows版のHugsって、ドキュメントのバージョンがずれてない?
.hlp .pdf .htmlが古くて、.chmだけちょっと新しいような?
あと、Trexライブラリがうまく使えないんだけど、
もしかして再コンパイルが必要なのかな?
Hugs mode: Restart with command line option +98 for Haskell 98 mode
Reading file "C:\Hugs98\libraries\Hugs\Prelude.hs":
Reading file "C:\Hugs98\libraries\Prelude.hs":
Type :? for help
Prelude> :load Hugs.Trex
Reading file "C:\Hugs98\libraries\Hugs\Trex.hs":
ERROR "C:\Hugs98\libraries\Hugs\Trex.hs" - Illegal export of a lone
data constructor "EmptyRec"
593 :
デフォルトの名無しさん:03/03/25 08:06
はあー、MLはまだ何とかなりそうだが、haskellさっぱりわかんね。
haskell.org維持費用捻出できなくなったのかよ
ワラタ
2ちゃんねらーで金出してやれよ。
トップページのλの隣にモナー飾ってもらえるかもしれんぞ。
そうなら、もう消すだろ
1 Apr 2003 のニュースだから、永久保存かも
でも、去年は April fool なかったみたい age
(^^)
602 :
デフォルトの名無しさん:03/04/25 17:31
ホシュ
このゴールデンウィークにでも勉強したいと思いまフ。
604 :
デフォルトの名無しさん:03/04/27 05:18
これ、行列の対角化とかできますか?
対角化の計算を自分で書けばもちろんできる。
行列計算用のモジュールも公式サイトから辿れる。
あとはやりたい本人の裁量次第でいくらでも。
606 :
デフォルトの名無しさん:03/04/27 17:03
607 :
デフォルトの名無しさん:03/04/27 21:58
初期のhaskellはschemeで作られたって本当?
昔Yale大学のサイトになんか書かれてたけど。
けど・・けど・・
609 :
デフォルトの名無しさん:03/04/29 14:15
Common Lisp?
610 :
動画直リン:03/04/29 14:26
611 :
デフォルトの名無しさん:03/05/05 17:03
f x = let a = 1; b = c g
y = exp2
in exp1
f x = let a = 1; b = c
g y = exp2
in exp1
612 :
デフォルトの名無しさん:03/05/14 12:10
最強
logoが変わった
前よりよくなったねえ
そ…、そうか?
かなりビミョーなデザインだと思うが。
616 :
デフォルトの名無しさん:03/05/16 23:07
λの回りにゴミが付着してる様に見える
:: = 静的型付け
-> = 高階関数
∀ = 多相
=> = 型クラス
>> = モナド
つーことかいな。
そう考えると凝ってるな
619 :
デフォルトの名無しさん:03/05/20 07:11
凝ってる、っつーか、まんまやん。
CGAの話止まってるけど、なかなかまとまらんのかね。
>>619 featuring static typing, higher-order functions,
polymorphism, type classes and monadic effects
にそれぞれ対応してるという解釈のようだけどそれ分かって言ってんの?
∧_∧
ピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。
=〔~∪ ̄ ̄〕
= ◎――◎ 山崎渉
結局、wxWindowsのバインディングで終わりそうな気配だな
ghc major version up
教えて君で申し訳ないのですけど、他の関数型言語と比べて Haskell のどのあたりが
(・∀・)イイ! or (゚д゚)マズー なのですか?
できれば、いい面と悪い面の両方を聞いてみたいです。
>>626 (・∀・)イイ!
実装がいくつかある。
(゚д゚)マズー
末尾再帰じゃない。
○:数少ない遅延評価な言語の一つ
△:clean は遅延/正格の切替えができるらしいが、Haskellは…
>>627 実装がいくつかある。
SchemeやSMLも実装はいくつかあるが。
個々の実装の間に互換性がなければ、却って混乱するのでは?
630 :
Lazy eva.:03/06/02 21:31
call by need
必要なら呼んで
>>627 >(゚д゚)マズー
>末尾再帰じゃない。
lazyだと末尾の最適化はいらないんじゃなかった?
おれが勘違いしてるのかも知れないけど
(´-`).。oO( Haskell の (・∀・)イイ! 点がこの程度しか挙がらなくていいのだろうか)
いいところ:
純粋な関数型言語
厳格な型チェック
比較的豊富なライブラリ
遅延評価
わるいところ:
遅い
flatなarrayが無い
スレの伸びが lazy ...
>>634 …実はこのスレの定義は既にすべて準備されていて、誰かが問いを放つとレスが見えるようになる?
Haskell: The Craft of Functional Programming
これの新しいバージョンがでるっていううわさは本当なの?
Ruby系サイトのどこかで書いてあった気がするのだけど。
あ、だめだった。Amazonで検索すれ。
>>635 逆かも?
問いが放たれてから、必要に応じて定義を考える。
640 :
デフォルトの名無しさん:03/06/11 00:32
問に対して常に同じ答えが返ってきます。
文脈が変っていても同じ質問に対しては同じ答えが返ってきます。
>>640 問いの系列がmonadな演算で関連付けられてるので、
単独の問いに対しては当てはまらないカモッ!
643 :
デフォルトの名無しさん:03/06/12 18:05
>>641 それではガイシュツ処理が出来ませんので、
不具合発生です。
ΛΛ
(´d`) .。o〇(monad∈モナー?)
645 :
デフォルトの名無しさん:03/06/17 18:46
モナドは、人間から見て、副作用を扱ってるコードとほとんど
同じように見える。
人間にとって副作用のあるコードと同じように見えてる
とすれば、モナドって何の意味があるの?
人間が関数プログラミングしやすくするために副作用が
禁止されてるんじゃ無かったの?
「ある」と「あるように見えるけどない」は違うだろ…
648 :
デフォルトの名無しさん:03/06/17 18:55
>>646 違うけど、プログラマから見て同じように見えてるんだったら
プログラマにとっては同じでは?
コンパイラにとっての意味しかないのですか?
関数型の場合、コンパイラにとっては「ない」方が都合がいいけど、
人間にとってはあなたの言う通りあるように見えた方が扱いよいわけだ。
で、「ない」ものをあるように見せるモナドは、便利ってことにならない?
それならモドキじゃなくて本物の副作用を認めてもいいじゃんという話はまた別
650 :
デフォルトの名無しさん:03/06/17 20:29
>>649 > 人間にとってはあなたの言う通りあるように見えた方が扱いよいわけだ。
それは関数プログラミングに反するから、関数プログラミング
の立場から見た場合、扱いが良いとは言えないんじゃないですか?
話が逆なんじゃないか?モナドは副作用をわざわざあるように見せるためのものでもないだろう。
a <- hoge
ってやったら、あとは a は見るからに完全に副作用の無い
関数型プログラミングであつかうわけだから、
モナドがあるおかげで関数型の意味がなくなるなんてことは全然無い。
結局モナドって、
副作用や、コードを書いた時点では決まらないものを
普通の関数の引数なんかにつかって破綻するのをさけるために、
型の前にMとかつけてそのままじゃつかえなくする仕組みでしょう。
653 :
デフォルトの名無しさん:03/06/24 08:16
日本語扱えるhaskellの処理系ってありますか?
654 :
デフォルトの名無しさん:03/06/24 09:06
655 :
デフォルトの名無しさん:03/06/26 07:32
Haskellはじめますた。
面白いですね〜
・リストの内包表現に萌えた
・無限データ構造萌え
numForm n = n : numForm (n+1) とか。
あるもんをあるように書いたらいいって言うのがすどい。
詳しい方々、わかんないことがあったら教えてください。
アフォなんですが何とかがんばって基本を理解してから、
モナドを通って詳しい皆さんのところにゆきつきますので。
いまは、組み込み関数?を調べるのに困ってたりします。
IntをDoubleに変換するのってどうするの?
IntとIntegerの変換どうするんでうか?
とか、わからん。
「**」が解らなくて困ってた事も。
(-1)で懲りて、あらゆるところに括弧つけまくりのコードを書いてたり。
656 :
デフォルトの名無しさん:03/06/27 10:48
>>655 fromIntegral :: forall b a. (Num b, Integral a) => a -> b
toInteger :: forall a. (Integral a) => a -> Integer
fromInteger :: forall a. (Num a) => Integer -> a
今年もICFPの時期が来ましたがみなさんいかがお過ごしですか?
>>655 $をつかうと
f (g (h x))
みたいなのを
f $ g $ h x
とかけて括弧削減。
659 :
デフォルトの名無しさん:03/06/29 21:21
初心者質問いいですか?
GHCで、API、例えばIsDBCSLeadByte Char -> Bool を使いたいと思ったらどうすればいいのでしょう
誤解があるようだが、モナドは純粋な関数型言語が
手続き風にコードを書くためのシンタックストリックに過ぎない。
拡張でもなんでもない。
(もちろんシーケンシャルのオプションと使われることが多いわけだが)
662 :
デフォルトの名無しさん:03/06/29 22:22
_,..............._,.......
,ノ⌒::::::::::::::::::::::::::::::::::::⌒ヽ_
_ノ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::ヾ、
(::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::)
_ノ:::::::::::::::;ヘ::::::::::ノ⌒ヽ:::::::::::::::::::::::::::::::::)
(::::::::::::::::::/  ̄ , ‐-、 |::::::::::::::::::::::::::::::::) / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
(:::::::::::::/ヽj _/ -‐-、 |::::::::::::::::::::::::::::::::) | トリックだ。
):::::::::ヾllli_、_,;iiiillllllllli <::::::;へ:::::::::::::::::( |
(::::::::::::/`i´ ,└=゚'┘ |::::| 6 |:::::::::::::::::::} < 副作用があるように見えているに
`〜、 ゝ| _コ、_、 /|::::| ソ/::::::::::;〜" | 過ぎん。
ヾ|||ll|||||||||||l〉| 三ー'〜〜" |
|||:二三|||| l ,三 ヽ、 \______________
|l ⌒ ||| :// ヽ=、-、_
|l、:( : : ||/ / ヽ, |  ̄\
/  ̄ / ノ / \
サータン,サータン!
ところで、日本語訳のページが見れなくないですか??
665 :
デフォルトの名無しさん:03/06/30 02:53
>>666 復活したようです。
>>665 いないんじゃないですか。人少なそうだし。
俺は、外界との繋がりはsystem :: String -> IO ExitCodeくらいしか知らない。
検索の結果、MessageBoxを呼んでいる例は見つけました。(真似たらできました)
でも、*.hiをバイナリ検索しても、IsDBCSLeadByteはインポートされて無いようです。
(CharNextとか、代用できそうなAPIも同様)
これは、Haskellで全角文字を扱うなというお告げでしょうか…
670 :
デフォルトの名無しさん:03/07/02 13:46
>>668 >(真似たらできました)
おー、あなたも私から見たらすどい。
よろしければ、MessageBoxを出すコードをこのスレに張って
共有していただければありがたいです。
>>669 あ、でもリンク先のFFIとか使えばできそう?できるのか俺に?
…ありがとうございます
673 :
デフォルトの名無しさん:03/07/05 01:11
FranTkを使った事のあるかたは居られますか?
使おうとしたけど何だかよくわからんかった。(窓使いです)
> ちゃんと実装されているならばだが。
内部ではUnicodeかもしれないけど、全角文字をgetCharで読むと二回に分けて来るんですよ…
>>674 Unicodeとその(バイトでの)エンコーディングは別物だ。
>>676 実際
I/O functionsがbyte読んでそれをかえすだけだから、
Charが16ビットである意味がないんだよな。
謎の設計。
678 :
デフォルトの名無しさん:03/07/14 01:55
return () << [1,2,3] が [1,2,3] を返すのは何で? ()モナドの定義?
679 :
デフォルトの名無しさん:03/07/14 01:56
ごめん。わかってると思うけど << じゃなくて >> の間違い
そういや、漏れもIOモナドはちょっと分かったつもりだけど、
なんでリストがモナドなのがいまいちよく分からん。
m がモナドのとき return () << m が m になるのはなんで? ()モナドの定義?
また >> を間違えて << にしてまった
書いた後気づいたのだが return [3,4] >> [1,2] も [1,2] 返すのか
() がポイントではなく return の方がポイントだった
かきまぜてスマン
return 1 >> [1,2] でも return 'a' >> [1,2] でも同じだな
もっというと()はどのモナドでも返せる。
687 :
デフォルトの名無しさん:03/07/14 18:52
getChar って結局何返すの?
参照透明性からいって 'a' が入力されたからといって IO 'a' が返るわけじゃないんだよね
たびたび出る話題でスマンが毎回納得にいたらない
IO
>>687 強いて言えば IO 'a'だろうが、それで参照透明性に何の問題が?
691 :
デフォルトの名無しさん:03/07/14 22:08
そもそもモナドを理解するのにIOモナドから入る,っていうのが間違っている
という気がする.モナドを理解するためには,次の論文を読むのが吉かと.
Wadler, P. : Monads for functional programming
693 :
デフォルトの名無しさん:03/07/14 23:45
>> 692
そうそう.
694 :
デフォルトの名無しさん:03/07/15 00:39
関数型では同じ関数なら何回呼んでも同じ値が返る建前では
実は暗黙のworldが渡されていて暗黙の新しいworldも返されている?
モナドって、食べ物じゃなかったのか。
696 :
デフォルトの名無しさん:03/07/15 01:05
理解するのに論文を読ませる必要がある事自体に
何か問題があるような気もするがー。
今印刷して読んでます…辞書片手に…どなたか、厨房向けに噛み砕いて説明してホスィ
698 :
デフォルトの名無しさん:03/07/15 01:31
>>697 _,..............._,.......
,ノ⌒::::::::::::::::::::::::::::::::::::⌒ヽ_
_ノ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::ヾ、
(::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::)
_ノ:::::::::::::::;ヘ::::::::::ノ⌒ヽ:::::::::::::::::::::::::::::::::)
(::::::::::::::::::/  ̄ , ‐-、 |::::::::::::::::::::::::::::::::) / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
(:::::::::::::/ヽj _/ -‐-、 |::::::::::::::::::::::::::::::::) | トリックだ。
):::::::::ヾllli_、_,;iiiillllllllli <::::::;へ:::::::::::::::::( |
(::::::::::::/`i´ ,└=゚'┘ |::::| 6 |:::::::::::::::::::} < 副作用があるように見えているに
`〜、 ゝ| _コ、_、 /|::::| ソ/::::::::::;〜" | 過ぎん。
ヾ|||ll|||||||||||l〉| 三ー'〜〜" |
|||:二三|||| l ,三 ヽ、 \______________
|l ⌒ ||| :// ヽ=、-、_
|l、:( : : ||/ / ヽ, |  ̄\
/  ̄ / ノ / \
>>682 return () >> [1,2,3]
後ろがリストなので、これはリストモナド
returnを外して、>> を >>= に変換すると、
[()] >>= (\x -> [1,2,3])
前のリストの要素それぞれに対して後ろの関数を呼んで、その結果を連結したものがこの式の値なので、
(\x -> [1,2,3]) ()
[1,2,3]
>>694 その通り。IO a はHaskellの側から見ると、
data IO a = IO (World -> (a, World))
このような構造になっていて、実行結果がIOだった場合に、表示する前にWorldが渡されて実行される。
実際はそんな面倒なことしていないと思うけどね。
半分ぐらい読みました…まさに
>>698のおっしゃる通り…それ以後の式を全部λとして渡して、
でっかい合成関数を組み立てて、最後に一括して実行してるようなイメージでいいのでしょうか?→モナド
(と同時に、実装までそうなってないよなあと信じたい)
>>698 モナドを使えば副作用は「ある」というべきだろう。
たとえばモナドを利用したカウンタを利用して、
あるいは、ファイルに1, 2, ...と書き込んでループをつくれば、
あきらかにそこには副作用があるわけだ。
むしろWorldを変化させながら渡し続けるという発想の転換で(言語に対し)
無いように見せかけているだけだ。人間にとっては副作用は存在する。
>>702 あるように見せかけているだけだろ?
そうじゃなきゃモナドの意味がない
__∧_∧_
|( ^^ )| <寝るぽ(^^)
|\⌒⌒⌒\
\ |⌒⌒⌒~| 山崎渉
~ ̄ ̄ ̄ ̄
>>701 よいはず。
あと、遅延実行されるのでそう実装しても効率は悪くならないと思う。
>>703 逆だよ。というか循環論法。
そもそも関数型言語には本来副作用は存在し得ない。状態ってものが無いからね。
しかし、特に外部とアクセスするプログラムのためには副作用が必要だ。
関数型言語と、その副作用をともなう処理を、
副作用の種類(IOとか)毎の(内部状態を保持する)モナドを導入することで*分離*してるだけだ。
>>705 701のイメージはあってるが、
> あと、遅延実行されるのでそう実装しても効率は悪くならないと思う。
遅延実行だからこそそういう式の組み立てと式の保存をやらないといけないわけで、
むしろ遅延評価だからと言ってそういう実装をするととんでもないことになる
というべき。
通常の式の評価でも下手に(末尾)再帰すると未評価の式の列が莫大になって
すぐオーバーフローする。
大雑把に読みました。後半のパーサは読み飛ばしましたが…
データ型としてのモナドは、要するにC++のクラスtemplate、のようなもの…ですよね?
ということは、IO a -> aな関数が記述不可能なのは、言語の外を相手にしたIOモナドに限った制限で
一般的にはそんな制限は無い、で合ってます?
簡単なサンプルコードどこかにないかな…
>>709 ありがとです。
で、
>>681氏と同じ疑問に行き当たるわけですが…
リストが状態を持っているとは思えないのですが、なぜモナド?
(a, b)とか他の一般の構造化型はモナドじゃ無いですよね。
>>710 リストを丸ごと全部で値と思わずに一部だけ更新したいんじゃない?
一部だけ更新するような操作には普通副作用がある。
…違うかな?
リストは >>= と return がモナド演算の法則を 満たしているからモナドなんじゃないかな
(a,b)とか一般の構造型はコンテナの中身の個数が1個ではない定数なのでうまく
モナド演算を定義できないような気がする
リストモナドの中身は任意個数。IOモナドは1個固定。
眠れない…
えーと、要するに、必然性は無いけど、
モナドということにすると [a] >>= (\e -> return (f e)) みたいな便利機能として使えるので
モナドということにしてある、ということですか。
>>711 よく見て無いのですが、ライブラリリファレンスにMutable ArraysとしてIOArrayが書かれてますので、
もしリストモナドで一部の更新が可能なら、こんなもの用意しないと思うので、それは違う気が
(我ながら無茶苦茶な論法だ…)
あれもこれも、Haskellの和書が出ないのが悪い。
>>707 すまんが、そういうふうにする以外の方法が自分には想像できない。
doも普通の再帰なので問題はなさそうだが?
>>711 リストモナド≒内包表記
副作用を発生できるモナドはIOモナドだけです。
>>710 ListとMaybeだけだね。
試しに、(a, b) でMonadを作ってみたが…きつい。
---
instance Monad ((,) a) where
(>>=) (sub, main) f = (sub, main') where
(sub', main') = f main
return main = (bottom, main)
bottom = bottom
test = do x <- (("a", 2), 1)
y <- return $ x+1
return $ y*2
---
*Main> test
(("a",2),4)
716 :
デフォルトの名無しさん:03/07/16 12:02
だれとはなくに
「型構築子」IO はモナドだけど IO a はモナドじゃないよ。
「型構築子」[] はモナドだけど [a] はモナドじゃないよ。
>>713 haskellのリストやアレイはは一部を変更すると全部コピー。
というのは、そのデータ(リスト等)が他の場所で使われるかもしれないから。
一部を変更したということがそのデータを使うプログラムの他の部分にも
わからないといけない。
そのためには、使う部分全部をそのデータの内部状態をあらわすモナドでくるんで
おく必要がある。
# 変更し終わったら、それはモナドの外に出してもいい。
>>715 701の件については、誤読していた。それ以降の式、ってのが何を指すのかわからない。
それはともかくとして、
(IO/状態)モナド内の計算の実行は、手続き型と同様にできるとおもうけど。
> 副作用を発生できるモナドはIOモナドだけです。
haskellプログラムがわからみればIOも他のモナドもかわらない。
プログラマから見たときも結局は同じこと。謎の内部状態をもつ
モナドを受渡しながら処理を順次実行するわけだから。
内部で定義されたモナドでもそのモナドの性質をみとおさなければ、
副作用と同様でしょう。
別のいいかたをすれば、711が書いているように、普通一部を変更すると
副作用が出るわけで、関数型言語では一般にはそれができない。
だが、その副作用/状態を追跡するモナド(STArray,IOArray等)を引数と
して渡し続けながらの順次計算であれば一部変更もできるわけだ。
719 :
デフォルトの名無しさん:03/07/16 12:45
だれとはなくに
「データ構築子」はファーストクラスだけど
「型構築子」はファーストクラスじゃないよ。
720 :
デフォルトの名無しさん:03/07/16 13:13
だれとはなくに
モナドは「型構築子」の性質であって、データの性質じゃないよ。
>>717 まず、すまんかった。
確かに中身を見なければ副作用を起こすことは可能だ。そちらの言う通り。
以降の式だが、自分は a >>= (\x -> b) の式に出てくるλのことだと思っている。
そして、715のそういうふうにとは、どでかい合成関数を作ってからそれを実行するということ。
もちろん、遅延実行されるので、少し作ってはそれを実行してというふうになると思っているが。
>(IO/状態)モナド内の計算の実行は、手続き型と同様にできるとおもうけど。
main = sequence_ $ reverse $ [putStr "\n", putStr "a", putStr "b"]
こう言うのはどうする…?
…特殊すぎるか。他は最適化されててもおかしくないやね。
>>718 少なくともIOArrayはIOモナドの一部であってモナドそのものではないと思うが。
>>719 しかし少なくともカリー化はされている。
>>715 サンプルとして活用させていただきます
で、勝手にインデント。
module Main where
instance Monad ((,) a) where
(>>=) (sub, main) f = (sub, main') where
(sub', main') = f main
return main = (bottom, main)
bottom = bottom
test = do
x <- (("a", 2), 1)
y <- return $ x+1
return $ y*2
>>721 表現が悪くて申し訳ないです。そのつもりでした。do A; B… と書いた時のB以降です。
723 :
デフォルトの名無しさん:03/07/16 17:37
data Id a = Id a deriving Show
instance Monad Id where
Id x >>= f = f x
return = Id
foo :: Int -> Id Int
foo arg =
do { x <- ID arg
; x <- ID (x * 2)
; x <- ID (x + 1)
; return x }
というHaskell のプログラムと、
int
foo (int arg)
{
int x;
x = arg;
x = x * 2;
x = x + 1;
return x;
}
は、そっくり。上は副作用をつかってないですけど、
下は副作用をつかっています。
そんだけ。
int
724 :
デフォルトの名無しさん:03/07/16 18:28
725 :
デフォルトの名無しさん:03/07/16 20:17
突然ながら、FFIを試してみたり…
#include "hsFFI.h"
#include <stdio.h>
void __stdcall print_hex(HsInt a)
{
printf("%x", a);
}
foreign import stdcall "print_hex" printHex :: Int -> IO ()
main :: IO ()
main = do printHex 1234
>ghc ffi.hs ffi_c.hc -fglasgow-exts
Warning: retaining unknown function `_print_hex@4' in output from C compiler
動くんですけど、このWarningが消せない…
>>720 > 以降の式だが、自分は a >>= (\x -> b) の式に出てくるλのことだと思っている。
> そして、715のそういうふうにとは、どでかい合成関数を作ってからそれを実行するということ。
よくわからない。ダイナミックに関数を作ると?
> ...
> main = sequence_ $ reverse $ [putStr "\n", putStr "a", putStr "b"]
関数ポインタの配列をつくっておいて並べ替えるのかな。
>>721 > 少なくともIOArrayはIOモナドの一部であってモナドそのものではないと思うが。
確かに、モナドはそれぞれIOとSTだ。
モナドの一部っていうのもよくわからないが…
monad-awareという感じか。
>>725 __stdcall -> ccall、ffi_c.hc->ffi_c.c
で
ghc -ffi ffi.hs ffi_c.c
とすると何のWarningもなくコンパイルを通った(Windowsではない)。
728 :
デフォルトの名無しさん:03/07/17 01:25
誰か Haskell の和書書いてくれよ。
5000円くらいまでなら買うからさ。
和書ないとやる気が出ねぇし、普及なんて夢のまた夢だよ。
729 :
デフォルトの名無しさん:03/07/17 02:06
Haskellはドイツ語でクシャミの事
>>727 拡張子を変えたら警告が出なくなりました。
よくよく見てみれば.hcってコンパイラが生成したCソース用の拡張子…
どうも、お騒がせしました。
>>729 くしゃみが出るくらいに香辛料の効いたカレーを“Haskell Curry”と云う!?
>>726 >よくわからない。ダイナミックに関数を作ると?
その通り。 (.) が関数を合成するのと同じように。
>関数ポインタの配列をつくっておいて並べ替えるのかな。
引数等を保存しておく必要があるので、それをすると、λと変わらないと思う。
>>722 無理しているので、return a >>= k = k a が成り立たなくなってたりしているので注意。
ついでに、前に作ったモナドをどうぞ。
面倒を少し減らす程度のものですが。
---
module Main where
--type ReadS a = String -> [(a,String)]
newtype ReadR v = ReadR { runr :: ReadS v}
instance Monad ReadR where
ReadR r >>= fr = ReadR (\str -> [ret| (v,str') <- r str, ret <- fr v `runr` str'])
return v = ReadR (\str -> [(v, str)])
rread :: (Read a) => ReadR a
rread = ReadR reads
rlex :: ReadR String
rlex = ReadR lex
test :: String -> (Int,String)
test str = head test' where
test' = do rread
`runr` str
---
Main> test "125 "
(125," ")
Randomを使ったコードを少し書いて見ました。
毎回の let (r2, g2) = random g1 in … 数字は使うたびに増やす…が面倒だったので、
モナドにすれば好きな時に r2 <- nextRandom とか書けるのかなあ、とか思ったり。
(既にあるのかもしれませんが)
>>732 うう、ありがとうございます。しかし、私のレベルでは何をやっているのかと用途の両方がわかりません…。
>>732 |無理しているので、return a >>= k = k a が成り立たなくなってたりしているので注意。
モナドの法則を満たさなくてモナドといえるの?
module RandomProgression where
import Random
data RandomProgression r a = RP (r -> (a, r))
nextRandom :: (RandomGen r, Random a) => RandomProgression r a
nextRandom = RP (\r -> random r)
instance Monad RandomProgression r a where
--(>>=) :: RandomProgression r a -> (a -> RandomProgression r b) -> RandomProgression r b
RP x >>= f =
RP (\r ->
let (a, r') = x r in
let RP b = f a in
b r')
--return :: a -> RandomProgression r a
return value = RP (\r -> (value, r))
書いてみました…instanceでエラーが出ます…わかりません…
↓こんな風に使えたらいいなと思ってる
let (answer, g) = (do a <- nextRandom; return (a `mod` 10)) (mkStdGen 100)
括弧が要るんですね…
instance Monad (RandomProgression r) where
実行用に
eval :: (RandomGen r) => RandomProgression r a -> r -> (a, r)
eval (RP e) r = e r
書き足して
RandomProgression> eval((do x <- nextRandom; return (x `mod` 10)) :: RandomProgression StdGen Int) (mkStdGen 10)
(7,432453652 1655838864)
動いたー!
どうも、スレ汚しごめんなさい
>>733-736 そんなことをする必要はない。
randoms (mkStdGen 1) ::[Int]
のようにして無限乱数列が作れるのだから。
Make use of the power of lazy evaluation !
# あとはそれにmapでもなんでもして加工すればいい。
ハクションと似てなくもないような
>>737 なるほど!遅延評価を忘れてました。
しかしそれでも2個の乱数を取ってきたい時は、let (r1:r2:rs') = rs (以降はrs'から取る) みたく
乱数列を意識して渡していかないといけないような。いや、ずっと書きやすいではありますが。
>>734 知らん。気になるのなら、たとえば、こうすればちゃんとモナドになる。
module Main where
instance (Num a) => Monad ((,) a) where
(>>=) (sub, main) f = (sub+sub', main') where
(sub', main') = f main
return main = (0, main)
>>733 まずちょっと修正...スマソ。
import Monad -- 追加
instance Monad ReadR where
ReadR r >>= fr = ReadR (\str -> [ret| (v,str') <- r str, ret <- fr v `runr` str'])
return v = ReadR (\str -> [(v, str)])
fail s = mzero -- 以下追加
instance MonadPlus ReadR where
mzero = ReadR (\s -> [])
mplus (ReadR f) (ReadR g) = ReadR (\s -> f s ++ g s)
用途としては、下のようなコード(やさしいHaskell 8.3節からコピペ)のtuvwxのような変数を書かなくてもよくすること。それだけです。
>readsTree :: (Read a) => ReadS (Tree a)
>readsTree s = [(Branch l r, x) | ("<", t) <- lex s,
> (l, u) <- readsTree t,
> ("|", v) <- lex u,
> (r, w) <- readsTree v,
> (">", x) <- lex w]
> ++
> [(Leaf x, t) | (x, t) <- reads s]
上のコードのReadR版
>rreadTree :: (Read a) => ReadR (Tree a)
>readsTree s = rreadTree `runr` s
>rreadTree = do "[" <- rlex
> l <- rreadTree
> "|" <- rlex
> r <- rreadTree
> "]" <- rlex
> return $ Branch l r
> `mplus`
> do x <- rread
> return $ Leaf x
>>739 なんかまだ手続き型の頭のような気がする:)
関数型だったら結局繰り返しは再帰で書くんだから、
結局こんな感じになると思う。
f 0 result rs = result
f n result (r1:r2:rs) = f (n - 1) (g r1 r2 result) rs
# f 10 [] randomlist のように使う。
# g で欲しいものを計算。
う、結局が二つも。
>> 740
Num a が気になる
GHCって実はfromIntが無かったりします…?
Variable not in scopeと言われるのですが
>744
気にするな。
747 :
デフォルトの名無しさん:03/07/24 10:52
>>745 fromInteger じゃだめなの?
今のHaskell 98 の Prelude には fromInt は無いのでは。
>>747 いえ、Intからの変換にfromInteger (toInteger n)と書くのが冗長な気がしただけです。
749 :
デフォルトの名無しさん:03/07/29 00:04
>>748 Enum クラスのメソッドが使えるのでわ。
toEnum :: Int -> a
fromEnum :: a -> Int
>>749 FloatやDouble…のつもりでしたが、それらもtoEnumでいけるのですね。
ありがとうございます。そして遅レスごめんなさい
751 :
デフォルトの名無しさん:03/08/02 01:34
ニセ手続き型?の基本的なもなどはなんとなくわかった(というか「同じやん」ということで)
けど、それ以外のモナドがワカンネ。
ライブラリ読んでみたりしたけど激むず。
モナド難しいですね。
ニセ手続き型を理解したあとは、どうしたらよいのでしょうか
GHCのText.Regexで
matchRegex (mkRegex "abc") "xabcx"
=> Just []
matchRegexAll (mkRegex "abc") "xabcx"
=> Just ("x","abc","x",[])
これってバグ?
あ、二つ目は書き間違い。
matchRegexAll (mkRegex "abc") "xabcx"
=> Just ("","abc","x",[])
モナドの問題点とかは特に上がってないのですか?
実行効率周りとか。
GHC 6.0.1 Released
素朴な疑問なのですが Haskell の言語使用はかなり頻繁に変わるものなのでしょうか?
2000年あたりに出版された本で勉強しようかと思っているのですが、それいらい大きく変わったとか、
近いうちに大きく変わるとか、ありますか?
基本はHaskell98から変わってないんじゃないだろうか。
処理系によっては独自拡張があることも。
>>758 サンクスコ。
言語仕様は大きく変わってないから、そのころの本で勉強しても問題ないということですね。
がんばって勉強してみます。
(関数型言語は使ったことがないから、なじめるかわからないけど)
確かに言語仕様はほとんど変わっていないが、
ライブラリがかなり違うような気がする。
ライブラリは階層化ライブラリ(Data.Listとか)
で決まりでいいのだろうか。
標準ライブラリ以外になると混沌としか言い様がない
Hugsもライブラリを2通り持ってるね。
前スレは約一年に使い切ったのに、part2 に移行して少し停滞してます。
(⌒V⌒)
│ ^ ^ │<これからも僕を応援して下さいね(^^)。
⊂| |つ
(_)(_) 山崎パン
767 :
デフォルトの名無しさん:03/08/19 11:49
6.0.1入れたらwxHaskellが使えなくなっちまった
win de GUI no hito mada-?
769 :
デフォルトの名無しさん:03/09/12 15:05
The Haskell School of Expression
ってどんなかんじ?
OOのは純粋型(SmallTalk)->混合型(C++/Object Pascal)->ほぼ純粋型(Java/C#)
って進歩してきてどんどん扱いやすくなってきたんだけど、
純粋型は純粋型としてがんばってもらうとして
副作用ありありなJava/C#的にミーハーなほぼ純粋型関数型言語ってないの?
ML系がそうかな。
OOの最初はSimulaで、混合型じゃないか?どうでもいいけど
lisp scheme ...
774 :
デフォルトの名無しさん:03/09/14 11:12
コンパイルするくせにrubyよか遅かったきがするのだが、、、
同様の条件下でやったのか?
最適化オプションは?
頭の隅にでも公平に比べようという気はあった?
776 :
デフォルトの名無しさん:03/09/14 22:54
777 :
デフォルトの名無しさん:03/09/15 01:26
777
Hugsのサイトが壊れとる
779 :
デフォルトの名無しさん:03/09/15 11:04
>>774,776
http://www.bagley.org/〜doug/shootout/bench/ackermann/
そこのCRASPはMissingの場合大きくポイントを下げるくせに、
Missingをはずした評価ができない。
実際には多くの場合、Rubyは実行速度は非常に遅いグループに
属している。
lazy だとあまり最適化できないのかな?
箱(変数)を用意しておいてその中身を変えていく、というプログラムスタイルに頭がこりかたまっているためか、 Haskell でのプログラムは難しい。
hws-wp 動かした人いる?
783 :
デフォルトの名無しさん:03/09/24 15:13
Haskellのモナドって要はマクロのことではないでしょうか?一見ライプニッツのモナド論を彷彿とさせますが、英文の資料を
読むと、モナドはベルトコンベヤーで関数プログラムが部材に相当すると書いてありました。COBOLのJCLみたいな雰囲気?
関数プログラムの文法の上にマクロ文法が重層的に入り組んでおりかつかなり異質で複雑だから、こんがらかるような気がします。
確かに関数構造の純粋性を保つ一方法かもしれませんが、凝り過ぎの感もあるような?
でも言語仕様的にはかなり優れたものであることは間違いありません。
プログラマーの頭脳がその重層性について行ければ・・・・・。
OO指向でもなかなかというレベルの方々が果たして、言語構造そのものまで抽象化するような言語を使いこなせるのか?
ライブラリーの数がぁ・・・とか分かり易い解説書がぁ・・・とか言うレベルではなく、一般のプログラマーの知能的な構想力が追いつかない。
従ってかなり本質的な意味で頭の良い人向けの言語でしょう。
(非本質的な意味で頭の良い人って?安部新幹事長とかさぁ・・・笑い)
しかし関数構造部分の文法的簡潔さVSモナドの構造的複雑さ・・・これがHaskellの魅力です。マイナーな言語で居て欲しい。
そのペダンティックなところを失わないで欲しい。Rubyのようにポピュリズムに迎合しないでぇ!(笑い)
使っているだけで、プログラマーの知的ステイタスを 証明してくれる言語ってあまりないでしょう?
「サルでも分かる」Javaばやりの中でこの人を寄せつけない姿勢は貴重です。分からん奴は触るな!これが良い。
マシーンにも人にも厳しい言語です。
でもこれを自分でチューンアップして使いこなしている人の知的生産性はF1並の性能ですね。そんな人が日本に
居るのか?居ればとっくに本が出てるはずだよね。いやその本を理解する奴が居ないから出版社も・・・
784 :
デフォルトの名無しさん:03/09/24 15:31
久しぶりに書き込みがあったと思ったら電波かよ
カテゴリーの正確な意味は上のリンクに書いてある三つの定義の通りですね。
Haskellプログラムにおけるどんな要素がオブジェクトや射と
といったカテゴリー的関係にあるのかってことです。関数間の関係?
んー厨房には分りませぬ。
>>788 知らないんならレスするなよ低脳。
あとscheme違いだ(w
790 :
デフォルトの名無しさん:03/09/24 17:31
>>788 数学で言うところのSchemeやMotifとかって言語やライブラリのそれと
なんか関係あるんですか?それとも後からそう名づけたひとはただの電波ですか?
>>790 トポスを作った人間は数学のスキーム論を作った人間と同じだよ。
50年代の半ばから70年頃までの話ね。
>>791 闘う数学者が電波のわけはありません。
むしろ言語やライブラリの作者の方にビビビっとそれを感じるわけです。
793 :
デフォルトの名無しさん:03/09/24 23:10
>>784 HaskellのFunctorクラスやMonadクラスは、
データ型を対象、その間の関数を射とする圏を考えて、
データ構築子を関手、多相関数を自然変換として扱ってる。
>>793 おっと、データ構築子じゃなくて型構築子でした。スマソ。
796 :
坂本 和樹:03/09/25 14:07
797 :
デフォルトの名無しさん:03/09/25 15:00
どっちもわけわからん
型一意性とモナドは両立するんでは?
所詮は糊言語。糊付け効率が多少高いくらいで他のメリットは皆無だな。
>>802 "Why Functional Programming Matters" に出てくる "glue" の意味がよく分かってなくて
Perlなんかで言われている "glue language" と混同しているのさ。
>To assist modular programming, a language must provide good glue.
>Functional programming languages provide two new kinds of glue - higher-order
>functions and lazy evaluation.
( ´_ゝ`)フーン
nobsun さんのサイトは、配色がちかちかしていて、目にきつい
こんなところで言うべきことではないかもしれないが。
ちなみに環境はWindows 2000 のIE6 です。
>>805 同意。
もう少し字の色を濃くして欲しいなあ。
>>807 ちょっと使ってみましたがMac OS Xじゃほとんどまともに動かんです...
最近、勉強中なので、しゅ。
0〜9を1つずつ使った平方数を全て出力する関数を以下のように書きました
main = print list
list = [ x * x | x <- [min..max], iSort (show (x * x)) == "0123456789" ]
where
min = toInteger(truncate (sqrt (fromInteger 1023456789)))
max = toInteger(floor (sqrt (fromInteger 9876543210)))
iSort xs = foldr ins [] xs
where
ins x [] = [x]
ins x (y:ys)
| x <= y = x : (y:ys)
| otherwise = y : ins x ys
0〜9を全て使っていることを確認するために,数を一度文字列に変換して
ソートして "0123456789" と比較するため少々遅いのですが,
もっとうまい方法はないでしょうか?
普通、0〜9の順列並べ替えを行って、
それぞれで平方数かどうか確認するんじゃないの?
数値への変換も並行してできるし。
>>811 順列の並び替えのうまい書き方が分かりませんでした
どうやって書けばいいでしょう?
ちなみに,1023456789 〜 9876543210 を文字列化してソートして0〜9の順列か判定し
平方根を取って整数かどうか判定して…
とやる方法も試してみましたが,上の方法よりさらに遅かったです
>>812 import List
list :: [Double]
ans :: [Int]
ans = map truncate $ filter is_square list
list = map read $ patterns0_9 where
patterns [] = [[]]
patterns xs = [x:y| x <- xs, y <- patterns (delete x xs)]
patterns0_9 = [x:y| x <- ['1'..'9'], y <- patterns (delete x ['0'..'9'])]
is_square x = root == (fromInteger $ truncate root) where
root = sqrt x
--
とりあえずこのように組んでみたんだが、、、
9*9! = 3265920 -- 0..9の組み合わせ数
sqrt(98..0) - sqrt(1023..9) = 67389 -- それの平方根の範囲
ということで非常に遅いのに加えて、
>Main> floor (1023456789 :: Double)
>1023456768
精度不足っぽい。
なので、とりあえずソートを外してこんなのはどうか。
module Main where
import List
min = truncate (sqrt (fromInteger 1023456789))
max = floor (sqrt (fromInteger 9876543210))
lista = [ x*x | x <- [min..max], is_use_all (show (x*x))]
-- 0..9が全て含まれているはずなので、0..9を一つづつ消去->[]と比較
is_use_all x = [] == delete0_9 x where
delete0_9 :: [Char] -> [Char]
delete0_9 = foldr1 (.) $ map delete "0123456789"
-- 0..9全て使わなければどれがが重複するはずなので、それを調べる。
listb = [ x*x | x <- [min..max], is_uniq (show (x*x))]
is_uniq [x] = True
is_uniq (x:xs) = notElem x xs && is_uniq xs
--
まあ、あまり変わらないようだが。
32 ビット整数だと10桁はピンチだな。
1. 引数2つの関数を作る。
2. 第一引数には 0 を、第二引数には 0 〜 9 までの値を入れたリストを渡す。
3. リストが空なら第一引数に目的の数が与えられる。
4. リストが空でなければ、リストの中から1つ値を選ぶ。
5. 第一引数×10 + 4. の値 を第一引数に、4. の値を除いたリストを第二引数に渡す。
>>813 試してみました
文字列化して挿入ソートしていた list も混ぜて比較して
listb > lista > list
という結果になりました
体感的にも listb が他と比べて若干速いようです
0〜9の順列を先に生成して sqrt を取ってみる方法は
解を探索する空間の広さからして実用的ではないようですね
>>815 Cygwin で Hugs を使ってみた限り
整数演算で済ます限りかなりの長桁計算でも出来るようです
順列のプログラムを書いてみました
p は [0..9] や "0123456789" などのリストを引数にとり,
["0123456789", "0123456798", .. , "9876543210"] などの順列のリストを返します
p = permutation
permutation' [] = [[]]
permutation' xs = foldr (++) [] (map f (rotate_list xs))
where
f (x:xs) = map (x:) (permutation' xs)
rotate_list xs = take (length xs) (iterate rotate_left xs)
where
rotate_left [] = []
rotate_left (x:xs) = xs ++ [x]
permutation [] = [[]]
permutation xs = foldr (++) [] (map f (selected_list xs))
where
f (x:xs) = map (x:) (permutation xs)
selected_list xs = take (length xs) (zipWith select (repeat xs) [0..])
where
select [] _ = []
select xs n = z : ys ++ zs
where
(ys,(z:zs)) = splitAt n xs
上の permutation' は速いですが順列が昇順に出力されません
下の permutation は昇順に出力されますが,
splitAt のあたりが遅いのか,速度で劣ります
もう一つ,
http://pc2.2ch.net/test/read.cgi/tech/1067175933/734 ここの C で書いた方法を参考にさせて頂きましたが,
hoge に当たる部分で破壊的な操作を行っているので
その代わりに hoge の状態を引数で渡すように書こうとしましたが
うまく書けませんでした
他にうまくやる方法はないでしょうか?
import List
permutation [] = [[]]
permutation xs = concat [map (x:) $ permutation (delete x xs) | x <- xs]
これでは遲くてやってられんてこと?
なるほど delete は強力ですね
速度的にもうちの環境で長さ8のリストを引数に与えた結果
22 (rotate_list)
25 (selected_list)
20 (delete)
と最速なので全く問題ないです
何で delete は Prelude に入ってないのでしょうね?
in "The Haskell 98 Library Report"
> リストユーティリティ
> このライブラリはリスト上のあまり使用頻度の高くない演算を定義している。
>>822 deleteの2倍以上速いと思う。
permutations :: [a] -> [[a]]
permutations (x:xs) = concat $ map (insap [] x) $ permutations xs
where
insap :: [a] -> a -> [a] -> [[a]]
insap xs y (z:zs) = (xs ++ [y] ++ (z:zs)):(insap (xs ++ [z]) y zs)
insap xs y [] = [xs ++ [y]]
permutations [] = [[]]
なんか急に、盛り上がってきた。
「Paul Hudak: The Haskell School of Expression」
この本は最新の haskell コンパイラーだと動かないコードもあるそうですが、
どのくらいの割合で動かないのですか?
どこかのサイトに修正コードがまとまって置かれていますか?
826 :
デフォルトの名無しさん:03/11/14 09:05
>>823 insap xs y zzs@(z:zs) = (xs++y:zzs):insap (xs++[z]) y zs
とやると僅かだけど、早くなるかも。
permutation xs = p xs []
where
p [] [] = [[]]
p [] ys = []
p (x:xs) ys = (map (x:) $ p (xs ++ reverse ys) []) ++ p xs (x:ys)
deleteより少し速い。xs ++ reverse ysを効率的にやればもう少しいけるかもね。
Haskellよく知らないけど前にLispでやったから多分
permutation' [] = [[]]
permutation' xs = foldr (++) [] (map rotate_list (f xs))
where
f (x:xs) = map (x:) (permutation' xs)
rotate_list xs = take (length xs) (iterate rotate_left xs)
where
rotate_left [] = []
rotate_left (x:xs) = xs ++ [x]
なぜかC/C++スレにリンク張られてるな
末尾再帰はループになるのかな?
selected-list xs = p xs [] []
where
p [] ys r = reverse r
p (x:xs) ys r = p xs (x:ys) ((x:((reverse ys) ++ xs)):r)
>>832 うちの環境ではdelete版の方が速いみたい
permutation [] = [[]]
permutation xs = p xs [] []
where
p [] ys r = r
p (x:xs) ys r = p xs (x:ys) (r ++ (map (x:) (permutation ((reverse ys) ++ xs))))
delete版と同じくらいの速さになりました
処理系もってないんで、applyとか関数生成とか分からないけど、誰か試してみて。
permutationの再帰は減らしたから速くなってるはず。
permutation [] = [[]]
permutation (x:xs) = p x (permutation xs)
where
p x ys = apply ++ ((map (x:) ys):(map (hoge x) ys))
where
hoge x [] = []
hoge x (y:ys) = map (y:) ((x:ys):(hoge x ys))
>>830 これで動くはず。昇順じゃないけど。
permutation' [] = [[]]
permutation' (x:xs) = foldr (++) [] (map rotate_list (map (x:) (permutation' xs)))
where
rotate_list xs = take (length xs) (iterate rotate_left xs)
where
rotate_left [] = []
rotate_left (x:xs) = xs ++ [x]
>>837 apply (++) ((map (x:) ys):(map (hoge x) ys))かな?
(hoge x)じゃダメなのかな。
permutation [] = [[]]
permutation (x:xs) = p x (permutation xs)
where
p x ys = foldr (++) [] ((map (x:) ys):(map (hoge x) ys))
where
hoge x [] = []
hoge x (y:ys) = map (y:) ((x:ys):(hoge x ys))
ごめん。837のやり方じゃ昇順にならないわ。
この中じゃ結局どれが最良なんだろうね
・分かりやすさと効率と
・昇順出力するものとしないもの
> import List
>
> permutation [] = [[]]
> permutation xs = concat [map (x:) $ permutation (delete x xs) | x <- xs]
私は昇順出力かつ分かりやすいこれを推すけど
ソートできるものだったら
昇順出力せず+ソートのほうが速いんじゃない?
842 :
デフォルトの名無しさん:03/11/21 23:23
emacs(Meadow)上でhugsを使いたいのですが,マニュアル通りにやったはずなんですがうまくいきません.
C-cC-sとすると,no such file or directory, hugs と出るのです.
haskell-hugs.elを書き換えたりしないとだめなんでしょうか?
Hugs98,haskell-mode-1.44を使ってます.
教えてください.
小数点が関数合成の演算子と見なされるのがいけてないね
>>844 (゚Д゚)ハァ?
日本語分かってますか?
>>846 a = 0.05
の . の色が変わるんだぜ?
843=845=847の頭と使っているエディタがいけてなかったと。
>>849 haskell-mode-1.44 だが?
>>851 普通に小数点としてコンパイルできるよね?
> Hugs98,haskell-mode-1.44を使ってます.
だとできないの?
もしかして843(=847)はhaskellの言語仕様ではなくて
haskell-mode-1.44がいけてない、って書き込んだのか?
844, 846の意味が分からないな。
"."と" . "の扱いを変えるだけだと思うのだが。
>>853 hugs と haskell-mode の環境で
Emacs 上のどの操作がコンパイルに当たるのか分からなかった…
>>854 識別子に . を含めないから f.g と f . g は同じだよ
>>855 なっとく。
>>857(=844, 846)
意味わからん。
ちなみに、少なくともghcでもhugsでも0.5は0 . 5とは認識されないが?
859 :
デフォルトの名無しさん:03/11/23 00:28
haskell-modeにはちゃんとなるけど,hugs-modeにならないから困ってるんですよ
>>858 関数合成演算子の前後に空白文字は要らないから
関数合成の f.g と小数の 0.5 を区別するには . の前後を見なければならないということ
861 :
デフォルトの名無しさん:03/11/23 11:22
とっても高機能な haskell-mode なら、型チェックしてくれたり。
なんてことないよね。
>>860 識別子を構成する文字に.が含まれないといいたかったわけね。
でもそれは"f.g"が一つの識別子と見なされないということを
いってるだけだ。"f.g"が"f . g"と同じかどうかとは別の話。
# だからF.g は F . gではない。
Hugs Nov.2003版がリリースされました。
ghc と hugs はどっちのほうが使われているの?
hugs のほうは専用のMLがないみたいだから、活発度が今ひとつよくわからない。
>>863 報告ども。これから弄ってみます。
……なんか.NETがどーとか言ってるし。>Hugs
866 :
デフォルトの名無しさん:03/11/27 11:14
>>864 script interpreterとして使うなら Hugs が便利、ヒアドキュメントも使える
(ただし、ヒアドキュメントを使うとほかのHaskell処理系と互換性がなくなる)
対話環境でよくて、はやくなくちゃいやなら ghci
対話環境で、関数定義とかしたければ、ghci
コンパイルが面倒でなければ、ghc
かな。
Hugsは、そろそろ対話で関数定義が出来るようにならないのか?
ghciでいいじゃん
869 :
デフォルトの名無しさん:03/11/27 16:05
関数定義かけるっていったって、一行で全部定義かかなきゃなんないから、
あんまりありがたみないような。
>>869 簡単なシェルスクリプトとかババーって10行ぐらい書いたりしない?
Haskellの関数はえっちらおっちら書いてるおれとしては、そう
簡単にはいかないけど、エキスパートの人なんかはそんなもんなんじゃないの?
871 :
デフォルトの名無しさん:03/11/30 01:13
リストの末尾から n 番目の要素を取得するにはどうすればいいでしょうか?
>>872 "reverse l !! 2" が "l !! (length l - 2)" より良いとおもう。
reverse l !! n ね。
>>873 "l !! (length l - n)"
今はこの方法でやっています
> reverse l !! n
の方がいいのは何故なのでしょう?
どちらもリストの全要素に触ると思うのですが
>>875 前者の場合、"length l - n"が完全に求まってから全体が計算されるが、
後者ではlazinessのおかげで、"reverse l"全部がconstructされることなく
headが次々に"!!"に渡されるので、多少速い…と思う。
しかしながら、nがlの長さより大きいときは、前者のほうが無駄な計算をせずに
エラーを出してくれる。
あと、前者はindexが1から、後者は0からですね。
>>875 "l !! (length l - (m - 1))"
=> (1 + (1 + (1 + ..(1 + 0))) という(評価の)リストをつくる。
=> 足し算
=> N
=> N - (m + 1) => k
=> 元のリストをk 番目までたぐって要素をかえす。
"reverse l !! 2"
=> (l_N : (l_{N-1} ( ...(l_1:[]))) というリストをつくる(もう元のリストは不要になった)。
=> m 番目までたぐって要素を返す。
の違い。
ただこれはlengthが標準のPreludeと同じ再帰で定義してある場合。
実はhugsもghciもfoldl'なんかをつかってるみたいで、
最初の(1 + (1 + ..))ではメモリがつかわれないね。
もちろん足し算はするけれど。
sampou.org の haskell メーリングリストのアーカイブは公開されていますか?
MLに参加すれば、パスつきとかで見られるようになるの?
ここでCleanの話もしていいですか?
本スレがあんな事になっちゃったんで、
>>878 なぜここで訊く? sampou.orgで直接訊いて下さい。
>>879 あなたは「スレ違いの話をしてもいいですか?」と訊いてるわけだ。
もう一度よく考えな。
ところで本スレってどこ?
>>878 メンバか一般かにかかわらず公開されてないみたい
>>880 関数型言語スレでしょ。もうすぐここにも・・・。
何を今更
GHC 6.2がリリースされました。
887 :
デフォルトの名無しさん:03/12/17 23:13
myShow :: Int -> String
myShow 0 = "0"
これでヒントになるかな
> ghc-6-2-1.msi (~38.2 Mb)
サイズでかすぎじゃないですか?
非常に低レベルで申し訳無いのですが、以下 GHC について勘違いしていたら
教えて下さい。
A. マルチスレッド処理が出来るので、応答性の良いプログラムが書ける。
B. コンパイラでネイティブコードコンパイル出来るから、実行速度も稼げるし、
プログラムの配布も楽。
C. インタープリタで対話的にコーディング出来るから、プロトタイプ作成にも
向いている。
D. UNICODE 文字をサポートしているから、頑張れば日本語も扱える。
E. ccall や FFI プリプロセッサで C のライブラリも比較的簡単に呼び出せる。
891 :
ヒーロー勇気:03/12/21 18:05
>>890 UNICODE文字をサポートしてるって?
>>892 どうもありがとうございます。
昨日から Hakell の勉強を始めたのですが、ドキュメントを読みつつ、何が出来るのか
学習中です。これから色々試してみたいと思います。
>>887 ヒント(つーか答):
1234 ÷ 10 = 123 余り 4
123 ÷ 10 = 12 余り 3
12 ÷ 10 = 1 余り 2
1 ÷ 10 = 0 余り 1
>>889 gccを含んでますからね、win版は。
GHCの出力って、VC++でコンパイルするのは大変?
Haskell って変数の束縛出来ないの?
>>896 値を束縛せずにどうやって、というか何を計算するんだよ…
変数がない言語はFPくらいかな
あれはあれで無理がありまくり
誰からそんなこと聞いたんだよ。
>>899 バッカスたんの論文読みますた
漏れがFPというってるのはそういう名前の言語。
Cマガジンの連載記事「学問のススメ 千言万語」でも紹介されてたよ
「FP -- 変数のない言語」みたいな感じで
>>902 確かにずれてるかも。Haskellに変数がないとまでは普通思わないし。
ひょっとして
>>896は同じ記号で新しい束縛をつくれないと勘違いしているのかな
>>901 その記事は立ち読みでタイトルしか見てないからあてになるかどうかは知らん。
漏れはオリジナルの論文を読んだだけ。
CマガにFPの記事なんか載るんだ、へー
905 :
デフォルトの名無しさん:03/12/29 14:29
このスレを拝見致し、是非Haskellを勉強したい!
と発奮しHUGS98インタープリターNOV03をWin98に
インストールしました。
DOS窓のHugs.exeは:
Prelude> print "今日は"
"\141\161\147\250\130\205"
Prelude> putStr "今日は"
今日は
このように、putStrであれば日本語が
通ります。ところがWinhugs.exeでは
putStrでも文字化けしてしまいます。
FontChangeを確認しましたが、MSゴシックで
日本語が正しく例示されております?
念の為
module Main (main) where
main = putStr "今日は"
を:loadして試して見ましたが、やはり文字化け
しております。
これを解消する方法があればご教示頂きたく、
よろしくお願い致します。
906 :
デフォルトの名無しさん:03/12/29 20:18
>>905 意味不明。Haskellより先に日本語から勉強してね。
>>905 HaskellのCharはUnicode値を保持するが、IOはByte by Byteで読み書きする。
文字コードの自動判定はしない。だからそうなって当然。
日本語を扱いたい場合は読み込んだ後に変換する必要がある。
UTF8を扱うモジュールはあるので必要ならググれ。
「FP」は固有名詞で「関数型言語」は一般名詞。
「FPは関数型言語の一種でしかない」といったほうがわかりやすいか。
896が何を根拠に Haskellでは変数の束縛できないといってるのかわからんが。
909 :
デフォルトの名無しさん:03/12/30 16:37
>906,907
DOS窓版でputStrで日本語が通るのに、なんでWin版に反映して
ないの?と言う極シンプルな質問を「丁寧に」お伺いしておるのですが?
なお、とうとうHaskellまで関数型言語のコラムで紹介を始めた、
下記HPの作成者とはなんのつながりもありませんので、念の為(藁藁)
ttp://homepage3.nifty.com/Aransk/ 「な〜んだ、それじゃあ、DOSでやってろぉ!」なんて冷たい返事は
しないでね。(微笑)
↑宣伝
以降放置で。
>>909 ようするに俺の言ってる意味がわからなかったわけね。
DOS窓でlength "日本語"ってやってみな。6と返るから。
日本語が通ったように見えてるのは、8バイトずつそのまま出力されたものを
日本語専用のDOS窓が勝手に日本語表示してるだけなんだよ。
人に物を尋ねる態度ぐらい覚えろ厨房。
訂正 911=907, 8バイト => 1バイト
>>911 残念ながら 909 はただの厨房ではないような気配がします。おそらくちょっと前に関数言語系スレで猛威を振るった
アレでしょう。こーゆう場合 909 は普通「ごめんなさい。私がド厨房ですた。」と謝るか、恥ずかしさで消えるしなかいわけだが…。
アレだ、冬だな。
915 :
デフォルトの名無しさん:03/12/31 08:45
>911
おらぁ、はぁー、唯の厨房だんが、
そんなら
>DOS窓のHugs.exeは:
>Prelude> print "今日は"
>"\141\161\147\250\130\205"
printではちゃんとエスケープされてんだが、何でだべ?
916 :
デフォルトの名無しさん:03/12/31 09:02
>913
ム板だけではなく、上の中東情勢板でも結構暴れたらしい?(藁)
ム板と中東板を往復するのは、管理人だけなのにって
西村クンが嘆いていたそうな。
ところでヤフーの年間人気サイトで2ちゃんが表彰されていた。
まずはご同慶の至りです。
でも西村くんってちょっとヤバそうな顔してるね。
あの手の顔はいったん切れると無茶苦茶、恐いか、メッタメタ
オモロイ!かどちらかだな。(藁藁)
なんで有名人が精神病の人間に襲われる事件が起こるのか
なんとなくわかってきたぞ。
管理人の中の人も大変だな。
>>913 アレっぽいね。無視します。それにしても頭悪いなこいつ。
これでまた妄想が膨らむんだろうな…
919 :
デフォルトの名無しさん:04/01/01 15:31
>917,918
>なんで有名人が
???これには、新年早々ワラエタ!
いつから2ちゃんの管理人が有名人になったの?
キャバクラのバーテンが昼間に叩き起こされたような
写真が週刊誌に載っただけで有名人って言うんだぁ。
最近は。(藁藁)
>無視します。これでまた妄想が膨らむんだろうな…
これにもワラエタ、が、どうぞご心配無く…。
でもLuaじゃないよ。(微笑)
いやいや、ひろゆきは十分有名人だろ。
お前みたいな基地害に逆恨み粘着されるくらいだから。
つーか、脳内管理人との脳内バトルに浸られるのは結構ですが、
さっさと施設に帰れよ。一時帰宅は三ヶ日の間しか許されてないんだろ?
スンマせん。トリビアルでも良いので、破壊的代入を行う方法があったら知りたいなと
思って書きました。実アプリの設定なんかは、多くの場合状態をスイッチさせるような
処理になると思うのですが(例えばフォントの種類を変えたり、表示する色を変えたり)、
そういう場合はどうするのかなと。
代入を使わずに、引数渡しとかにするのかな。
>>921 基本的には引数でわたす。
しかし、大域的な設定を引数で奥まで渡し続けるのは確かにやってられないので、
対処方があって、
1) モナド
2) implicit parameters (GHC拡張)
3) unsafePerformIO
が使われてる。3はほぼ論外として、1が多少面倒だが正当な方法。
俺はoptionなんかにはimplicit parametersを使ってる。名前の通り、
引数として渡さなくてもよくて、呼ぶ側でdinamicに束縛できる。
GHCのuser guideを読むといいだろう。
GUIについては、外部ライブラリを利用するのでIOモナドが多いかも知れない。
> トリビアルでも良いので、
トリビアルの意味わかってる?
dynamic....
>>922 どうもありがとうございます。
引数渡しを徹底するのはしんどいなぁと思ってました。GHC を使っているので、
implicit parameters を調べます。ありがとうございます。
>トリビアルの意味わかってる?
トリッキーの間違いでした。
「互いに素」がわけわからん
_| ̄|◯
小学生?
>>926 最大公約数が1な状態を互いに素という
さすがに最大公約数はわかるよね?
>>928 「互いに素」の数学的な意味は理解してます。
さぱーりなのは nobsun さんのところにある「互いに素」です。
http://www.sampou.org/cgi-bin/cahier.cgi ここの↓のことか?
ss = (False : True : cycle [False]) : [cycle [m !! n | m <- take n ss] | n <- [1..]]
縦の列を取ってきて横の行を作ってる。
0番目の行がFalse : True : cycle [False]になって
1番目の行は1番目の列を取ってきて繰り返す。cycle [True]
2番目の行は2番目の列を取ってきて繰り返す。cycle [False, True]
3番目の行は3番目の列を取ってきて繰り返す。cycle [False, True, False]
n番目の行はn−1番目までの行のn番目の列を取ってきて繰り返す。
take n ssがn−1番目までの行を取り、m !! nがn番目の列を取る。
n−1番目までの行が互いに素を判定できるとしたら、n番目の列を取ってくれば
n番目の行もn−1番目まで判定できるし、あとは繰り返しで互いに素を判定できる。
一年以上前に既出だったのか。
発売予定日もコピペしたらよかったのに。
934 :
デフォルトの名無しさん:04/01/14 16:54
hugsのバグなのかな。
僕の環境では以下のプログラムがおかしな挙動をします。
% cat test.lhs
> main = putStrLn $ "あああ" ++ show 1000 ++ "ああのののののののの"
% runhugs test.lhs
あああ1000ああのののあああ1000ああのののののののの
おそらくhugsの日本語への対応が十分でないためだと思うのですが、
よくわかりません。
他の環境でも同じような不具合が生じるかどうか知りたいです。
そして自分の環境は書かないわけか・・・
936 :
デフォルトの名無しさん:04/01/14 17:17
自分の環境はlinuxでウィンドウマネージャーにはgnomeを使ってます。
ターミナルエミュレーターはxtermです。
hugsのバージョンはNov2002だと思います。
もし、参考になるのなら。
938 :
デフォルトの名無しさん:04/01/14 18:59
そうですか。
どうもありがとうございます。
そうすると、hugsだけの問題ではないのかもしれません。
ちなみに文字コードはeuc-jpです。
あと、素のコンソールでは、もちろん日本語は化けますが、
この問題は生じないようです。
さらに参考までに、ghcでコンパイルして実行した場合にも
問題は生じません。
またrunhugsを使わないでhugsでmainを実行しても
問題なく表示されます。
他のひとも同じような問題が生じてれば、誰かに解決してもらえるかな
と思ったのですが。
ゆっくりと解決策を考えようと思います。
>>938 > あと、素のコンソールでは、もちろん日本語は化けますが、
だったらshellが悪いんでは。ファイルに吐いてみた?
shellじゃなくてterminalだ。
941 :
デフォルトの名無しさん:04/01/14 20:30
素のコンソールというのが正しい表現かどうかわからないんだけど、
xwindowとかkonとか使わない状態のあの黒い画面のことです。
それだと、日本語は使えないですよね。
わかりにくくてすいませんでした。
ファイルに吐いてみるのは思いつかなかった。
かなり基本的なことなのに。
やってみた結果、正しい結果になりました。
直接表示するとうまくいかないのは何故だろう。
942 :
デフォルトの名無しさん:04/01/14 21:41
あたまでっかちな、実用的でないスレはここですか?
The Prelude contains a number of classes defining monads *and*
they are used in Haskell.
Preludeにはモナドを定義するclassがいくつもあり、
それらはHaskellでつかわれています。
だと思う。
haskell-mode 1.44 使ってるいます。
if 文の then の下に else を改行してくれないとか、あと case 文とか let
の後の in 等、本などで見る通りのインデントにならないことがあります。
haskell-mode を使ってる人はどうしてますか?
便乗して質問なのですが、haskell-mode 1.44 の以下のキーが
よく分かりませんでした。
これらは何の機能でどういう時に使うのでしょうか?
(local-set-key "\C-cl" 'fume-list-functions)
(local-set-key "\C-cg" 'fume-prompt-function-goto)
(local-set-key [(meta button1)] 'fume-mouse-function-goto)
(local-set-key [C-S-M-mouse-3] 'haskell-doc-ask-mouse-for-type)
(local-set-key "\C-c>" 'haskell-indent-put-region-in-literate)
948 :
デフォルトの名無しさん:04/01/22 15:39
>931
亀レス、失礼。
管理人のオッチャンから、アクセス規制をくらっておりまして…。
ようやく、無罪が立証されたんで質問です。(^^;
今話題の本のHUG版を読んでおりますが、噂ではそのHELLIUM版が
出るとか出ないとか?誰かご存知であれば、教えて下さい。
>>948 あの本は HUG をベースにかかれているのですか? GHC ではなく。
>>949 second editionを見る限り、処理系依存の
処理をするときはHugsを使ってる。
でも言語的にはHaskell98を扱ってるので
GHCでも特に困ることはないと思う。
そろそろ新スレ。
>>1 に
>>2 も張っておきましょうよ。
リンクで飛びやすいように。
あと、紛らわしいですが、次は part 3 のようですね。
この2年の間に日本語の本一冊ぐらいでるかと思ったけど
話しすらでなかったな
>953
漏れも、その内出るさ、と思ってたんだが……。
nobsun書いてくれないかな。
956 :
デフォルトの名無しさん:04/01/29 14:09
HUGのNOV03版に
Integrated .NET support (on Windows).
との注釈が入っていますが、どなたか
.NET環境で使用された方は居られますか?
(確かに02版に比べてWINのバイナリーが異常に
大きくなっています。)
HUG って何ですか? 抱擁ですか?
959 :
デフォルトの名無しさん:04/01/29 18:20
Haskell User's Gofer System
960 :
デフォルトの名無しさん:04/01/29 23:33
ひょんなことからHaskellに興味を持った文系人間です。
今
ttp://www.sampou.org/haskell/tutorial-j/index.html などを見て勉強しているのですが、これを見ていくうちに、
Haskellの文法だけでなく、その基礎を成す数学についても
勉強したいと思いました。
そこで、このスレのHaskellな方々にお聞きしたいのですが、
Haskell(又は関数型言語)を理解するために必要な数学の
分野について教えて頂けないでしょうか。自分が必要だと
感じているのは、集合論や論理学です。もし間違いでしたら
すみません。
>>960 ホントに直接の基礎となっている理論は、λ計算とカテゴリー論(圏論)。
集合論や論理学もその二分野のベースみたいなもんだから、おっしゃる
通り必要と言えると思う。
スタートとしては、λ計算と論理学を行ったり来たりしたりして勉強する
のがいいんじゃないかなぁ、と。半分個人的な趣味ですが。
>>961 アドバイスありがとうございます。
まだ「λ計算??圏論??」という状態なのですが、
少しずつ基礎からやってみます。(高校時代に
数学を真面目に取り組まなかった事を後悔&反省
しながら・・)
963 :
デフォルトの名無しさん:04/01/31 18:57
>957
>HUG って何ですか? 抱擁ですか?
懐かしいジョークですね?そう言えば○○××って
あったなぁ。UCLAのトイレにも落書きされてた。
(古賀さんも知ってる?藁藁)
でも、HASKELL.Netってどうやって使うんだろう?
とりあえず.Net SDKかなんか入れないと駄目なんだろうか?
>>960 >>962 高校の数学ではλ計算とかカテゴリー論なんてやらないっしょ。
大堀淳先生も文系だった訳だし。