関数型プログラミング言語Haskell Part5
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2006/06/03(土) 00:53:50http://www.haskell.org/
日本語サイト
http://www.sampou.org/cgi-bin/haskell.cgi
http://www.geocities.jp/shido_takafumi/hs/
過去ログ
関数型プログラミング言語Haskell
Part1 http://pc.2ch.net/tech/kako/996/996131288.html
Part2 http://pc2.2ch.net/test/read.cgi/tech/1013846140/
Part3 http://pc8.2ch.net/test/read.cgi/tech/1076418993/
Part4 http://pc8.2ch.net/test/read.cgi/tech/1140717775/
関連スレは>>2
関連書籍は>>3
0002デフォルトの名無しさん
2006/06/03(土) 00:55:37・関数型言語Part IV
http://pc8.2ch.net/test/read.cgi/tech/1083649982/
・【数学者】Haskellはクソ言語【オナニー】
http://pc8.2ch.net/test/read.cgi/tech/1128011645/
・純粋関数型言語Concurent Clean
http://pc8.2ch.net/test/read.cgi/tech/1075629340/
・関数型言語ML(SML, OCaml, etc.), Part 4
http://pc8.2ch.net/test/read.cgi/tech/1133003340/
・Common Lisp, Scheme Part 14
http://pc8.2ch.net/test/read.cgi/tech/1132275726/
・【入門】CommonLispその2【質問よろず】
http://pc8.2ch.net/test/read.cgi/tech/1140012484/
・Emacs Lisp 2
http://pc8.2ch.net/test/read.cgi/tech/1068467385/
・F#相談室
http://pc8.2ch.net/test/read.cgi/tech/1054523453/
0003デフォルトの名無しさん
2006/06/03(土) 00:56:48・Introduction to Functional Programming Using Haskell
http://www.amazon.co.jp/exec/obidos/ASIN/0134843460/
・Haskell: The Craft of Functional Programming
http://www.amazon.co.jp/exec/obidos/ASIN/0201342758/
・The Fun of Programming
http://www.amazon.co.jp/exec/obidos/ASIN/1403907722/
・The Haskell School of Expression: Learning Functional Programming Through Multimedia
http://www.amazon.co.jp/exec/obidos/ASIN/0521644089/
・入門Haskell
http://item.rakuten.co.jp/book/1794880/
・ふつうのHaskellプログラミング
http://item.rakuten.co.jp/book/4052963/
0004デフォルトの名無しさん
2006/06/03(土) 01:04:030005デフォルトの名無しさん
2006/06/03(土) 01:04:52┏┫┃┃┃ うんこは. ┃┃┃┣┓
┃┃┃┃┣┓ ここまで ┏┫┃┃┃┃
┃ ┃┃┏━━━┓┃┃ ┃
┃ うんこ. ┣┫ . ・∀・ ┣┫. STOP!┃
┗━━━━┛┗┳━┳┛┗━━━━┛
┏┻┓┃
┏━┛ ┣┻┓
┗━━━┫ ┗━┓
. ┗━━━┛
0006デフォルトの名無しさん
2006/06/03(土) 01:20:55http://grape.sapid.org/tutorial/haskell.html
・Haskell Tutorial for C Programmers(英日対訳)
http://www.kt.rim.or.jp/~kbk/haskell-intro/intro.html
0007デフォルトの名無しさん
2006/06/03(土) 07:28:450008デフォルトの名無しさん
2006/06/03(土) 08:03:34日本でHaskellがはやってることを世界に知らしめてどうしようっていうんだ。
HWNだって意図からして情報量を抑えて内容を精選するべきなんだから、
役に立たず、興味も引かない情報を載せる余裕はないだろ。
0009デフォルトの名無しさん
2006/06/03(土) 10:59:060010デフォルトの名無しさん
2006/06/03(土) 15:07:19ここで、Lazy I/O は良くないとかいう話があるんですが、
理解できない。
saxParse :: String -> [SaxEvent]
このような、入力は良くなくて、
saxParse :: Monad => m Char -> m SaxEvent
がいいらしいのだが、
これで、入力できるでしょうか?
せめて、
saxParse :: Monad => [m Char] -> m SaxEvent
こんな感じじゃないと、無理なような気がするのですが、
解説希望。
001110
2006/06/03(土) 15:25:08なんか分かった気がする。
getChar :: IO Char のように、
評価する毎に次の文字が取得できるモナドを
仮定しているような気がしてきた。
0012デフォルトの名無しさん
2006/06/03(土) 16:18:39それで合ってる。
細かいことをいうと、getCharはモナドではなくて動作(アクション)で、
動作に対して行うのは評価ではなくて実行ね。
001310
2006/06/03(土) 17:09:08ありがとう。
話は変わるが。
http://www.haskell.org//pipermail/haskell-cafe/2003-October/005190.html
Haskell を分岐して遅延評価を捨てた言語を作りたい、
(...)
90%のケースで遅延評価がいい評価戦略でないことを確信した。
(...)
Haskell はいい言語だ、純粋はグッド、型クラスもグッド、
モナドもグッド、しかし、遅延評価はうんこ。
前からうすうす気になっていたが、同じことをいってる奴を発見。
遅延評価って、美しいんだけどね。
0014デフォルトの名無しさん
2006/06/03(土) 17:37:330015デフォルトの名無しさん
2006/06/03(土) 19:31:09未来がなさそう
0016デフォルトの名無しさん
2006/06/03(土) 19:33:550017デフォルトの名無しさん
2006/06/03(土) 20:15:330018デフォルトの名無しさん
2006/06/04(日) 02:30:29もっと他にもいろいろあると思うが、俺の体験から言うと、
1.再帰関数による探索をしているアルゴリズムで、枝刈りが簡単にできる。
2.遅延(無限)リスト。
3.再帰関数でリストを作りながら、それを別の関数に突っ込める。
といったところかな。
こういったことができるとことで、より宣言的にプログラムが書けるような気がする。
まあ、「あってて良かった正格評価(指定)」のケースも結構あるけどね。
001918
2006/06/04(日) 02:35:530020デフォルトの名無しさん
2006/06/04(日) 03:05:44だが次第にそのチューニングすらめんどくさくなってきて「解析して自動的にうまいこと
切り替えるようにしてくれよ」とか言われだすが、どうみても決定不能です。本当に(ry
0021デフォルトの名無しさん
2006/06/04(日) 03:18:00大抵問題が決定不能だから近似解を求めるものですがなにか
0022デフォルトの名無しさん
2006/06/04(日) 03:25:20だから速い。
0023デフォルトの名無しさん
2006/06/04(日) 18:13:260024デフォルトの名無しさん
2006/06/04(日) 18:59:31GHCは正則評価できる。
0025デフォルトの名無しさん
2006/06/04(日) 19:54:05なんでIOモナドの話に世界を持ち出したらダメなの?
なんかの論文にも出てた気がするけど。
concurrencyのせい?Concurrent Haskellの論文にはπ計算とか出て来て正直分からん。
(ふつけるまだ読んでない私が言うのも何だけど
type IO a = State World a みたいな感じの理解でとりあえずおいとくのはアリだと思うんだけど。
0026デフォルトの名無しさん
2006/06/04(日) 21:08:42大体次のような感じ。concurrencyは念頭になかった。
・どこかでHaskellレベルの概念と実世界の概念を対応させなきゃいけない
(Worldを持ち出しても、World -> Worldの関数が実世界の何に対応するかを
説明しなきゃいけない。(*1))んだから、余計なものを持ち込まない方がいい。
・IO aには十分簡単な説明(「a型の値を返すアクション」「無引数でa型の値を返す
(Cの)関数へのポインタ」)があって、実例もあげやすいのに対し、世界はそうではない。
例えば、この本ではアクションが起こる順番が定まっていることを各中間世界の依存性から
言っているけど、それぞれの中間世界の値が(計算で?)決定されることと、
一つしかない実世界の状態が変化することの関係が不明瞭。
しかし、考えてみると、初めて世界を使ったIOモナドの説明を読んだとき
全然納得できなかったことの腹いせのような気もしてきた。
不必要にきつい表現を使ったことをお詫びします。
*1: ただし、この本ではアクションがWorld->Worldの関数だとは言っていないし、
世界を表す値があるとはっきり言っている訳でもない。
> IOモナドは概念的に「まだ入出力を実行していない現実世界」をアクションの中に包み込んでいます。
0027デフォルトの名無しさん
2006/06/04(日) 21:51:01いや、作者さんじゃないしお詫びされる程じゃないっす。
確かに「世界」と言われても腑に落ちない人も居るかもしれない。
ところで評価順の話ですが、
私、評価順がどうなってるのかなんてよく分かってません(--;
do
x <- return (f v)
print $ g w
print $ x
この場合、観測できるのはg wの印字とf vの印字だけど、
実際はどっちが先に評価されるんだっけ。
例えば、f vが head []を含んでいた場合、g wは印字されるか?
…やってみた。
Prelude> return (head []) >>= \x -> print "hoge" >>= \_ -> print x
"hoge"
*** Exception: Prelude.head: empty list
IOアクションに渡される引数の簡約が、評価順のトップになるという感じなのかな。
(わかりにくい説明でスマソ)
0028デフォルトの名無しさん
2006/06/04(日) 22:15:18Tackling the awkward squad
http://research.microsoft.com/~simonpj/papers/marktoberdorf/mark.pdf
にIOモナドの意味論が載ってる。いい加減に要約すると、
1. プログラム全体を>>=のチェーンで表す
2. チェーンの左端を次に何をするか判明するまで簡約する
3. チェーンの左端を実行し、チェーンから取り除き、実行結果を右辺の関数に食わせて新たなチェーンを作る
4. 2に戻る。
という感じかな。
その例だと、
return (head []) >>= \x -> print "hoge" >>= \_ -> print x
-- 左端を簡約。ここではなにもしないでおく。
return (head []) >>= \x -> print "hoge" >>= \_ -> print x
-- 左端を実行。returnだからなにもしない。結果は(head [])
print "hoge" >>= \_ -> print (head [])
-- 左端を簡約。この結果putChar 'h' >>= \_ -> putChar 'o' >>= \_ -> ...
-- のようなものができると考えられるが、ここでは省略する
print "hoge" >>= \_ -> print (head [])
-- 左端を実行。hogeと出力。結果は()
print (head [])
-- 左端を簡約。ここでエラー発生。
002927
2006/06/04(日) 22:25:59Cleanとかの"world as value"という感じ?
0030デフォルトの名無しさん
2006/06/04(日) 22:47:46let x = head [] だったりすると余計にそう考えてしまうんだけど、実際にはx <- return (head [])とまったく同じでした。
逆にprint "hoge"の前にxを評価してエラーを発生させるためにはどうすればよいのだろう。
一応seq x (return ())を入れてやればエラーが起きたけど、もっと別の方法はないのかな?
0031デフォルトの名無しさん
2006/06/04(日) 23:04:56とか。
0032デフォルトの名無しさん
2006/06/04(日) 23:12:46Hoogleで検索して結局それに行き着きました。
returnの代わりにevaluateを使えば良いから、変な行を追加する必要が無くてすっきりしますね。
0033デフォルトの名無しさん
2006/06/05(月) 04:53:12世界で一番か二番くらいにやさしい「モナド入門」
ttp://d.hatena.ne.jp/m-hiyama/20060419/1145432492
0034デフォルトの名無しさん
2006/06/05(月) 07:59:010035デフォルトの名無しさん
2006/06/05(月) 08:14:38いきなり過疎スレが復活してるし。
ネットでいろんな文章見かけるようになった。
0036デフォルトの名無しさん
2006/06/05(月) 08:16:41配送予定日: 2006/6/3 - 2006/6/4
今日は6月5日だ( ゚Д゚)ヴォケ!!
0037デフォルトの名無しさん
2006/06/05(月) 13:04:19(゚д゚ )
(| y |)
amazonで注文すればokと信じていたのに、
いつまでたっても商品が来ない。
amazon ( ゚д゚) ok
\/| y |\/
これらをくっつけて
( ゚д゚) amazonok
(\/\/
逆から読むとこのざま、というわけだ
( ゚д゚) konozama
(\/\/
amazonは当てにならない、ということだな
(゚д゚ )
(| y |)
0038デフォルトの名無しさん
2006/06/05(月) 15:30:16所用クロックなんかを教えてもらうにはどうすればいいですか?
0039デフォルトの名無しさん
2006/06/05(月) 15:30:570040デフォルトの名無しさん
2006/06/05(月) 16:08:44入門〜はあった
0041デフォルトの名無しさん
2006/06/05(月) 16:51:46:set +s
GHCでは時間と使用メモリ、Hugsでは使用セル数と簡約回数がわかる。
ただ、GHCの使用メモリ量は、同じ式を評価してもコロコロ変わる……
0042デフォルトの名無しさん
2006/06/05(月) 17:16:360043デフォルトの名無しさん
2006/06/05(月) 17:18:09+RTS -pオプションをつけて実行ファイルを走らせれば
実行ファイル名.profに各関数の使用時間とかが出力される。
でも、Hugsで調べたほうが手間が少なくてよいかも。
0044デフォルトの名無しさん
2006/06/05(月) 18:31:04ERROR - Garbage collection fails to reclaim sufficient space
のメッセージがでちゃうと以後何を評価しても同じメッセージがでてしまいます
この場合再起動するしかないのでしょうか?
hugsのバージョンはZaurs版の hugs98_Mar2005-patched-1_arm.ipkです。
プロンプトまで戻ってきていてGC不可能ってことは最後に評価してある式はまだ評価途上のままのこってるってこと?
0045デフォルトの名無しさん
2006/06/05(月) 18:53:15バグなんじゃないか?
手元のHugs March 2005(Linux/x86)だとそのメッセージが出た後も普通に使える。
それから、役に立つかどうか分からないけど、Hugsには:gcというコマンドがある。
004745
2006/06/05(月) 19:10:29http://cvs.haskell.org/Hugs/pages/users_guide/haskell98.html
の一番下にある。
0048デフォルトの名無しさん
2006/06/05(月) 19:13:53追試ありがとうございます。
zaurus固有ならコンパイル環境そろえて自力で最新版とか考えたのですが違うみたいですねぇ。
0049デフォルトの名無しさん
2006/06/05(月) 19:14:51stack overflowまでループじゃん…って時は
どうやって停めますか?
0050デフォルトの名無しさん
2006/06/05(月) 19:16:54あう、重ねがさねありがとう。
まさに無限リストいぢくってる最中だったので、ビンゴっぽいです。
0051デフォルトの名無しさん
2006/06/05(月) 20:31:20慣れてないからかね
0052デフォルトの名無しさん
2006/06/05(月) 21:56:10道具がprimitiveすぎるからだと思うんだけど。
C++ templateも近いものがある。
0053デフォルトの名無しさん
2006/06/05(月) 22:01:54恥ずかしくてレベルの低い質問も出来ないよw
0054デフォルトの名無しさん
2006/06/05(月) 22:07:48ということでレベルの高低にかかわらずどんどん質問するべきだと考える。
俺に答えられることなら喜んで答えるので。
0055デフォルトの名無しさん
2006/06/05(月) 22:23:12あんまり大した情報が書かれて無いね。
Webに書いてもお金にならないからかね。
0056デフォルトの名無しさん
2006/06/05(月) 22:50:340057デフォルトの名無しさん
2006/06/05(月) 23:26:08http://www.amazon.co.jp/o/ASIN/B0007D5J4C/503-3205663-9082354?SubscriptionId=abc
0058デフォルトの名無しさん
2006/06/06(火) 08:07:02立ててくれ
0059デフォルトの名無しさん
2006/06/06(火) 08:09:53立ててくれ
0060デフォルトの名無しさん
2006/06/06(火) 10:58:09ってひょっとしてちゃんと約分までしてくれる?
0061デフォルトの名無しさん
2006/06/06(火) 11:05:270062デフォルトの名無しさん
2006/06/06(火) 11:28:37Conbi n r = (fact n) `div` ((fact r)*(fact (n-r)))
したらなんか結果が優秀なんだけど
途中計算で約分してるとしか思えない
0063デフォルトの名無しさん
2006/06/06(火) 11:53:19オーバーフローしてないって事?
それなら単に整数のデフォルト型がInteger(無限長整数)だというだけの理由。
試しに
fact :: Int -> Int
とでも書いてInt(固定長整数)を使うように指定してやれば、ちゃんとオーバーフローするはず。
0064デフォルトの名無しさん
2006/06/06(火) 12:00:26deforestrationしていたら面白いのにな。
0065デフォルトの名無しさん
2006/06/06(火) 21:03:13人に自慢して、うっとうしがられるくらい?
0066デフォルトの名無しさん
2006/06/06(火) 21:04:54人に、うっとうしがられるくらい?
0067デフォルトの名無しさん
2006/06/06(火) 21:12:10に求人情報があるんだけど、
日本の Haskell の求人、どっかにない?
0068デフォルトの名無しさん
2006/06/06(火) 21:36:140069デフォルトの名無しさん
2006/06/07(水) 01:22:17??
???
?
0070デフォルトの名無しさん
2006/06/07(水) 02:55:57言語マニアも居れば、遥かに先を見ていて、通過点と考えてる人も居るだろうし。
0071デフォルトの名無しさん
2006/06/07(水) 02:56:05正直「ふつう」の方が読みやすい。
特に序盤。「入門」はいきなりおいてけぼりを食らった気がした。
「ふつう」の方はわざわざ式を展開してくれるとか丁寧。
もう関数型言語を理解してる人にとっては、
「そんな方法でページ稼ぎやがってー」と思われるのかもしれないけど、
勉強し始めの身にはありがたい。
いい入門書だと思う。
0072デフォルトの名無しさん
2006/06/07(水) 03:02:02色んな対象への本があるってのはいい事だと思う。
0073デフォルトの名無しさん
2006/06/07(水) 06:42:15商用アプリは製作禁止だっけ?
0074デフォルトの名無しさん
2006/06/07(水) 12:59:17インタプリタに処理させた後で
上押してさっきの入力を呼びだしてそれを繰り返し処理
高速に繰り返すと
<interactive>:1:0: Notin scope: `g〜'
ってエラー起こす。
g〜ってのは、関数名の先頭一文字めだけgになった関数名にバグ表記という意味
sum -> gum
0075デフォルトの名無しさん
2006/06/07(水) 16:04:21高速な関数ありますか?
0076デフォルトの名無しさん
2006/06/07(水) 16:38:51my@ARR2=(1,2);
my@TMP=grep {my$ARR1=$_;!grep{$ARR1==$_}@ARR2}@ARR1;
print "@TMP\n";
0077デフォルトの名無しさん
2006/06/07(水) 17:21:300078デフォルトの名無しさん
2006/06/07(水) 17:29:180079デフォルトの名無しさん
2006/06/07(水) 17:38:38Visual Studio2005だとダメっぽいな。
0080デフォルトの名無しさん
2006/06/07(水) 18:06:510081デフォルトの名無しさん
2006/06/07(水) 20:04:41どうもそうらしいね。俺の知り合いもそう言ってた。2003でないとダメぽ
0082デフォルトの名無しさん
2006/06/07(水) 21:23:01version0.0ってのがスゴス
0083デフォルトの名無しさん
2006/06/07(水) 22:42:34STL/CLI(旧STL.NET)は使えるのか?
0084デフォルトの名無しさん
2006/06/07(水) 23:28:07第二引数のリストに Eq 以外に Ord などの特徴があれば、
二分木やハッシュにしておけば速くならないかな?
0085名無しさん♯
2006/06/08(木) 01:29:25現状のCTSの仕様では実現はむずかしそう。
ttp://www.haskell.org//pipermail/haskell-cafe/2005-January/008250.html
ただ、Mondrian for .NETを再構築しようとの動きはあるみたい。
ttp://research.microsoft.com/~emeijer/
0086名無しさん♯
2006/06/08(木) 01:31:16ttp://www.haskell.org//pipermail/haskell-cafe/2005-January/008244.html
0087デフォルトの名無しさん
2006/06/08(木) 02:16:430088デフォルトの名無しさん
2006/06/08(木) 02:26:020089デフォルトの名無しさん
2006/06/08(木) 02:57:52遅延評価ってオンザフライみたいなもん?
0090デフォルトの名無しさん
2006/06/08(木) 03:08:410091デフォルトの名無しさん
2006/06/08(木) 03:30:420092デフォルトの名無しさん
2006/06/08(木) 05:44:29バッチ処理的にやりたくなったら、遅延評価をしないという選択はできるのですか?
0093デフォルトの名無しさん
2006/06/08(木) 05:47:01なにこれ
0094デフォルトの名無しさん
2006/06/08(木) 06:18:32必要な分が揃ったら処理とかやってくわけですよね?
関数のバケツリレーで
あの関数を処理してちょっと停めてこっちの関数移ってとか
切り替えにオーバーヘッド時間かかると思うのです
0095デフォルトの名無しさん
2006/06/08(木) 07:22:560096デフォルトの名無しさん
2006/06/08(木) 09:54:27とりあえず遅延評価でググって上から順に見てってみろ。
0097デフォルトの名無しさん
2006/06/08(木) 14:25:27どうみても理解してません本当に(ry
0098デフォルトの名無しさん
2006/06/08(木) 14:43:130099デフォルトの名無しさん
2006/06/08(木) 16:07:140100デフォルトの名無しさん
2006/06/08(木) 17:23:460101デフォルトの名無しさん
2006/06/08(木) 18:14:19式なんだけど、関数ポインタ渡すみたいな
0102デフォルトの名無しさん
2006/06/08(木) 18:14:48違うか。匿名メソッドを渡すみたいな幹事なんだろうか
0103デフォルトの名無しさん
2006/06/08(木) 18:40:45何を言ってるか分からん。
0104デフォルトの名無しさん
2006/06/08(木) 18:43:36今頃だけど notElemってのがあった
diff xs ys = [x | x <- xs, notElem x ys]
0105デフォルトの名無しさん
2006/06/08(木) 18:48:15遅延評価=その場で評価されないって意味で書いた
0106デフォルトの名無しさん
2006/06/08(木) 18:50:17main = print ([1,2,3,4,5] \\ [2,3,4])
0107デフォルトの名無しさん
2006/06/08(木) 18:54:45「何」が「どの場」で評価されないと?
何か聞きたいなら他人に判るように(出来るだけ厳密に)書いてくれ。
なんにせよ、「必要になるまで使わない」のはHaskellに限らず当り前。
0108デフォルトの名無しさん
2006/06/08(木) 19:14:53それは(実装の意味で)かなり正しい。例えば有名なたらいまわし関数を
遅延評価を意識して C++ で関数オブジェクトっぽいものを使いながら書くと
こんな感じになる。悲惨なほどメモリリークするのは許して。
struct Object { virtual int eval() = 0; };
struct Const : public Object {
int x; Const(int x) : x(x) { } int eval() { return x; } };
struct Tarai : public Object {
Object *x, *y, *z;
Tarai(Object *x, Object *y, Object *z) : x(x), y(y), z(z) { }
int eval() {
int xval = x->eval(), yval = y->eval(), zval;
if (xval <= yval) { return yval; }
else {
zval = z->eval();
Tarai *tx = new Tarai(new Const(xval-1), y, z),
*ty = new Tarai(new Const(yval-1), z, x),
*tz = new Tarai(new Const(zval-1), x, y);
Tarai tot(tx, ty, tz);
return tot.eval(); } } };
int main() {
Tarai tarai(new Const(48), new Const(24), new Const(0));
printf("%d\n", tarai.eval());
}
0109104=106
2006/06/08(木) 19:22:45diff [1,2,3,4,2,3,4,5] [2,3,4] => [1,5]
(\\) [1,2,3,4,2,3,4,5] [2,3,4] => [1,2,3,4,5]
(\\) [1,2,3,4,2,3,4,5] [2,3,3,4] => [1,2,4,5]
どっちにしろこれ自体が遅いのかもしれないけど
0110デフォルトの名無しさん
2006/06/08(木) 20:00:400111デフォルトの名無しさん
2006/06/08(木) 20:15:17同じレイヤーで話せっての
0112デフォルトの名無しさん
2006/06/08(木) 21:34:43手元にPeyton JonesのImplementingとImplementation of Functional Programmingの本があるんだけど
1990年とかで古過ぎ。
GHCはどんな風にコンパイルしてるのか,それなりにまとまった読み物はない?
0113デフォルトの名無しさん
2006/06/08(木) 21:42:51http://citeseer.ist.psu.edu/peytonjones92implementing.html
これの内容は大部分いまのGHCにも通用するんじゃないか?
0114デフォルトの名無しさん
2006/06/08(木) 21:48:15今見たら Implementation ... は 1987, Implementing...は1992だった。
多分>>113のやつだと思う。ちゃんと読んでみますです。。
0115デフォルトの名無しさん
2006/06/08(木) 22:13:14遅延評価の実装をまったく知らないなら、
GHC に興味を持つ前に SICP でも見て自分で実装してみたほうがいいと思う。
SICP 読まなくても、scheme の promise の仕組みを知ってれば、実装は出来る。
0116デフォルトの名無しさん
2006/06/09(金) 00:19:310117デフォルトの名無しさん
2006/06/09(金) 00:23:48くだすれHaskell(超初心者用)
のスレ立てが急務だ。
おまいら正直あまりにとんちんかんで低レベルな質問が増えて
辟易してるだろう?
0118デフォルトの名無しさん
2006/06/09(金) 00:24:480119デフォルトの名無しさん
2006/06/09(金) 00:36:210120デフォルトの名無しさん
2006/06/09(金) 00:38:42(IO以外の)モナドと遅延評価は関係ない。
Stateモナドでスライド辞書書いてみて
身にしみた。
0121デフォルトの名無しさん
2006/06/09(金) 01:56:59IORef遅せー
String遅せー
うおぉぉぉ
0122デフォルトの名無しさん
2006/06/09(金) 06:53:000123デフォルトの名無しさん
2006/06/09(金) 07:53:35ちょっとちがうのかもしれないけど、型変数同士がうまく単一化されてくれないんです…
どちらにせよ、fundepsとかmultiparameter type classがどんな風に計算されるのかを
ちゃんと知っておきたいんですが。
0124デフォルトの名無しさん
2006/06/09(金) 08:46:55インデントが全角スペースになっているので注意してください。
class Stateful c s where
conv :: c -> State s ()
instance Stateful (State s ()) s where
conv = id
instance Stateful (s->s) s where
conv f = State (\s->(f s, ()))
foo :: State s ()
foo = return ()
bar :: s -> s
bar = \s -> s
act :: Stateful c s => c -> State s ()
act c = conv c
hoge :: State s ()
hoge = do
act foo
act bar
0125デフォルトの名無しさん
2006/06/09(金) 08:52:16で,ここで
test1.hs:45:2:
No instance for (Stateful (State s1 ()) s)
arising from use of `act' at test1.hs:(act fooの行):2-4
Probable fix:
add (Stateful (State s1 ()) s) to the type signature(s) for `hoge'
or add an instance declaration for (Stateful (State s1 ()) s)
In a 'do' expression: act foo
In the definition of `hoge':
hoge = do
act foo
act bar
test1.hs:46:2:
No instance for (Stateful (s1 -> s1) s)
arising from use of `act' at test1.hs:(act barの行):2-4
Probable fix:
add (Stateful (s1 -> s1) s) to the type signature(s) for `hoge'
or add an instance declaration for (Stateful (s1 -> s1) s)
In the result of a 'do' expression: act bar
In the definition of `hoge':
hoge = do
act foo
act bar
と言われます…
foo の型変数sと hogeの型変数sが単一演サできてない感bカです。
0126デャtォルトの名無bオさん
2006/06/09(金) 08:57:16class Stateful c s | c -> s where
で行けましたOTZ
まあでも情報きぼんぬです
0127デフォルトの名無しさん
2006/06/09(金) 10:13:35もちろん問題無いが、おまいには金を取れそうなアプリなど作れないだろう
0128デフォルトの名無しさん
2006/06/09(金) 10:15:27エスパーの方ですか?
0129デフォルトの名無しさん
2006/06/09(金) 11:56:30シェアウェアとかおkなんですか?
夢広がりんぐ
0130デフォルトの名無しさん
2006/06/09(金) 12:06:350131デフォルトの名無しさん
2006/06/09(金) 13:05:560132デフォルトの名無しさん
2006/06/09(金) 14:44:090133デフォルトの名無しさん
2006/06/09(金) 16:54:46PHP研究所
コンピュータ(書泉グランデ調べ 2006年5月29日〜6月4日 ) 毎週水曜日6時 更新
* 『ふつうのHaskelプログラミング』第1位!
* 『ウェブ進化論』第2位!
順位前週書名著者出版社価格
1-ふつうのHaskelプログラミング ソフトバンククリエイティブ2800円
2-ウェブ進化論 筑摩書房740円
31組込みプレス Vol.3 技術評論社1680円
4-グーグル明解検索術 宝島社700円
5-Asterisk-テレフォニーの未来 オライリー・ジャパン3800円
6-Fedora Core Expert Vol.2 技術評論社1980円
7-Fedora Core 5で作る 最強の自宅サーバ ソーテック社2780円
8-グーグル Google 文芸春秋760円
9-LATEXを用いた論文作成術 プレアデス出版2300円
10-The Debian System その概念と技法 毎日コミュニケーションズ5200円
11-プロとしてのOracle PL/SQL入門 ソフトバンククリエイティブ2400円
12-ITエンジニアのためのコミュニケーション能力診断 ソフトバンククリエイティブ1740円
13-Google誕生 イースト・ブレス2286円
14-明解入門 Visual C++2005 ビギナー編 ソフトバンククリエイティブ3800円
15-Open Office.org 2.0 オフィシャルユーザーズガイド 毎日コミュニケーションズ2500円
16-図解でわかる Ajaxのすべて 日本実業出版社2000円
17-Javaのココロ ソフトバンククリエイティブ1800円
18-TRONWARE Vol.99 パーソナルメディア1200円
19-XOOPS Cube 使いこなしガイドブック ローカス2800円
2016ひと目でわかる Microsoft SQL Server 2005 日経BPソフトプレス2400円
0134デフォルトの名無しさん
2006/06/09(金) 18:17:320135デフォルトの名無しさん
2006/06/09(金) 18:24:23C系以外を使った事が無いと、なかなか目が慣れない、ということはあると思うけれど。
0136デフォルトの名無しさん
2006/06/09(金) 19:17:33書籍ビジネスは本棚に本を並べることを趣味とする人たちがターゲットですよ
0137デフォルトの名無しさん
2006/06/09(金) 19:27:27知名度も上がるだろうし
0138デフォルトの名無しさん
2006/06/09(金) 20:48:350139デフォルトの名無しさん
2006/06/09(金) 23:12:470140デフォルトの名無しさん
2006/06/10(土) 07:00:22いつもHaskellの事を考えてしまって生活が破綻する。
0141デフォルトの名無しさん
2006/06/10(土) 07:10:25もしそうなら、Haskell が万能というよりは貴方が万能な訳だ。
0142デフォルトの名無しさん
2006/06/10(土) 12:40:430143デフォルトの名無しさん
2006/06/10(土) 13:21:070144デフォルトの名無しさん
2006/06/10(土) 13:24:46λ,,,,,,λ ガオー!
∩`iWi´∩ λ,,,,λ グオー!
ヽ |m| .ノ∩`iWi´∩
|  ̄| ヽ |m| .ノ
| | | |
U⌒U U⌒U
0145デフォルトの名無しさん
2006/06/10(土) 13:55:07Cに遜色ないくらい高速にアクセスできるHashtableを実装してみてくれ。
0146デフォルトの名無しさん
2006/06/10(土) 14:02:13先頭から辿るなんて。
単調減少リストをクイックソートする最悪ケースがあったとして
遅延評価なら結果リストの最後の要素はすぐ返せると思いきや、
lastは初めから辿る実装なので、結局リストの初めが出来上がらないことには動き出せないわけで
則ちこのケースではリスト完成するまで待たされるという事じゃないですか!
プリミティブな関数程綿密に設計されなければならないとい事ですか?
0147デフォルトの名無しさん
2006/06/10(土) 14:09:17それはlastの問題じゃなくて、Haskellのリストが単方向リストであることの帰結。
0148デフォルトの名無しさん
2006/06/10(土) 14:26:410149デフォルトの名無しさん
2006/06/10(土) 14:33:04IOモナドの中で操作するデータ構造にすれば別だけど。
関数的に使えて、両端からのアクセスが速いデータ構造も研究されてるらしい。
2-3 finger trees
http://www.informatik.uni-bonn.de/~ralf/publications/FingerTrees.pdf
0150デフォルトの名無しさん
2006/06/10(土) 14:59:46どうもありがとうございますた
0151デフォルトの名無しさん
2006/06/10(土) 16:07:350152デフォルトの名無しさん
2006/06/10(土) 18:54:190153デフォルトの名無しさん
2006/06/10(土) 20:11:500154デフォルトの名無しさん
2006/06/10(土) 21:01:160155デフォルトの名無しさん
2006/06/10(土) 21:06:130156デフォルトの名無しさん
2006/06/10(土) 22:10:28> ふつうのHaksell
それ、パチもんだから。
0157デフォルトの名無しさん
2006/06/11(日) 01:40:36無理だと思った人はとっととあきらめて。
0158デフォルトの名無しさん
2006/06/11(日) 02:20:20Haksellができたところで現実的には何も変わらんから気にするな
0159デフォルトの名無しさん
2006/06/11(日) 03:10:220160デフォルトの名無しさん
2006/06/11(日) 05:10:03物事を再帰関数で考える所も、ワーキングメモリ増強に良い気がします。
0161デフォルトの名無しさん
2006/06/11(日) 05:11:53コンキャット?
0162デフォルトの名無しさん
2006/06/11(日) 07:10:380163デフォルトの名無しさん
2006/06/11(日) 07:35:310164デフォルトの名無しさん
2006/06/11(日) 09:52:520165デフォルトの名無しさん
2006/06/11(日) 10:00:29再帰で考える方がワーキングメモリは少なくて済むんじゃないか。
0166デフォルトの名無しさん
2006/06/11(日) 10:16:56俺は最初再帰関数の処理手順がイメージつかなくて脳が悲鳴を上げた
脳にスタックを作るのはいい体操になると思う
0167デフォルトの名無しさん
2006/06/11(日) 11:28:030168デフォルトの名無しさん
2006/06/11(日) 11:31:110169デフォルトの名無しさん
2006/06/11(日) 11:32:350170デフォルトの名無しさん
2006/06/11(日) 11:56:230171デフォルトの名無しさん
2006/06/11(日) 12:03:310172デフォルトの名無しさん
2006/06/11(日) 12:04:150173デフォルトの名無しさん
2006/06/11(日) 12:11:550174デフォルトの名無しさん
2006/06/11(日) 12:30:150175デフォルトの名無しさん
2006/06/11(日) 13:33:320176デフォルトの名無しさん
2006/06/11(日) 13:35:110177デフォルトの名無しさん
2006/06/11(日) 15:10:26あれいじってなんか書け
0178デフォルトの名無しさん
2006/06/11(日) 15:18:14Pythonと比べて30倍くらい時間かかる。
0179デフォルトの名無しさん
2006/06/11(日) 15:26:54今のところはね。
0180デフォルトの名無しさん
2006/06/11(日) 16:05:170181デフォルトの名無しさん
2006/06/11(日) 16:47:36まあその代わり素晴らしい表現力があるが。
0182デフォルトの名無しさん
2006/06/11(日) 17:08:20unicode対応まだ〜?チンチン!!(AA略)
0183デフォルトの名無しさん
2006/06/11(日) 18:23:350184デフォルトの名無しさん
2006/06/11(日) 19:02:14# ["漢字文字列"] ;;
- : string list = ["\138ソ\142\154\149カ\142\154\151\241"]
↑これを使えるっていうのならね
0185デフォルトの名無しさん
2006/06/11(日) 19:46:20何の煽りか知らないけど、
代数学の知識なんて要らないんじゃ?集合論の知識すら要らないような。
モナドの話になるとちょっと代数が関わってくるけど,Haskellerならreturnが単位元な事と>>=の結合則が成り立つ事が分かっていればいい。
Haskell は
・マニュアルの読み方
・データと型の名前空間が違うということ
・構築子は大文字で,関数や型変数は小文字だということ
・演算子の中置記法
・let文の書き方
・パターンマッチの使い方
・型構築子の概念 (Either a bは a と b の 二つの「型引数」を持った型,とか)
・IOモナドの使い方 (>>=とreturnの型が分かること)
これだけわかればとりあえず使えるはず。(常識的なC,Javaに慣れていれば)
高階関数なんかは頭をひねってくれ。lisp/schemeでも使うでそ。
0186デフォルトの名無しさん
2006/06/11(日) 19:51:10(>>=) :: IO a -> (a -> IO b) -> IO b
を
(先にやるアクションA) >>= (Aの戻り値を受け取り,次にやるアクションBを返す関数)
== Aの次にBを行うアクション
という風に理解できればOK。
細かいサブルーチンを組み合わせて大きなサブルーチンをつくるのが >>=という演算子。
例えば
myprint str = putStrLn str
getLine >>= myprint
は, getLine >>= \str -> myprint str
と同じで,do構文なら,
do
str <- getLine
myprint str
ということ。ただこれだけ。
0187デフォルトの名無しさん
2006/06/11(日) 20:16:31> Haskellerならreturnが単位元な事と>>=の結合則が成り立つ事が分かっていればいい。
代数じゃん!
0188デフォルトの名無しさん
2006/06/11(日) 20:17:31wwwwwwwwwwwwwwwwwwww
0189デフォルトの名無しさん
2006/06/11(日) 21:02:09別に成り立たなくてもプログラムの意味は変わらないと思う
0190デフォルトの名無しさん
2006/06/11(日) 21:14:34do
a
b
c
と
do
a
do
b
c
で意味が違うのは嫌じゃないか?
0191デフォルトの名無しさん
2006/06/11(日) 22:06:19何わらってんだかしらんが、一文字を一文字として扱えない段階で話にもなってないって事じゃねぇの?
0192デフォルトの名無しさん
2006/06/12(月) 00:00:00それとも英語も出来ない人ですかw
0193デフォルトの名無しさん
2006/06/12(月) 00:12:45釣りですか?
0194デフォルトの名無しさん
2006/06/12(月) 01:05:17釣りですか?
0195デフォルトの名無しさん
2006/06/12(月) 01:11:51釣りですか?
0196デフォルトの名無しさん
2006/06/12(月) 01:22:59can
do
shityainayo
0197デフォルトの名無しさん
2006/06/12(月) 06:36:21なんと遅延評価させるものより遅くなった!
死にたい
0198デフォルトの名無しさん
2006/06/12(月) 06:41:55自分で一からモナドを書かない限り、代数は使わなくても済むよ〜、
と言いたかった。
もちろん知っておいた方がいいのは間違いない。
他にfoldrとfoldlは与える演算子が結合的なら結果が同じになるとか。
ただ普通にCやJavaでやっていた計算をHaskellでやる分には何も考えなくても書ける。
0199197
2006/06/12(月) 06:59:150200デフォルトの名無しさん
2006/06/12(月) 09:07:00そういう煽り方しておもしろいですか?
0201デフォルトの名無しさん
2006/06/12(月) 11:29:150202デフォルトの名無しさん
2006/06/12(月) 13:18:54module MyRandom where
import System.Random
import System.Time
import System.IO.Unsafe
getPicosec :: IO Integer
getPicosec = getClockTime >>= return . ctPicosec . toUTCTime
newStdGenFromClock :: IO StdGen
newStdGenFromClock = getPicosec >>= return . mkStdGen . fromInteger
randomsRIO :: Random a => (a, a) -> IO [a]
randomsRIO = (newStdGenFromClock >>=) . (return .) . randomRs
-- randomsRIO r = newStdGenFromClock >>= return . randomRs r
randomsIO :: Random a => IO [a]
randomsIO = newStdGenFromClock >>= return . randoms
randomsRUnsafe :: Random a => (a, a) -> [a]
randomsRUnsafe = unsafePerformIO . randomsRIO
randomsUnsafe :: Random a => [a]
randomsUnsafe = unsafePerformIO randomsIO
これをインポートして take 10 $ randomsRUnsafe (0, 5) とかすれば乱数リストが取れた。
0203デフォルトの名無しさん
2006/06/12(月) 14:24:32あり^^
0204デフォルトの名無しさん
2006/06/12(月) 17:19:48randomsRUnsafeをtakeするのをreplicateしたら全部同じリストなんですね。
0205デフォルトの名無しさん
2006/06/12(月) 19:00:590206202
2006/06/12(月) 19:06:14それはしょうがないんじゃないかと思う。
それはそれとして、
sequence $ replicate 10 $ randomsRIO (0,5) >>= print . take 15
とかやっても高々2種類でしたよ(^^;
まぁ、picosecの値が同じ間は同じ列になるわけだから当然の結果だけど。
とりあえず下のようにgetStdGen, setStdGenを利用してやるようにしたら毎回違う列になるように出来た。
newStdGenFromClock
= do { i <- getPicosec; j <- getStdGen >>= return . fst . random;
setStdGen $ mkStdGen $ fromInteger i + j; getStdGen }
0207デフォルトの名無しさん
2006/06/12(月) 19:23:45Hugsだと
Hugs.Base> "あいうえお"
"\12354\12356\12358\12360\12362"
になる。
でもロケールのエンコーディングに変換されるのでUnicode環境じゃないときびしい。
0209デフォルトの名無しさん
2006/06/12(月) 19:31:47なんで?どこでも使えるためのlocaleだと思うんだが。
0210デフォルトの名無しさん
2006/06/12(月) 22:31:09WinHugsだと
Hugs> "あいうえお"
"\642554146"
になる。
どう見てもバグ。
0211デフォルトの名無しさん
2006/06/12(月) 22:55:58WinHugs付属のhugs.exeだと
Hugs> "あいうえお"
"\130\160\130\162\130\164\130\166\130\168"
だったり。
lengthに関してはどっちも
Hugs> length "あいうえお"
10
まぁ、putStrで表示してくれるからとりあえずは使える。(GHCみたく構文解析レベルではねられるよりはマシ)
Hugs> putStr "あいうえお"
あいうえお
0212デフォルトの名無しさん
2006/06/13(火) 03:56:09Hugs.Base> putStr "あいうえお"
あいうえお
Hugs.Base> length "あいうえお"
5
Hugs.Base> "あいうえお"
"\12354\12356\12358\12360\12362"
0213デフォルトの名無しさん
2006/06/13(火) 07:31:400214デフォルトの名無しさん
2006/06/13(火) 10:29:52日本の Haskell の普及に貢献したことは忘れない。合掌。
0215デフォルトの名無しさん
2006/06/13(火) 14:13:11仕様確定して仕上げる時に、速くしたい部分をC++で
って感じで構築すればおk?
0216デフォルトの名無しさん
2006/06/13(火) 23:55:48一部wget -mしたもの持ってるけどなにか役に立つかな?
0217デフォルトの名無しさん
2006/06/14(水) 01:50:17OSMのやつ?
タイトルが気になったから、立ち読みして来た。
けど、私にはつまんなかった。
何が言いたいのか、わからんかった。
0218デフォルトの名無しさん
2006/06/14(水) 12:12:35実装を切替えることってGHC拡張の範囲でできる?
0219デフォルトの名無しさん
2006/06/14(水) 12:23:41たとえば、どんな風なことをしたい?
0220デフォルトの名無しさん
2006/06/14(水) 13:03:13-- Ordのインスタンス用実装
containsOrd :: (Ord a) => [a] -> a -> Bool
containsOrd xs = \y -> ... table上の二分探索 ...
where
table = array ... 配列を構築 ...
-- それ以外用実装
containsOther :: (Eq a) => [a] -> a -> Bool
containsOther = flip elem
contains :: (Eq a) => [a] -> a -> Bool
contains = ... aがOrdのインスタンスならcontainsOrdを、そうでないならcontainsOtherを呼ぶ ...
でも実装を考えてみたら渡すべき辞書がないから無理だな。
どっちにしてもレスありがとう。
0221デフォルトの名無しさん
2006/06/14(水) 13:06:26C++風の、特殊化とtype traitsで出来るんじゃないか?
0222デフォルトの名無しさん
2006/06/14(水) 13:28:47型クラスは実行時解決だからな。
型クラスで書いてると、ときどき全部Template Haskellで書き直したくなる。
0223デフォルトの名無しさん
2006/06/14(水) 19:02:39型や宣言を書き換えられない([d||]の中に$()が書けない)のがアレだけど。
0224デフォルトの名無しさん
2006/06/14(水) 22:16:14無名関数を演算子的に中置記法で使うことは出来ないのでしょうか?
*Main> 2 `(x y -> x + y)` 3
<interactive>:1: parse error on input `('
0225デフォルトの名無しさん
2006/06/14(水) 22:21:49バッククォートで囲めるのは単一のトークンだけ。
0226224
2006/06/14(水) 22:23:23では出来ないのですね。ありがとうございました。
0227デフォルトの名無しさん
2006/06/14(水) 22:44:080228デフォルトの名無しさん
2006/06/15(木) 08:18:12>型や宣言を書き換えられない([d||]の中に$()が書けない)のがアレだけど。
$(..)が書けないのは型宣言だけかと? 宣言に対して [|d hoge = $(...)|] は書けるっぽい。
確かに[d| data S = $(...) |]は無理。
0229デフォルトの名無しさん
2006/06/15(木) 11:17:44┏┫┃┃┃ スレ違い雑談は┃┃┃┣┓
┃┃┃┃┣┓ ここまで.┏┫┃┃┃┃
┃ ┃┃┏━━━┓┃┃ ┃
┃スレ違い ┣┫ ・∀・ ┣┫ END ┃
┗━━━━┛┗┳━┳┛┗━━━━┛
┏┻┓┃
┏━┛ ┣┻┓
┗━━━┫ ┗━┓
┗━━━┛
0230デフォルトの名無しさん
2006/06/15(木) 12:08:16下のページを参考にしているのですが、関数の合成がうまく行きません。
http://www.shido.info/hs/haskell3.html
何故なのでしょうか?
foo x y = x * y
bar x = x - 1
*Main> bar $ foo 5 2
9
*Main> (bar . foo) 5 2
<interactive>:1:
No instance for (Num (a -> a))
arising from use of `bar' at <interactive>:1
In the first argument of `(.)', namely `bar'
In the definition of `it': it = (bar . foo) 5 2
0231デフォルトの名無しさん
2006/06/15(木) 12:42:54(.)は一引数の関数しか合成できない。
0232デフォルトの名無しさん
2006/06/15(木) 12:44:30ttp://www.sampou.org/haskell/tutorial-j/functions.html
この辺でも見て、カリー化を勉強するとよろし
一応curry (bar.uncurry foo) 5 2でなんとかなる
0233230
2006/06/15(木) 13:07:17ありがとうございます。やさしい(not Easy but Gentle)Haskell入門を読んでみます。
しかし、
http://www.shido.info/hs/haskell3.html
6.3. 関数の合成
. は関数を合成します。
foo $ hoge x y ⇔ (foo . hoge) x y
このページは間違っているようですね。うーん。
0234デフォルトの名無しさん
2006/06/15(木) 13:11:230235デフォルトの名無しさん
2006/06/15(木) 13:18:40(.) :: (b->c) -> (a->b) -> a -> c
なので、bar . foo とするとbarとfooはそれぞれ1引数関数として扱われる。
barはもともと1引数なので問題ないが、fooは2引数関数( n -> n -> n )なので、
1引数関数を返す1引数関数( n -> (n -> n) )と解釈される。
その上で(.)の型に当てはめていくと、
barから、b=n, c=n
fooから、a=n, b=(n->n)
となり、bに関して矛盾が起きる。
実際にはbarの型は少し幅があるのでb=c=(n->n)として当てはめようとするんだけど、
(n->n)はその許された幅からも逸脱しちゃってるよ、とエラーメッセージを出している。
0236デフォルトの名無しさん
2006/06/15(木) 13:25:49curry, uncurryを使わなくても、 (bar .) . foo でOK。
ちなみに、fooが3引数だと、 ((bar .) .) . foo でOK。
0238デフォルトの名無しさん
2006/06/15(木) 15:52:180239デフォルトの名無しさん
2006/06/15(木) 20:10:310240デフォルトの名無しさん
2006/06/15(木) 20:30:36関数適用演算子。
f $ x = f x
右結合で優先順位0の演算子なので、括弧を省略するのに使える。例えば、
length $ filter null $ lines str
は、
length (filter null (lines str))
と同じ。
0241デフォルトの名無しさん
2006/06/15(木) 22:07:320242デフォルトの名無しさん
2006/06/16(金) 08:09:40あと map.mapとか bar.foo とか、 (.) を使う時にスペースを入れないのは流行なの?
パッケージ名の修飾と間違えそうで怖いんだが。
hoge.hs:
data Data = Data Int
fun x = x+1
ghci/hugs> hoge = Data.fun
このData.funはモジュールDataの関数funなのか Data . fun なのか判別できるのか?
やってみた。
*Main> let x = (Data.fun) 1
<interactive>:1:9:
Failed to load interface for `Data':
Could not find module `Data':
it is not a module in the current program, or in any known package.
*Main> let x = (Data . fun) 1
結論:中置演算子の . は離して書くこと。ってReportかGentle〜に書いてあった気がするけど。
$も同様。 $(...) は -fth で template haskellのspliceと間違える可能性がなくはない。 $ (...)とする。
0243デフォルトの名無しさん
2006/06/16(金) 08:32:50勉強になった
0244デフォルトの名無しさん
2006/06/16(金) 10:14:53いいのだが……
POPに描かれている「はすケロ」なる、蛙と思われるキャラの絵は何だ。
0245デフォルトの名無しさん
2006/06/16(金) 14:10:26my_length [] = 0
my_length (x:xs) = 1 + my_length xs
ここで、x:xs が()で囲われなければならないのはなぜでしょう?
私は「:」演算子が関数適用より優先順位が低いからだと思っていたのですが、
どうも違うような気がしてきました。
そもそも「:」はデータコンストラクタだということで、「ふつケル」の7章と
9章を見てみたのですが、()についての記述は見つかりませんでした。
0246デフォルトの名無しさん
2006/06/16(金) 14:56:320247デフォルトの名無しさん
2006/06/16(金) 15:13:18その理解で良いと思う。
構文的には、そこに書けるのはapat (atomic patternかな)だけだから、ということになる。
http://haskell.org/onlinereport/syntax-iso.html
0248245
2006/06/16(金) 15:20:27なるほど!ありがとうございます。
演算子の優先順位の問題なら、()の代わりに$が使えるはずだと思っていたの
ですが、それはエラーになってしまったので、間違いだったかと思い始めまし
た。
そうではなくて、パターンマッチに$が許されないからだったのですね。
0249デフォルトの名無しさん
2006/06/16(金) 15:23:38関数は小文字から始めることになっているから問題ない。
Dataという関数はありえない。
0250デフォルトの名無しさん
2006/06/16(金) 15:25:35型コンストラクタ
0251250
2006/06/16(金) 15:29:21データコンストラクタだな
0252249
2006/06/16(金) 15:55:07Data.hoge => モジュール
data.hoge => 関数合成
Data hoge => データコンストラクタ
でいいのでは?
0253デフォルトの名無しさん
2006/06/16(金) 16:01:210254デフォルトの名無しさん
2006/06/16(金) 16:03:08>データコンストラクタを(.)で繋ぐことってないような
ふつうにあると思うが。
map (Just . length) ["foo", "bar", "xzzzy"]
==> [Just 3, Just 3, Just 5]
0255249
2006/06/16(金) 16:36:500256デフォルトの名無しさん
2006/06/16(金) 17:11:470257デフォルトの名無しさん
2006/06/16(金) 21:27:100258デフォルトの名無しさん
2006/06/16(金) 21:28:47ghcはまさにそれをやってる訳だが。
0259デフォルトの名無しさん
2006/06/16(金) 22:28:46chicken はまさにそれをやってる訳だが。
0260デフォルトの名無しさん
2006/06/16(金) 22:31:500261デフォルトの名無しさん
2006/06/16(金) 23:04:170262デフォルトの名無しさん
2006/06/17(土) 00:32:530263デフォルトの名無しさん
2006/06/17(土) 01:09:38そうなん?
0264デフォルトの名無しさん
2006/06/17(土) 01:10:55ほんとだ!
ghcのディレクトリみたら、gcc入ってた。つか、mingw
0265デフォルトの名無しさん
2006/06/17(土) 08:05:11-Oで最適化する時だけ、C経由でコンパイルするって書いてあったような。
あ,でもWindows用のネイティブコンパイラが無ければ必然的にC経由になるけど
> -O currently also implies -fvia-C. This may change in the future.
ttp://www.haskell.org/ghc/docs/latest/html/users_guide/options-optimise.html#optimise-pkgs
0266デフォルトの名無しさん
2006/06/17(土) 08:06:52スタック等の細かい所を弄れて早そうな感じがするね。
gcc経由したほうが早くなるのは何故なんだぜ?
0267デフォルトの名無しさん
2006/06/17(土) 08:52:28[73,137,99990001]
みたいに素因数分解する関数を作り、
1== length (factorize 1000000000001)
を入力すると
素因数分解するだけなのと同様な時間を要するようです。
73と137はすぐ見つかり、遅延評価により即表示されるので、
137が見つかった時点で終了して
False
となってくれる事を期待したのですが、わざわざ最後の素因数まで探してるようです。
lengthがリストの最後に行くまで値を返さないから
ボトルネックになっているという認識で良いですか?
0268デフォルトの名無しさん
2006/06/17(土) 08:56:010269デフォルトの名無しさん
2006/06/17(土) 09:20:09そうね。
p [] = False
p [x] = True
p (x:y:xs) = False
こんな感じで。
0270デフォルトの名無しさん
2006/06/17(土) 09:56:13あり^^
0271デフォルトの名無しさん
2006/06/17(土) 10:25:31素因数分解で結果のリストが一つの要素ってつまり素数の事だから
p n = [n]==(factorize n)
の方が適してましたね
0272デフォルトの名無しさん
2006/06/17(土) 14:48:28>>267の期待通りになるかもしれないが、32or64bitで
表現されてる以上、strictに計算してみないと比較
できんわな。
0273デフォルトの名無しさん
2006/06/17(土) 16:21:51ユニット型()って独立した1つの型として扱われてるけど
たんなる要素数0のタプル型じゃね?
0274デフォルトの名無しさん
2006/06/17(土) 17:33:19>ユニット式 () は () 型 (4.1.2 節を見よ)の、 _|_ 以外の唯一の要素である。
>これは無引数タプルとみなすことができる。
0275デフォルトの名無しさん
2006/06/17(土) 22:53:24常識だったか。
0276デフォルトの名無しさん
2006/06/18(日) 20:37:20スクリプト言語で機能拡張できるソフトがあるじゃないですか、そんな感じで。
0277デフォルトの名無しさん
2006/06/18(日) 21:18:00FFI か。vice versa っていってるし。
http://www.cse.unsw.edu.au/~chak/haskell/ffi/
The Haskell 98 Foreign Function Interface (FFI) adds support for
invoking code written in other programming languages from Haskell and
vice versa.
0278デフォルトの名無しさん
2006/06/18(日) 21:53:50にあるが、便利なツールが何もないから、FFIの仕様を良く読んで頑張ってw
0279デフォルトの名無しさん
2006/06/19(月) 18:47:44OO厨ってキモイよ
ここ見るとそれがよく分かる
ttp://b.hatena.ne.jp/entry/http://blogs.itmedia.co.jp/tamaki/2006/06/post_57ab.html
0281デフォルトの名無しさん
2006/06/19(月) 21:50:070282デフォルトの名無しさん
2006/06/19(月) 21:59:04↓この辺が参考になるかも。
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/haskell/haskell-jp/145
http://d.hatena.ne.jp/tanakh/20040717
0283デフォルトの名無しさん
2006/06/19(月) 22:13:46http://www.haskell.org/haskellwiki/Libraries_and_tools/Interfacing_other_languages
0284デフォルトの名無しさん
2006/06/19(月) 23:16:11C++で作成したモジュールをHaskellにエクスポートするって方向で
Haskellで作って高速化したい細部をC/C++でとかじゃないの?
0285デフォルトの名無しさん
2006/06/19(月) 23:27:300286デフォルトの名無しさん
2006/06/19(月) 23:58:13実際やろうとすると難しい
俺には絵に描いた餅のように思える
0287デフォルトの名無しさん
2006/06/21(水) 07:34:20((. bar) . foo . bar) って書けるんだなと思ったが
さすがにこれは (\x y -> foo (bar x) (bar y)) って
書いたほうが可読性的にいいか。
0288デフォルトの名無しさん
2006/06/21(水) 09:07:03更に変形して ( . foo . bar ) ( . bar ) とすればfoo,barの出現順序が \ x y -> foo (bar x) (bar y) と同じになる。
もっと変形すれば ( . ( . foo)) ( . bar ) ( . bar ) と書けて、 . の数がそれぞれの引数の数に対応する。
ただ、そんな変形するよりも素直に foo (bar x) (bar y) と書いた方が可読性も良いし、リダクション数も少ない。
0289デフォルトの名無しさん
2006/06/22(木) 02:31:23このスレッドでは『入門Haskell』の評価があまり高くなかったけれど、
私はとてもいい本だと思った。とにかく面白かった。
もうLISPの時代じゃない、Haskellならこんなにエレガントに書けるんだ、という
主張が横溢していて、Schemeしか知らなかった私の目のウロコを吹き飛ばした。
しかし、モナドで挫折。ぜんぜん分からない。
『ふつうのHaskell』も読んでみた。『入門』よりずっとやさしく、これなら
LISPを知らなくても読めそう。しかしレイアウトルールや遅延評価、部分適用な
んかについてはずっと詳しく丁寧に説明されている。するする読めるぞ。
しかし、モナドで挫折。やはりぜんぜん分からない。
…まあ、継続やYコンビネータも、分かるのにホント、時間かかったから、モナドも諦めずに取り組むしかないか。
ということで、同じこれらの書籍の読者の皆さま、いかがお過ごしでしょうか?
何とかモナドは征服されましたか?
先達の皆さま、やはりここから先は、↓に取り組むしかないのでしょうか?
http://www.sampou.org/haskell/a-a-monads/html/
0290デフォルトの名無しさん
2006/06/22(木) 02:48:17>>33は?最初の方しか読んでないけど、最初の方はわかりやすい。
0291289
2006/06/22(木) 02:58:36ありがとう。あれは出てすぐに全部読んだ。
確かに分かりやすいけれど、今思うと、モナドの中の、IOモナドだけの説明だと思う。
つうか、説明じゃなくて比喩。
だからMaybeモナドやリストモナド、Stateモナドまでを統一的には理解できそうにない。
0292デフォルトの名無しさん
2006/06/22(木) 05:44:01・Maybe … a に値Nothingを加えた型
・State … s -> (s, a)
・Cont … (a -> r) -> r
・List … [a]
のように様々な構造をしている。これらはそれぞれ なんらかの「計算」を表すと見なせる。例えば:
・Maybe … 「失敗した」という意味のNothingを含むように拡張した型
・State … 「前の状態」をもらって、計算結果と次の状態の対を返す計算
・Cont … 「継続」(a ->r) をもらって、答えの型rの値を返す計算
・List … リストのどれもが値であるような、非決定的な計算。非決定性オートマトンの状態を思い浮かべると近いか
0293デフォルトの名無しさん
2006/06/22(木) 06:03:21(>>=) :: m a -> (a -> m b) -> m b
の型を持つと決めたら、かなり統一的に扱える。
ここで、(>>=) は、個々の計算を「組み合わせる」演算。
第一引数の、型m a の値は何らかの 型a の値を生み出す(Contはそうでもないか)。
ここで、その値を計算の途中で「取り出して」、
第二引数の、型(a -> m b) の関数に食わせてやると、最後に型 m b の値が得られる。
という一般的な構造を持っている。
例えば、
・Maybe … 左手がNothingなら結果もNothingとする演算。
(Just a) >>= f = f a
Nothing >>= _ = Nothing
・State … 左手の計算の結果で得た「次の状態」s' を、右手の計算の「前の状態」となるように組み合わせる演算
(State c) >>= f = State $ \s -> case c s of (a, s') -> case f a of State c' -> c' s'
・Cont … 左手の継続渡し計算cの続き(多分)に、右手の継続渡し計算c'を行うように組み合わせる(そして最後に、貰った継続kを行う)演算。
(Cont c) >>= f = Cont $ \k -> c (\a -> case f a of Cont c' -> c' k)
・List … 左手のリストそれぞれの要素に、右手の計算を行わせる。リスト[[a]]が得られるので、concatで[a]に潰す。
as >>= f = concatMap f a
0294デフォルトの名無しさん
2006/06/22(木) 06:05:44でっす。
上の説明でよくわからない所は遠慮なく聞いて欲しいっす。
0295デフォルトの名無しさん
2006/06/22(木) 06:10:19m a -> (a -> m b) -> m b
という型で表せる、という所が美しいんです。
又、これがちょうど do 構文のような手続き的な書き方にもマッチしているのも面白い。
0296デフォルトの名無しさん
2006/06/22(木) 07:48:54. :: (a->b) -> (b->c) -> (a->c)
0297デフォルトの名無しさん
2006/06/22(木) 07:58:56モナドを理解するには、よく使う二・三種類のモナドに十分に(普段のコーディングで使えるくらい)
慣れるのが一番早いと思う。というわけで教科書より実践を勧める。
多くの人にとってOrdクラスが難しくないのは整数や文字列の比較に親しんでいるからであって、
全順序集合の諸性質について特に勉強したわけじゃないだろう。
この順番はHaskellを使う上での重要度にも対応する。IOモナドの使い方を知らなければ
まともなプログラムを書けるかさえ怪しいが、モナドとは何かを知らなかったところで
多少設計の幅が狭まるだけだ。
とりあえずの理解としては、>>292のようにm a型の値を「計算」と捉えるとか、あるいは「範囲式([1..9]とか
['a'..'z']とか)の多重定義のためにEnumクラスがあるように、do式の多重定義のためにMonadクラスがある」
というのでいいんじゃないだろうか。
0298デフォルトの名無しさん
2006/06/22(木) 09:12:360299デフォルトの名無しさん
2006/06/22(木) 09:40:190300デフォルトの名無しさん
2006/06/22(木) 10:58:12柔軟性においてこれに勝る言語はない。
0301デフォルトの名無しさん
2006/06/22(木) 12:08:450302289
2006/06/22(木) 14:24:28例を並べて、それらに統一的な説明をもらったせいか、今までで一番分かった
気がするよ。心から感謝します。
結局ノマドというのは、二つ以上の計算を組み合わせる時の、汎用的、統一的
な方法ということなんだろう。
いろんな計算の組み合わせを、すべてノマドという様式で統一的に扱うように
したら、パワフルでエレガントで、見通しが利くようになった。その計算の内
容自体は、リストモナドみたいに簡単なものもあるし、そうでなくて難しいも
のもあるけど、様式はすべて同じ。
『入門Haskell』にはいろんなモナドが載っているけれど、どうも計算内容自
体が難しくて、ついていけなかった。これからしばらくは、内容よりも様式に
注目して、様式がどのように共通しているか、共通化されてどのように嬉しい
のか、一つ一つ考え直してみようと思う。
では、ありがとうございました。
0303デフォルトの名無しさん
2006/06/22(木) 15:02:00まあでもこの説明(>>292-295)で分かってもらえたんだったら、
これを広めればHaskellももっと認知されるな。
0304デフォルトの名無しさん
2006/06/22(木) 15:04:04モナド変換子とか foldMとかrepeatMとかかな?
あとは手当たり次第に、
Monad m => ... という型シグネチャを持ってる関数や型クラスを全部当たってみれば自ずと分かるな。
0305デフォルトの名無しさん
2006/06/22(木) 15:05:56>柔軟性においてこれに勝る言語はない。
そのとおりだけど、それが何か?
0306デフォルトの名無しさん
2006/06/22(木) 15:13:380307デフォルトの名無しさん
2006/06/22(木) 15:13:57静的型チェックがない言語なんて放っとけばいいじゃん。
0308デフォルトの名無しさん
2006/06/22(木) 15:17:250309デフォルトの名無しさん
2006/06/22(木) 15:49:48優れているというなら実例をいくつかあげてもらえるかな。
0310289
2006/06/22(木) 16:02:28すげえ。書いてるときは、この間違いに全然気づいてなかった。
遊牧民が何で関係あるんだ。
あまりの低能ぶりに自分でもびっくり。
0311デフォルトの名無しさん
2006/06/22(木) 16:36:45一旦数値を入れた変数に文字列入れることが簡単に出来るんだぜw
ほれ。
(setq a 1)
(setq a "string")
え?そんな副作用は汚いし避けるべきだって?
本当にそうかい?w
Lispなら2行で簡単に終わり。
既存のコードを修正することもない。
モナドのように仕様が肥大化することもないのさ。
新しい型を作るって?構造体使うって?
そんなことしなくてもLispなら2行で簡単に終わり。
既存のコードを修正することもないw
0312デフォルトの名無しさん
2006/06/22(木) 16:47:10H
これで"Hello, world!"が出るんだ。たった一文字だぜ!
短かさにおいてこれに勝る言語はない。
0313デフォルトの名無しさん
2006/06/22(木) 16:49:58ML風の型推論が欲しい、いっそCommon Lispの構文を持つHaskellが欲しい」と
言ってるんだけどねえ。
http://blogs.law.harvard.edu/philg/2003/09/22
参考)Greenspun's Tenth Rule of Programming
http://practical-scheme.net/wiliki/wiliki.cgi?Lisp%3aGreenspunsTenthRule
0314デフォルトの名無しさん
2006/06/22(木) 17:23:06悪魔の道へ突入していく。
0315デフォルトの名無しさん
2006/06/22(木) 17:59:56(replace '+ 'print func) ;;funcの中の+演算をprint関数に変える
みたいなことができてしまう。
funcのソースコードを動的にいじっているのも凄いし、
+とprintなんて引数の型とか全然違うのに置き換えられるのも凄い。
0316デフォルトの名無しさん
2006/06/22(木) 18:04:450317デフォルトの名無しさん
2006/06/22(木) 18:07:25「凄い」を「危ない」に置き換えて読めと言っているようにしか見えない。
>>311
>モナドのように仕様が肥大化
モナド知ってて書いてるのかこいつ。。。加えてSICPにも載ってるside effect bugをもう一度読み直してみれ。
簡単なのは良いことだし,emacsのような動的に拡張できたほうが気持ちが良い環境というのもあるけれど,
型が無いことは最早モダンなプログラミング言語のメリットに数えることは難しい。
0318デフォルトの名無しさん
2006/06/22(木) 18:09:01柔軟性をわざとなくしてるんだよ?
0319デフォルトの名無しさん
2006/06/22(木) 18:10:01モナドは言語仕様ではありません。
0320デフォルトの名無しさん
2006/06/22(木) 18:10:570321デフォルトの名無しさん
2006/06/22(木) 18:13:29特に純粋関数型部分なら,パターンマッチの漏れが無ければ,ランタイムエラーが「起こらない」。
(メモリのオーバーフローや,再帰が止まらない可能性はある)
Lispにそれができるのかな?
0322321
2006/06/22(木) 18:15:180323デフォルトの名無しさん
2006/06/22(木) 18:26:59人間が間違いを犯す余地を増やす。
Lisp は確かに柔軟であるが、使いこなすには
間違いを犯さない注意深く優秀な人間でなければいけない。
そのようなものにとっては Lisp は Haskell より優れているだろう。
しかし煽りだか釣りだかネタだかよくわからない>>311のようなバカには
Lisp は奨められない。Haskell にしとけ。
0324デフォルトの名無しさん
2006/06/22(木) 18:34:35わかってきてるんだよ。
時代が進むにつれてLispが有利になる。まだ時代はLispに追いついていないんだよ。
0325デフォルトの名無しさん
2006/06/22(木) 18:38:30>時代が進むにつれてLispが有利になる。
ガベコレや継続がまだ余り知られていなかった時代じゃあるまいし。
Lispに型システムさえあればねえ。。。
機械によるプログラムの安全性の保証が必要になる分野はこれから沢山出てくると思われる。
そんな所にLispが使われていたら俺は嫌だ。せめてJavaにしてくれ。
テストではバグがないことは示せないが、型ならある種のバグの不在が証明できる。
0326デフォルトの名無しさん
2006/06/22(木) 18:40:25時代が証明するだろうw
0327デフォルトの名無しさん
2006/06/22(木) 18:40:52> テスト駆動開発隆盛の現在、その危なさも問題じゃない
いやそれは危ないのが現実になってしまっても、
バグ頑張って取るから大丈夫ですって言ってるだけだろ。
0328デフォルトの名無しさん
2006/06/22(木) 18:41:460329デフォルトの名無しさん
2006/06/22(木) 18:43:04完 全 に 誤 解 で す 。
0330デフォルトの名無しさん
2006/06/22(木) 18:44:200331デフォルトの名無しさん
2006/06/22(木) 18:47:18基礎知識がないみたいだから、説明するにも基礎から説明しないといけなくなる。
0332デフォルトの名無しさん
2006/06/22(木) 18:49:130333デフォルトの名無しさん
2006/06/22(木) 18:51:00Haskellは数学を使っているし、最新の研究を盛り込んだ学術的な言語、
だからHaskellは凄いに違いない、マンセー!
そういう奴もあらわれるわな。
そういう雰囲気を持った言語だよ。Haskellってのは。
だから、Fortoranの次ぐらいに古いLispなんかに劣ってるとは信じられない、
相手が無知なんだ!そう思う気持もね。
その先入観はわかるw
0334デフォルトの名無しさん
2006/06/22(木) 18:54:40型のせいで理論が肥大化するんだよ。
0335デフォルトの名無しさん
2006/06/22(木) 18:54:52そうだね。妄想も激しいみたいだしね。
0336デフォルトの名無しさん
2006/06/22(木) 18:55:09初心者向けのテーマの議論を盛り上げようとしてくれているんだろうけれど、
ちょっとうまくかみ合わなくて、痛々しい感じがして、そこがつらいよな。
0337デフォルトの名無しさん
2006/06/22(木) 18:57:18普通にLisp信者ですが何か?w
Lispに劣ってるHaskellなんかが威張ってるのが気に食わなくてね。
0338デフォルトの名無しさん
2006/06/22(木) 19:02:420339デフォルトの名無しさん
2006/06/22(木) 19:02:57単に雰囲気だけじゃなく、利点があるわけで。
触りもせずに批判するのは怠慢。
全ての言語はLispに収束すると無批判に信じるのは無能。
というか、言語のどれが最強というのがそもそも意味がないんだけど。
>だから、Fortoranの次ぐらいに古いLispなんかに劣ってるとは信じられない、
ええ、Haskell にも、LispどころかJavascriptにさえ劣っている部分がありますよ。型があるってことです。
もちろん、Lispより優れている部分もあります。型があることと、遅延評価がある事です。
0340デフォルトの名無しさん
2006/06/22(木) 19:05:230341デフォルトの名無しさん
2006/06/22(木) 19:21:200342デフォルトの名無しさん
2006/06/22(木) 19:29:260343デフォルトの名無しさん
2006/06/22(木) 19:29:45自分のコードには型宣言をほとんど書かないこと。
型が仕様だというなら、推論させずに自分でちゃんと書け!
そうすればSystem F並の記述力も得られるだろが
0344デフォルトの名無しさん
2006/06/22(木) 19:33:450345デフォルトの名無しさん
2006/06/22(木) 19:39:300346デフォルトの名無しさん
2006/06/22(木) 19:39:52マクロとは別に、delay-forceって構文があるんだけど、とにかく煩雑になりがち。
何から何まで手動でやらなきゃならない。
Haskellの遅延評価、グラフ簡約を知ったときには、LISPがHaskellの30年前に
生まれた言語だということを痛感した。
0347デフォルトの名無しさん
2006/06/22(木) 20:24:10OCamlだってそうじゃねえか。
大抵はlambdaやマクロでこと足りるしな。
0348デフォルトの名無しさん
2006/06/22(木) 20:29:390349デフォルトの名無しさん
2006/06/22(木) 20:34:19ビバ遅延評価。まあ遅延評価じゃない方が良かったという意見はどっか上の方でもあったけど、
何度も言われているけど様は「向き不向き」でそ。
もちろん効率ばかり気にするCモンキーな人々には遅延評価はオススメできない。
0350デフォルトの名無しさん
2006/06/22(木) 20:39:300351デフォルトの名無しさん
2006/06/22(木) 20:53:42> そんな所にLispが使われていたら俺は嫌だ。せめてJavaにしてくれ。
Javaの型は明らかに崩壊しているので、アレなら無い方が記述力が上がって
便利なのではないかという気がするぞ…
0352デフォルトの名無しさん
2006/06/22(木) 21:05:51遅延評価のお陰でスッキリ書けるHaskellもいいぞ、と言ってるんだけど。それも釣りなのか。
0353デフォルトの名無しさん
2006/06/22(木) 21:11:06>343
0354デフォルトの名無しさん
2006/06/22(木) 21:15:59というかどうでもいいLisperよりもずっと気になる。
System F並の記述力って何? よく知らないので詳細きぼん。
System Fが多相型のシステムだというのは調べれば分かるんだけど。どれくらいリッチなのか。
0355デフォルトの名無しさん
2006/06/22(木) 21:27:32>ええ、Haskell にも、LispどころかJavascriptにさえ劣っている部分がありますよ。
お前、Javascriptをなめんなよ?
0356デフォルトの名無しさん
2006/06/22(木) 21:28:550357デフォルトの名無しさん
2006/06/22(木) 21:31:30Haskell厨は身の程をわきまえろよ。
0358デフォルトの名無しさん
2006/06/22(木) 21:32:430359デフォルトの名無しさん
2006/06/22(木) 21:34:41この辺。
0360デフォルトの名無しさん
2006/06/22(木) 21:36:50ところがどうしようもなく糞。
0361デフォルトの名無しさん
2006/06/22(木) 21:37:41Haskellの開発効率最強でしょうか。
0362デフォルトの名無しさん
2006/06/22(木) 21:38:040363デフォルトの名無しさん
2006/06/22(木) 21:42:03Haskellは開発環境を作るという点ではあまり向いていないかも。
便利な開発環境というのは、リアルタイムでソースを解析する必要があるけど、
ああいう複雑な構文は解析するのも一苦労じゃないかな。
JavaやC#の方が向いている。
Lispも向いているんだけど、最近誰も使ってないから、emacs以外は進化した環境が
あんまりないね。
0364デフォルトの名無しさん
2006/06/22(木) 21:47:18Haddockはパーザを持ってるわけだし,パッケージLanguage.Haskellとかも使えんかな。
とりあえずVisual Haskellとeclipsefpに期待。
Lispの開発環境にはアレグロ何とかがあるけど、この話をすると何とかさんが湧いてくるのでやめとく。
0365デフォルトの名無しさん
2006/06/22(木) 21:49:170366デフォルトの名無しさん
2006/06/22(木) 21:49:480367デフォルトの名無しさん
2006/06/22(木) 21:50:03文字コード変換ライブラリとかどっかに転がってないかな。
0368デフォルトの名無しさん
2006/06/22(木) 21:52:14あれは全言語含めた全開発環境中でトップクラスと言っても過言ではないでしょ。
NetBeansでJavaもいいけど。
開発環境ではJavaや.NETが一歩も二歩もリードしてる。
0369デフォルトの名無しさん
2006/06/22(木) 21:52:49haskellerなら英語で書きなよ。
0370デフォルトの名無しさん
2006/06/22(木) 21:55:310371デフォルトの名無しさん
2006/06/22(木) 21:58:58また年季の入ったLisperやSmalltalkerに喧嘩売るような発言を…
0372デフォルトの名無しさん
2006/06/22(木) 22:00:110373デフォルトの名無しさん
2006/06/22(木) 22:02:41結局静的型付けがない言語が生き延びてる。
それどころか、AjaxやPythonなどのブームで勢いを取り戻し始めている。
0374デフォルトの名無しさん
2006/06/22(木) 22:03:32Lispだろうなw
0375デフォルトの名無しさん
2006/06/22(木) 22:05:54ずっと変わらないのはLispだけ。
0376デフォルトの名無しさん
2006/06/22(木) 22:12:18また、HTTPが文字列ベースのプロトコルだから。
つまりIEその他のブラウザがクソで、wwwサーバやその仕様にも進歩がないから。
IEがユーザからの入力を型の付いた形で扱えていれば、それを操作するスクリプト言語も静的型付けのものを用いるのが妥当になる。
wwwサーバがCGIを呼び出す時点で型が付いた値を渡していれば、それを扱うwebアプリも静的型が付いた型安全な言語で良くなる。
全部レガシーのせい。もしくはwebの研究者とプログラミング言語の研究者がサボっているせい。
...等と言ってみる。
0377デフォルトの名無しさん
2006/06/22(木) 22:15:290378デフォルトの名無しさん
2006/06/22(木) 22:15:46Lispは時代のはるか先を行く言語だからな。
どこぞの言語がLispのガーベッジコレクションや遅延評価などを真似したりして
ちょっとずつ時代が追いついてきてるけどなw
0379デフォルトの名無しさん
2006/06/22(木) 22:21:55それぞれのプロトコルやwebサーバ、OS等も型付き言語を意識した設計がなされる。
なぜLisperがこうした未来を想像できないのか不思議だ。
ガベコレやクロージャが現在の言語でやっと使われているのと同じで、
C#やJavaにも型推論が入る時代が既にそこまで来ているわけで。
0380デフォルトの名無しさん
2006/06/22(木) 22:23:420381デフォルトの名無しさん
2006/06/22(木) 22:24:08効率は悪いし、そもそもmallocを呼んでfreeを呼ばない馬鹿は居ないと皆が思っていたからだ。
でも今ではガベコレ無しの言語なんて考えられない。
同じように、型や型推論がこの先重要な位置を占める世界を欠片も想像できないとは、おまえら本当にLisperなのか。
0382デフォルトの名無しさん
2006/06/22(木) 22:26:49答えはこういうことだよ。
静的型付けは*現在*重要な位置を占めている。
現在は動的型付けが馬鹿にされている時代だ。
効率は悪いし、危険だとみなが思っているからだ。
でもそのうち静的型付けの言語なんて考えられなくなる。
0383デフォルトの名無しさん
2006/06/22(木) 22:26:57もちろんそうじゃないlisperの方が多数派だろうが。
0384デフォルトの名無しさん
2006/06/22(木) 22:28:040385デフォルトの名無しさん
2006/06/22(木) 22:30:01現在はクラスを動的にロードしまくり、Springとかリフレクションバリバリ使って
どこが静的なんだよって感じだ。
今でも兆候は現れてるよ。
0386デフォルトの名無しさん
2006/06/22(木) 22:30:320387デフォルトの名無しさん
2006/06/22(木) 22:31:240388デフォルトの名無しさん
2006/06/22(木) 22:37:33>効率は悪いし、危険だとみなが思っているからだ。
危険なものと自分で言っているのに、それを今後みんなで使うようになると妄想できる根拠は何だ?
0389デフォルトの名無しさん
2006/06/22(木) 22:38:370390デフォルトの名無しさん
2006/06/22(木) 22:39:270391デフォルトの名無しさん
2006/06/22(木) 22:46:24関数型と手続き型
http://pc8.2ch.net/test/read.cgi/tech/1145115971/
関数型言語Part IV
http://pc8.2ch.net/test/read.cgi/tech/1083649982/
0392デフォルトの名無しさん
2006/06/23(金) 00:13:49http://pc8.2ch.net/test/read.cgi/tech/1145115971/
↑ちょうどいい。このスレでやるか
0393デフォルトの名無しさん
2006/06/23(金) 02:42:590394デフォルトの名無しさん
2006/06/23(金) 04:05:28まさに「スクリプト言語」はこれに相当して、
こういうのは逆に静的型付けだと鬱陶しい。
逆に、静的型付け言語は、長いプログラムを書くのに適している。
動的型付け言語で起こるだろう多くのバグを、
コンパイル時に排除できるからだ。
「素晴らしい言語」なんてのは、適用対象が違えば変わっていいわけで、
あるただ一つの言語だけが素晴らしいとか言ってんのは見てらんない。
0395デフォルトの名無しさん
2006/06/23(金) 04:20:150396デフォルトの名無しさん
2006/06/23(金) 04:20:540397デフォルトの名無しさん
2006/06/23(金) 04:54:35タイプセーフなわけで、こいつらを捕まえて型がないと言うのは
大間違いだぞ。CやC++に比べると、はるかにしっかりと型付け
されている。
0398デフォルトの名無しさん
2006/06/23(金) 05:54:140399デフォルトの名無しさん
2006/06/23(金) 06:11:42ここに張り付いてる動的型付け言語の信奉者がまさにそれなんだが。
0400デフォルトの名無しさん
2006/06/23(金) 06:14:470401デフォルトの名無しさん
2006/06/23(金) 06:20:04簡潔な構文と高階関数のおかげで幾らでも短く書ける。
おまけに型安全だから安心。
スクリプト言語のプログラムも関数型の機能を取り入れて、更に簡潔になる傾向にあるが、
これらには静的型付けもないし型推論もない。
短いプログラムを、何も考えずにさっと書けるのがスクリプト言語。
短いプログラムも、熟練すれば型安全にさっと書けるのが関数型言語。
確かに学習コストは少し高め。
0402401
2006/06/23(金) 06:23:400403デフォルトの名無しさん
2006/06/23(金) 09:25:03動的型言語が熟練を必要とせず、静的型言語が必要とする理由はあるのか?
ただ、慣れの問題では?
0404デフォルトの名無しさん
2006/06/23(金) 10:20:40ただ(静的型付けの)関数型言語が動的型付けの言語より学習コストが高い、というのは当たってると思う。
そうじゃなかったらもっとOCamlやHaskellの利用者が増えているだろう。
世の中、動的言語で提供される柔軟性が必要な分野ばかりではないから。
ただ、今流行ってるようなwebプログラミングにはいわゆる「柔軟性」が必要な部分があるのかもしれない。
0405デフォルトの名無しさん
2006/06/23(金) 11:09:43入門Haskellのほうは読まなくてよい。あれは・・特殊です。
0406デフォルトの名無しさん
2006/06/23(金) 12:10:43関数型言語になじみがなければ、「ふつう」
>>71-72
Lispなどを少し知ってれば、「入門」
>>289
でも、どっちにしろモナドはわからん
>>302
という事らしいw
0407デフォルトの名無しさん
2006/06/23(金) 14:22:22入門はさめがめの章でつまづいて、しばらく放置。
ただ、どちらも読みやすいよ。
その前に Craft of なんたらを読み始めてたけど、
数学の知識のない俺には例題の敷居が高すぎた。
0408デフォルトの名無しさん
2006/06/23(金) 16:04:350409デフォルトの名無しさん
2006/06/23(金) 19:06:060410デフォルトの名無しさん
2006/06/23(金) 20:28:54お前らそんなに素数とフィボナッチ数列が好きかと。
0411デフォルトの名無しさん
2006/06/23(金) 20:29:560412デフォルトの名無しさん
2006/06/23(金) 20:31:270413デフォルトの名無しさん
2006/06/23(金) 20:47:50分かりやすい例を挙げてるだけでしょ。
0414デフォルトの名無しさん
2006/06/23(金) 23:37:36わかったのがよかった。
monadと(オブジェクト指向の)メッセージチェーンと似ているのは意外で面白いな。
0415デフォルトの名無しさん
2006/06/24(土) 00:51:320416デフォルトの名無しさん
2006/06/24(土) 02:07:33俺のPCが98だからか?
0417デフォルトの名無しさん
2006/06/24(土) 02:08:470418デフォルトの名無しさん
2006/06/24(土) 18:10:36『入門Haskell』のP135なのですが、
[x | x <- [1..10], x `mod` 2 /= 0]
が
do {x <- [1..10]; guard(x `mod` 2 /= 0); return x}
と同等であるという説明があります。
ここの x <- [1..10]という演算が何をするのか、よく分かりません。
x <- [1] なら分かるのですが、複数の要素に何をしているのでしょう?
結果的には、[1..10]のすべての要素に guard 以下が実行され、その結果が
mplus である ++ で結合されています。
しかし、式の中には mplus も出てこないので、なぜmplusが呼ばれるのかも
分かりません。
↓も見てみましたが、
http://www.sampou.org/haskell/a-a-monads/html/listmonad.html
<- 演算子が何をするのか、mplusとどう関係するのか、結局分かりません
でした。
0419デフォルトの名無しさん
2006/06/24(土) 18:28:53ヒント: リストもモナド
0420418
2006/06/24(土) 18:46:15すみません、私はモナドを理解できていないのです。
質問が分かりにくいのかも知れませんので、補足します。
<- は return の逆演算に似ていて、リストモナドなら[a] を a に
戻す働きがあります。
x <- [1]なら、[1]を1に戻し、x を 1 に束縛するのだと思いますが、
x <- [1..10]だと、xに何が起こるのでしょう?
まさか1〜10が同時に束縛されるはずはないし。
0421デフォルトの名無しさん
2006/06/24(土) 18:56:04do { v0 <- e0; v1 <- e1; ...; eN }
は
e0 >>= (\v0 -> e1 >>= (\v1 -> ... eN))
の略記。このことと、
x >>= f = concatMap f x
return x = [x]
guard b = if b then return () else mzero
mzero = []
を踏まえると、次のように変形できる。
do {x <- [1..10]; _ <- guard(x `mod` 2 /= 0); return x}
= [1..10] >>= \x -> guard(x `mod` 2 /= 0) >>= \_ -> return x
= [1..10] >>= \x -> (if x `mod` 2 /= 0 then [()] else []) >> \_ -> return x
= [1..10] >>= \x -> (if x `mod` 2 /= 0 then [()] else []) >> \_ -> [x]
= [1..10] >>= \x -> concatMap (\_ -> [x]) (if x `mod` 2 /= 0 then [()] else []
= [1..10] >>= \x -> if x `mod` 2 /= 0 then [x] else []
= concatMap (\x -> if x `mod` 2 /= 0 then [x] else []) [1..10]
見ての通り、mplusは無関係。
0422デフォルトの名無しさん
2006/06/24(土) 19:05:23>x <- [1..10]だと、xに何が起こるのでしょう?
直感的には、次のような感じ。
・まずx=1として後続の計算が行い、この結果をv1とする。この例ではv1 = [1]
・次にx=2として後続の計算を行い、この結果をv2とする。この例ではv2 = []
・以下同様にv3..v10を計算し、すべてを++で結合する。
この操作はconcatMapに他ならない。厳密な定義は>>421参照。
0423418
2006/06/24(土) 19:07:11ありがとうございます。ちょっと考えてみます。
0424421
2006/06/24(土) 19:14:55>= [1..10] >>= \x -> (if x `mod` 2 /= 0 then [()] else []) >> \_ -> [x]
>= [1..10] >>= \x -> concatMap (\_ -> [x]) (if x `mod` 2 /= 0 then [()] else []
この三行は間違ってた。こっちが正解。
>= [1..10] >>= \x -> (if x `mod` 2 /= 0 then [()] else []) >>= \_ -> return x
>= [1..10] >>= \x -> (if x `mod` 2 /= 0 then [()] else []) >>= \_ -> [x]
>= [1..10] >>= \x -> concatMap (\_ -> [x]) (if x `mod` 2 /= 0 then [()] else [])
二回>>=を>>と書いていたのと、括弧の閉じ忘れ。
混乱させてすまん。
0425デフォルトの名無しさん
2006/06/24(土) 22:10:41c2hs(C->Haskell)を使って簡単なプログラムを書いてみたのですが、
どうしてもコールバック関数の登録・呼び出しあたりがうまく動きませんでした。
どなたかFFIに詳しい方、解決法を教えて下さい。
お願いします。
↓がそのソースです。
http://park7.wakwak.com/~blackbox/cgi-bin/wifky.cgi?p=Haskell%3A%3AFFI%A4%C8GUI;f=simple.tar.gz
IUP (Portable User Interface): http://luaforge.net/projects/iup/
0426デフォルトの名無しさん
2006/06/24(土) 22:22:13Listの >>= は concat . map なのですね。
do ... = ... >>= ... >>= ... >>=
ここは納得できたのですが、
> [1..10] >>= \x -> concatMap (\_ -> [x]) (if mod x 2 /= 0 then [()] else [])
> [1..10] >>= \x -> if mod x 2 /= 0 then [x] else []
この置き換えが分かりません。
m >>= (\x -> mzero) == mzero
規則にあるこれだとは思うのですが・・
ユニット型がなにか特別な意味を持つのですか?
0427426
2006/06/24(土) 22:25:11(return x) >>= f == f x
こっちの方ですね。
>>=がmapなんだから、[]を吐けば以後の計算を殺して[]が返せるのか。
0428デフォルトの名無しさん
2006/06/25(日) 05:44:33動かしてないけど、少なくともHaskellのコールバックを呼ぶ可能性のある関数はunsafeで呼んじゃいけないと思う。
0429デフォルトの名無しさん
2006/06/25(日) 08:22:200430425
2006/06/25(日) 08:45:27ありがとうございます。確かにunsafeを外したら動きました。
きちんと理解せずにunsafeを付けていました。
単に副作用のある関数を呼ぶときにunsafeを付けるのだと思ってました。
0431デフォルトの名無しさん
2006/06/25(日) 16:27:150432デフォルトの名無しさん
2006/06/25(日) 19:43:170433デフォルトの名無しさん
2006/06/25(日) 21:48:570434デフォルトの名無しさん
2006/06/25(日) 21:52:250435デフォルトの名無しさん
2006/06/25(日) 21:54:04これ以外ではシステムの標準的なdllにしか依存しないと思う。
0436425
2006/06/26(月) 13:35:36ghc -cで生成された.oファイルたちをarでまとめて
IUPの必要なライブラリとともにld -r -whole-archiveでghci用の.oファイルを作ったのですが、
ghciで実行しようとするとunknown symbol `_CoInitializeEx'が出てしまい動かせませんでした。
なので、前回実行ファイルを作るときにリンクしてたole32とかのライブラリを追加してみたら
今度はUnknown PEi386 section name `.idata$4'となって駄目でした。
どうしたらいいんでしょう?
0437デフォルトの名無しさん
2006/06/26(月) 15:47:48mixi内で色々教えてもらったのですが。ぶっちゃけ何がわからんかすらわからなくなってしまいました。
もう諦めモードで検索する気も起きないです。
答え教えてください。
0438437
2006/06/26(月) 15:50:24すまそ。
0439デフォルトの名無しさん
2006/06/26(月) 15:55:520440デフォルトの名無しさん
2006/06/26(月) 17:59:29良かったね。二度とくんな
0441デフォルトの名無しさん
2006/06/27(火) 22:44:57答えをどッかに見えるところに
還元すれ
0442デフォルトの名無しさん
2006/06/27(火) 23:18:43mixi内のHaskellコミュ。
0443デフォルトの名無しさん
2006/06/28(水) 14:20:480444デフォルトの名無しさん
2006/06/28(水) 15:14:14GHCだとメモリ不足は問答無用で強制終了。
ところで、「型構築子でメモリがないとき」ってなんだ?
データ構築子の間違いか?
0445デフォルトの名無しさん
2006/06/28(水) 20:01:00メモリ不足が勝手に死んでたら、Haskell ではまともなアプリは書けないな。
致命的な言語設計だな。
0446デフォルトの名無しさん
2006/06/28(水) 20:35:170447デフォルトの名無しさん
2006/06/28(水) 23:34:150448デフォルトの名無しさん
2006/06/28(水) 23:41:060449デフォルトの名無しさん
2006/06/28(水) 23:45:170450デフォルトの名無しさん
2006/06/29(木) 00:06:190451デフォルトの名無しさん
2006/06/29(木) 00:14:550452デフォルトの名無しさん
2006/06/29(木) 00:50:55各種実装の問題だな
0453デフォルトの名無しさん
2006/06/29(木) 03:10:15そんなレベルの奴らじゃあこれも上達せずに放り投げるのだろうな。
0454デフォルトの名無しさん
2006/06/29(木) 06:43:330455デフォルトの名無しさん
2006/06/29(木) 18:32:56JavaではきちんとOutOfMemoryが言語仕様として定義されてるけどね。
0456デフォルトの名無しさん
2006/06/29(木) 18:42:000457デフォルトの名無しさん
2006/06/29(木) 19:35:550458デフォルトの名無しさん
2006/06/29(木) 20:14:310459デフォルトの名無しさん
2006/06/29(木) 20:53:570460デフォルトの名無しさん
2006/06/29(木) 20:59:25そんなレベルの奴らじゃあこれも上達せずに放り投げるのだろうな。
0461デフォルトの名無しさん
2006/06/29(木) 21:47:34それ言語仕様って言うの?
0462デフォルトの名無しさん
2006/06/29(木) 22:04:080463デフォルトの名無しさん
2006/06/29(木) 22:11:10JavaではきちんとOutOfMemoryが言語仕様として定義されてるけどね。
0464デフォルトの名無しさん
2006/06/29(木) 23:14:21じゃあ、getLine なんか使ってるプログラムに長い行を入力すると落ちるのか。
実験してみようとしたけど、落ちる前にスラッシングでハードディスクが
心配になり小心ゆえに実験を継続できない。
なにはともあれ、しぶといことは分かった。
0465デフォルトの名無しさん
2006/06/30(金) 00:08:28しょうがないなぁ。突っ込んでやるよ。
再 帰 か よ !!
0466デフォルトの名無しさん
2006/07/01(土) 00:10:21http://kasamatusan.sakura.ne.jp/cgi-bin2/src/ichi42186.jpg
0467デフォルトの名無しさん
2006/07/01(土) 00:12:340468デフォルトの名無しさん
2006/07/01(土) 00:15:44jpgのうしろに .htmlをつけて
ダウンロード をクリックすれ。
0469デフォルトの名無しさん
2006/07/01(土) 01:08:34萌フォルダとgagフォルダのどっちに入れるか正直悩んだぞ
0470デフォルトの名無しさん
2006/07/02(日) 09:42:31目が完全に逝っちゃってますが・・・。
http://up.mugitya.com/img/Lv.1_up42411.jpg
0471デフォルトの名無しさん
2006/07/02(日) 12:29:54l ( ● 'ー' ● )
! / -―- 、 ヽ
| l '⌒l l⌒' .l
ヘ 〃, { ̄} ,〃
/  ̄ ̄ ヽ
0472デフォルトの名無しさん
2006/07/02(日) 18:52:57馬鹿野郎!
すれ違いもいい加減にしやがれ
#でもnukoフォルダに入れた。うきゃー
0473デフォルトの名無しさん
2006/07/03(月) 00:41:50うは。
さすが2ch
AAになるとは思わなかった
0474425
2006/07/03(月) 12:36:15Cのヘッダではコールバック関数の型は
typedef struct Ihandle_ Ihandle;
typedef int (*Icallback)(Ihandle*);
と定義されているので FunPtr (Ptr () -> IO CInt) のような型に読み替えられるわけですが、
実際に登録されるコールバック関数はIhandle*以外にも引数を取るようなものだらけだったりします。
この場合、コールバック関数の型ごとにラッパーを用意してやるしかないのでしょうか?
0475425
2006/07/03(月) 14:51:050476デフォルトの名無しさん
2006/07/06(木) 13:20:03クロージャはなぜ重要なのでしょうか?
この前、知人と部分適用とカリー化について話をしていて、
add x y = x + y という関数があるとして、
add2 = add 2 と書けば簡単に x=2と束縛したクロージャが得られるんだ、と
説明したところ、知人に、
function add2(y) {
return add(2, y);
}
で良いんじゃない?何でそんな仕組みが必要なの?と言われました。
絶句しましたが、自分は理由を説明できなかったのです。考えてみたら、
Haskellは再代入ができませんから、クロージャが保持している変数を変更す
ることはできない。良くあるような、呼び出すたびに値をインクリメントする
カウンタなどのクロージャは書けないのです。こうしてみると、上のHaskell
のadd2と下のJavaScriptのadd2()の違いは、関数呼び出しが一段余計に行われ
ていることだけのような気がします。
こういう場合、クロージャであることには重要性はないのでしょうか?もし重
要性があるならその理由を、重要性がないなら、どういう場合にクロージャが
重要なのか、さわりだけでもお教えいただけたら幸いです。
0477デフォルトの名無しさん
2006/07/06(木) 13:52:14その場合は2が定数だからadd2をクロージャ無しで書けるけど、
実行時に決まる値を使いたい場合はそうはいかない。
0478476
2006/07/06(木) 14:48:14ありがとうございます。
何か学術的な答えを予想していたので、ちょっとびっくりしました。
例えば、クロージャがないとYコンビネータが書けない、とか、言語仕様で
○○を実現するために必要、とか。
すると、値が実行時に決まる場合のみ、クロージャには意味があるのでしょうか?
定義時に決まる場合、クロージャである必要はないのでしょうか?
0479デフォルトの名無しさん
2006/07/06(木) 18:33:13ありそうな気がするが……。
0480デフォルトの名無しさん
2006/07/06(木) 19:04:370481デフォルトの名無しさん
2006/07/06(木) 19:27:20俺もそれの必要性が理解出来てない一人。
add2 y = add 2 y
で良い気がする。
しかも
div x y = x / y
half x = div x 2
と同じことが出来ないと思うし。
0482デフォルトの名無しさん
2006/07/06(木) 19:39:25add_x y = add x y
0483デフォルトの名無しさん
2006/07/06(木) 19:52:20なんとなく分かったような。
その場合、yを束縛した関数が帰ってくる?
逆にxだけ縛る方法ってあるの?
0484デフォルトの名無しさん
2006/07/06(木) 19:53:04>>476が問うているのはクロージャの必要性。
お前が言っているのはカリー化の必要性。
カリー化はクロージャと違って無くてもそれほど記述力が失われる訳じゃないだろ。
Haskellにカリー化があるのは、便利なのと、型システムや文法が単純化されるからだと思う。
0485484
2006/07/06(木) 19:54:25忘れてくれ。
0486デフォルトの名無しさん
2006/07/06(木) 19:59:33あ、もしかしてadd_y xで良い?
0487デフォルトの名無しさん
2006/07/06(木) 20:00:33違う。xだけ束縛している。
例えば、リストの全ての要素にnを加算するなら、
addAll n list = map (add n) list
と書ける。このとき、addの第一引数はnに固定されている。
yだけ束縛したいなら、
add_y x = add x y
または、無名関数を使って
\x -> add x y
で良い。
0488デフォルトの名無しさん
2006/07/06(木) 21:09:050490デフォルトの名無しさん
2006/07/07(金) 09:26:14「重要」って言葉を選んでいるのはどうしてなの?
「何でそんな仕組みが必要なの?」への答えは、
「〜は重要である」でなければいけないの?
実は>>476の文章とは裏腹に、
「絶対に必要な理由」を求めようとしている気がする。
>>478にそれが透けて見える。
0491486
2006/07/07(金) 11:36:07方法は見つけたけど、引数の順番を変えたdiviRを定義しないような、
もっとシンプルな書き方無いかな?
divi x y = x / y
-- half = x / 2 と同等
half = diviR 2
where
diviR y x = divi x y
-- "3.5"を出力
main = putStr (show (half 7))
0492486
2006/07/07(金) 11:38:450493デフォルトの名無しさん
2006/07/07(金) 12:08:48まず、何をしたいのかはっきりさせてくれ。
単に二で割る関数を書きたいなら、
half x = divi x 2
で良いし、2に限らず一般のmで割りたいなら
divm m = f
where
f x = divi x m
とすれば良い(カリー化を使えばもっと簡単になる)。
部分適用だけを使ってhalfを定義したいというなら、それは無理。
0494デフォルトの名無しさん
2006/07/07(金) 12:18:54half=flip (/) 2
0495デフォルトの名無しさん
2006/07/07(金) 12:20:38もっとくどく書け。
0496486
2006/07/07(金) 12:40:57わざわざ言わなくても良いと思ったんだけど。
別に割る関数が欲しいんじゃなくて、
途中又は最後の引数に対してカリー化したいという話。
diviが複雑な関数だったら、ということ。
で、無理ですか。ちょっと残念だけどサンクス。
0497デフォルトの名無しさん
2006/07/07(金) 12:54:46half x = divi x 2
で良くなる。
divi x y = x / y
--このdiviYをよりシンプルに定義する方法
diviY y = f y
where
f y x = divi x y
half = diviY 2
main = putStr (show (half 7))
0498476
2006/07/07(金) 12:56:29> 実は>>476の文章とは裏腹に、
> 「絶対に必要な理由」を求めようとしている気がする。
うわあ、大正解です。
例えば、モナドもクロージャで実装されていると聞いたことがありまして(う
ろ覚え)、クロージャがHaskellにとって本質的に必要なのではないかと予想
していたのです。
>>476は、それを考えるきっかけではありましたが、本当に知りたいこととは
少しずれています。
0499486
2006/07/07(金) 13:05:58>>487の例で書きます。
--こんな感じで書きたい。n(割る数)を固定する
diviAll n list = map (divi ? n) list
0500デフォルトの名無しさん
2006/07/07(金) 13:16:44そのままでは無理だけど、
diviAll n list = map (flip divi n) list
とか、
diviAll n list = map (`divi` n) list
とか、
diviAll n list = map (\x -> divi x n) list
などと書ける。どれも単純な部分適用ほど読みやすくないけど。
diviがもっとたくさんの引数を取る複雑な関数だったら、
diviAll n list = map divN list
where
divN x = divi x n
というスタイルが書きやすいかな。
0501デフォルトの名無しさん
2006/07/07(金) 13:21:44> diviAll n list = map (`divi` n) list
今回はdivi = (/)なわけだから、
diviAll n list = map (/ n) list
でOK。
実際、(/ 2) 4 = 2.0だし。
0502486
2006/07/07(金) 13:46:05こういう使い方は知らなかったんで、勉強になった。
-- v = 10 `divi` 2
-- v = (`divi` 2) 10
-- v = (/) 2 10
-- v = (10/) 2
v = (/2) 10
main = putStr(show v)
> diviAll n list = map (`divi` n) list
2引数の場合は、これが一番スマートですね
0503デフォルトの名無しさん
2006/07/07(金) 14:30:473番目だけ違ってる。
(/) 2 10 = 2 / 10
0504デフォルトの名無しさん
2006/07/09(日) 23:49:13空文字列をputStrなどはナシで。
0505デフォルトの名無しさん
2006/07/09(日) 23:55:39main = return ()
0506504
2006/07/10(月) 00:03:24できました。ありがとうございます。
ところで、main = IO () では駄目なんでしょうか?
Not in scope: data constructor `IO' だそうです。
0507デフォルトの名無しさん
2006/07/10(月) 00:24:080508504
2006/07/10(月) 01:04:53IO型のデータ構築子について知るには、どこを見ればよいでしょう??
0509デフォルトの名無しさん
2006/07/10(月) 01:21:350510デフォルトの名無しさん
2006/07/10(月) 04:22:18IO aは抽象型であって、データ構築子は公開されていない。
代わりにデータ構築用の関数(return, (>>=), putChar, putStr, ...)が
公開されているから、それを使う。
0511504
2006/07/10(月) 06:37:28IO型のデータ構築用の関数について知るには、どこを見ればよいでしょう??
0512デフォルトの名無しさん
2006/07/10(月) 07:45:34一覧が欲しいってこと?IO動作を返す関数なんていくらでも書けるし、
Cの関数を自由にforeign importできるから完全な一覧はありえないけど、
Haskell98の範囲なら、Prelude, Monad, IO, Directory, Systemあたりのライブラリを
調べればいいんじゃないだろうか。
これらのライブラリの仕様はHaskell Reportに載ってる。
0513デフォルトの名無しさん
2006/07/10(月) 08:17:430514デフォルトの名無しさん
2006/07/10(月) 08:18:480515あかさ
2006/07/10(月) 08:55:590516デフォルトの名無しさん
2006/07/13(木) 15:02:18ということはprintf的なものも無理?
0517デフォルトの名無しさん
2006/07/13(木) 15:17:180518517
2006/07/13(木) 15:19:05脊椎反射レススマソ。
0519デフォルトの名無しさん
2006/07/13(木) 15:23:06基本的には無理。ただし型クラスを駆使して実現できる場合もある。(Text.Printf参照)
他にも、Template Haskellでコンパイル時にフォーマット引数を解釈したり、
C++みたいに二項演算子で妥協することもできる。
0520デフォルトの名無しさん
2006/07/13(木) 20:27:03感動した。
0521デフォルトの名無しさん
2006/07/14(金) 04:51:14型クラスのコードを読めるようになりたいんだけど、このあたりの挙動について
参考になる文書か何かweb上にある?
0522デフォルトの名無しさん
2006/07/14(金) 13:49:50add = (+) の型が
Integer -> Integer -> Integer
となるのですが、 (+)の型が、
(Num a) => a -> a -> a
なのにどうしてでしょうか。
0523デフォルトの名無しさん
2006/07/14(金) 13:53:19単相性限定
http://www.sampou.org/haskell/tutorial-j/pitfalls.html#sect12.3
0524デフォルトの名無しさん
2006/07/14(金) 14:49:13η展開形 add x y = (+) x y で定義すると add :: (Num a) => a -> a -> a になるよ。
0525516
2006/07/14(金) 21:07:10http://www.haskell.org/ghc/docs/latest/html/libraries/base/Text-Printf.html
これか、ありがとう
引数を左から巻き取っていくわけか すごい
C++の<<ならできそうと思っていたが、これも同じような仕組みでできるんだな
0526デフォルトの名無しさん
2006/07/15(土) 13:56:279th Annual ICFP Programming Contest
http://icfpcontest.org/
じゃあ、よろしく。
0527デフォルトの名無しさん
2006/07/17(月) 05:27:300528デフォルトの名無しさん
2006/07/19(水) 23:56:05本が発売された前後だけかw
0529デフォルトの名無しさん
2006/07/20(木) 10:07:46タプルは、LISPの多値に対応するものだと思うのですが、ある関数の戻り値が
タプルの場合、それを受け取れる関数は、引数がタプルである必要があります
(よね?)。多引数の関数に汎用的に与えることはできません。2つ組みのタ
プルの場合だけは、curryとuncurryがありますが。
ということで、多値の代用としてのタプルの使い方の定石のようなものがあっ
たら、教えていただきたいのです。
ちなみにPythonにもタプルがありますが、こちらは、関数に複数の引数を与え
る代わりに、タプルを与えることができます。* という演算子があって、
a = (1, 2, 3)
(lambda x y z: x + y + z)(*a) => 6
という書き方ができます。
再代入のできる手続き型言語とは、だいぶ事情は違うのでしょうが。
0530529
2006/07/20(木) 10:09:55(lambda x, y, z: x + y + z)(*a) => 6
引数のカンマが抜けていました。まあPythonの話ですが。
0531デフォルトの名無しさん
2006/07/20(木) 11:13:24任意のnに対してn-タプルを受け取る関数、といったものは定義できません。
どうしてもそういうのが欲しいのならTemplateで「n-タプルのi番目の要素を取ってくる」
みたいなのをコンパイル時に生成するとか、タプルでなくともHeterogeneousなリストが
使いたいだけならType Classを駆使するとか、方法はなくはない。
ときに、実装内部はともかく、Haskellに「多引数の関数」は存在しないので誤解なきよう。
0532529
2006/07/20(木) 14:16:32タプルとリストが違うこと、Haskellには厳密な意味では複数引数の関数は存
在しないことなどは、一応理解しているつもりです。
Template Haskellというのは初めて知りました。こういうものがあるんですねえ。
http://www.haskell.org/th/
「Scheme:多値」を今回読み返したところ、
http://practical-scheme.net/wiliki/wiliki.cgi?Scheme%3a%e5%a4%9a%e5%80%a4
以前は読み飛ばしていた
「関数型言語では、1-in, 1-outが普通だ。一見複数の引数を渡してるように
見えても、 タプルを使ったりcurryingしたりして、少なくとも意味上は1-in,
1-outになっている。」
という言葉が目に留まりました。
ちょっと考えたのですが、ある組み合わせのタプルを返す関数を書くなら、同
じ組み合わせのタプルを受け取る関数も書くのが普通、という理解でよいでしょ
うか?
0533デフォルトの名無しさん
2006/07/20(木) 14:48:59>ちょっと考えたのですが、ある組み合わせのタプルを返す関数を書くなら、
>同じ組み合わせのタプルを受け取る関数も書くのが普通、という理解でよいでしょうか?
受け取る関数がないならタプルを返す関数はそもそも必要とされないと思う。
もし受け取る関数がないのに必要とされるならばそれは副作用がメインで、
おまけでタプルが返ってくるような場合なんではなかろうか。
0534デフォルトの名無しさん
2006/07/20(木) 15:06:25タプルがそれ自身で意味を持つ場合、引数もタプルで取ることがある。例えば、
Data.Ix.range :: (Ix a) => (a, a) -> [a]
Data.Ix.index :: (Ix a) => (a, a) -> a -> Int
この場合(a, a)で「範囲」を意味している。
一方、単に複数の戻り値を返したいというだけの場合は、
いちいちパターンマッチで取り出すのが普通だと思う。
let (a, b, c) = f x in g a b c
この使いわけがあるから、カリー化された関数にタプルをそのまま渡せなくてもそれほど困らない。
もちろん、不便な場合もたしかにあると思うが。
不便だと思えば、uncurry3, uncurry4, ...を定義するとか、
型クラスとGHC拡張を使ってこれら全部に同じ名前を与えるとか、
Template Haskellで一般化して$(uncurry 4)みたいに書けるようにするなどすれば良いと思う。
>再代入のできる手続き型言語とは、だいぶ事情は違うのでしょうが。
どちらかというと型システムとか構文糖に対する態度とかの問題じゃないだろうか。
0535デフォルトの名無しさん
2006/07/20(木) 15:17:17>受け取る関数がないならタプルを返す関数はそもそも必要とされないと思う。
そんなことはないだろ。例えばsplitAtの結果のタプルをそのまま別の関数に渡すことは滅多にないと思うが。
0536デフォルトの名無しさん
2006/07/20(木) 15:25:20splitAtの結果をfstとかsndとかパターンマッチで分解するでしょ。
この場合fstやsndとかパターンマッチがタプルを受け取る関数ですよ。
fstもsndもタプルのパターンマッチも使わない状況でタプルを返されたとしたら、
それは基本的に必要のないタプルなんだと思うけど。
0537デフォルトの名無しさん
2006/07/20(木) 15:40:26そういうことか。分かった。
しかし、>>529の文脈
>、ある関数の戻り値が
>タプルの場合、それを受け取れる関数は、引数がタプルである必要があります
>(よね?)。
からして、たぶん>>532が言いたいのは、
「ある組合せのタプルを返す関数があったとして、その関数の結果を引数として受け取る関数を書くとき、
その関数を(カリー化された形ではなく)タプルをそのまま受け取るように書くのが普通だ、という理解で良いか?」
だと思う。
0538デフォルトの名無しさん
2006/07/20(木) 16:41:51uncurryT :: Int -> ExpQ
uncurryT n = lamE [varP f, pat] (rhs n)
where
f = mkName "f"
pat = tupP (map (varP . mkName) ["x" ++ show i | i <- [1 .. n]])
rhs 0 = varE f
rhs m = appE (rhs (m-1)) (varE . mkName $ "x" ++ show m)
0539529
2006/07/22(土) 11:05:19強になりました。ありがとうございます。
標準のHaskellではまだタプルを扱う標準的な方法は無いようなので、私はと
りあえず、必要に応じてuncurry3, uncurry4, ... を作って使うことにします。
>>537 私の意図については、おっしゃるとおりです。私の拙い言葉を補ってい
ただき、大変恐縮です。
>>538 すばらしい!これでuncurryをn個作らなくても良くなるのですね。まだ
私には理解できませんが。
0540デフォルトの名無しさん
2006/07/22(土) 11:36:590541デフォルトの名無しさん
2006/07/22(土) 17:08:11まだー
0542デフォルトの名無しさん
2006/07/23(日) 03:08:13関数の内容は無意味ですが、例えば
f :: Int -> Int
f x = let y = x + 1 in
| x == 1 = y
| otherwise = 0
がsyntax errorになります。
f x = let y = x + 1 in case x of
_ | x == 1 -> y
| otherwise -> 0
ならいけましたが、見栄えが悪いです。
0543デフォルトの名無しさん
2006/07/23(日) 03:21:11where使えばすっきりする。
f x
| x == 1 = y
| otherwise = 0
where
y = x + 1
0544デフォルトの名無しさん
2006/07/23(日) 23:49:520545デフォルトの名無しさん
2006/07/25(火) 17:00:400546デフォルトの名無しさん
2006/07/25(火) 17:11:490547デフォルトの名無しさん
2006/07/26(水) 22:21:50最初はよくわからないから、とにかくParserが返す型に注意して、
do 構文も多用しておっかなびっくりコーディングしてたけど、
だんだん慣れてくると、解析したい構文が簡潔明瞭にコードで表現できる
ようになってくる。
これマスターすれば、正規表現がいらなくなりそう。
(今はまだ、正規表現のほうが早く書けるけど)
0548デフォルトの名無しさん
2006/07/26(水) 22:42:300549デフォルトの名無しさん
2006/07/26(水) 23:20:060550デフォルトの名無しさん
2006/07/26(水) 23:43:580551デフォルトの名無しさん
2006/07/27(木) 00:04:480552デフォルトの名無しさん
2006/07/27(木) 00:05:330553デフォルトの名無しさん
2006/07/27(木) 00:13:50最初はよくわからないから、とにかくParserが返す型に注意して、
do 構文も多用しておっかなびっくりコーディングしてたけど、
だんだん慣れてくると、解析したい構文が簡潔明瞭にコードで表現できる
ようになってくる。
これマスターすれば、正規表現がいらなくなりそう。
(今はまだ、正規表現のほうが早く書けるけど)
0554デフォルトの名無しさん
2006/07/27(木) 00:19:350555デフォルトの名無しさん
2006/07/27(木) 00:31:330556デフォルトの名無しさん
2006/07/27(木) 01:25:28環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0557デフォルトの名無しさん
2006/07/27(木) 05:12:180558デフォルトの名無しさん
2006/07/27(木) 05:26:560559デフォルトの名無しさん
2006/07/27(木) 10:38:510560デフォルトの名無しさん
2006/07/27(木) 15:12:490561デフォルトの名無しさん
2006/07/27(木) 23:31:240562デフォルトの名無しさん
2006/07/28(金) 00:26:150563デフォルトの名無しさん
2006/07/28(金) 02:14:57コンパイラが文法と型チェックしてくれるのが
うれしい。
0564デフォルトの名無しさん
2006/07/28(金) 05:11:05もちろんそうだが、Parsecが正規表現のように簡潔な記法でない以上、
正規表現が要らなくなることはないと言いたかった。
しかし、コンパイル時にパーサの文字列表現を解釈してParsecパーサに変換することも
Template Haskellを使えばできるんだろうな、たぶん。
0565デフォルトの名無しさん
2006/07/28(金) 09:57:140566デフォルトの名無しさん
2006/07/31(月) 09:07:400567デフォルトの名無しさん
2006/07/31(月) 18:10:260568デフォルトの名無しさん
2006/07/31(月) 19:14:46未だに正式リリースを出せないくらい難しいの?
0569デフォルトの名無しさん
2006/08/04(金) 20:25:140570425
2006/08/04(金) 21:13:52まだまだ作りかけですけど、ウィンドウを開いたりボタンを付けたりとかはできます。
http://park7.wakwak.com/~blackbox/
0571デフォルトの名無しさん
2006/08/04(金) 23:10:180572デフォルトの名無しさん
2006/08/04(金) 23:25:53お前ら……少しは会話しろよw
0573デフォルトの名無しさん
2006/08/05(土) 02:16:34欲しいです
0574デフォルトの名無しさん
2006/08/05(土) 06:12:17いるいる!
0575デフォルトの名無しさん
2006/08/05(土) 16:46:240576デフォルトの名無しさん
2006/08/05(土) 18:52:300577デフォルトの名無しさん
2006/08/05(土) 21:01:080578デフォルトの名無しさん
2006/08/05(土) 21:09:250579571
2006/08/05(土) 21:15:00http://aploda.org/dl.php?mode=pass&file_id=0000005126.zip
Preludeで定義されているものは一通り強調表示するはずです。
気に入らないところは適当に直して使ってください。
0580デフォルトの名無しさん
2006/08/05(土) 22:17:010581デフォルトの名無しさん
2006/08/05(土) 22:18:10EclipseFP と比べてどっちが良い?
0582デフォルトの名無しさん
2006/08/05(土) 23:12:090583デフォルトの名無しさん
2006/08/06(日) 02:30:07引きやすくてなかなかよい
0584デフォルトの名無しさん
2006/08/06(日) 04:12:44もろた
0585デフォルトの名無しさん
2006/08/06(日) 23:32:59わろた
0586デフォルトの名無しさん
2006/08/14(月) 01:43:08自分で関数を定義するしか無いんでしょうか?
なんか、すごく遅くなりそうなんですが・・・
0587デフォルトの名無しさん
2006/08/14(月) 02:26:57split _ "" = []
split c s = let (l, s') = break (== c) s
in l : case s' of
[] -> []
(_:s'') -> split c s''
というコードを拾って自己解決しました。
0588デフォルトの名無しさん
2006/08/14(月) 09:50:06使用例
Prelude> Text.Regex.splitRegex (Text.Regex.mkRegex " +") "I am a pen!!"
["I","am","a","pen!!"]
なんてのはhoogleをsplitで検索するだけですぐ出てくるのにあ
0589デフォルトの名無しさん
2006/08/14(月) 10:00:120590デフォルトの名無しさん
2006/08/14(月) 11:34:31haskell用のgoogle(?)があるんですね。知りませんでした。
0591デフォルトの名無しさん
2006/08/19(土) 05:06:260592デフォルトの名無しさん
2006/08/19(土) 06:26:080593デフォルトの名無しさん
2006/08/19(土) 06:27:50現場レベルで使われるようになるでしょうか?
正直私はそこが知りたい。
0594デフォルトの名無しさん
2006/08/19(土) 06:50:240595デフォルトの名無しさん
2006/08/19(土) 07:33:03ハスケルにはOOPは必要ないということを言っていますか?
O'Haskellという試みもあったようですが、
既にすたれているようですが、それはやっぱり
HaskellとOOPが馴染まないという事でしょうか?
0596デフォルトの名無しさん
2006/08/19(土) 08:02:350597デフォルトの名無しさん
2006/08/19(土) 09:23:17確かに実装の継承やらダウンキャストやらを実現しようとすると大変だけど
「状態をカプセル化し、同一性がある」型は比較的簡単に書ける(標準のHandleが一例)。
存在型を使えば実行時多相も実現できる。
0598デフォルトの名無しさん
2006/08/19(土) 09:30:25例えばIOモナドの中で生きるデータはいくらでも状態を持てるんだが。
純粋な関数型ってのは、入出力をする関数にそうでない関数とは
別の型を付けるってだけであって、表現力が変わるわけではないんじゃね?
0599デフォルトの名無しさん
2006/08/19(土) 16:10:27http://www.haskell.org/haskellwiki/Why_Haskell_matters#Haskell_vs_OOP
これ?「できるけど切り口が違う」って書いてるな
カプセル化:クラスを定義して必要な関数だけエクスポート
多態性:タイプクラスがJavaでいうinterface
継承:一つの型が複数の親を持つことはできるが孫クラスは不可
個人的にはJavaと用語が被ってるのが覚えにくい原因だと思う
0600デフォルトの名無しさん
2006/08/20(日) 02:56:320601デフォルトの名無しさん
2006/08/20(日) 11:48:16http://science4.2ch.net/informatics/
名前ちょっと変な気もするけど、一応計算機科学の板が出来たみたい
0602・∀・)っ-○◎●新世紀ダンゴリオン ◆DanGorION6
2006/08/20(日) 13:09:06会社・職業のところにITの板新設してドカタを追い出すのが正統だよな
0603デフォルトの名無しさん
2006/08/20(日) 13:42:31infosysとinfomaticsは違う板だぞ?
0604・∀・)っ-○◎●新世紀ダンゴリオン ◆DanGorION6
2006/08/20(日) 14:23:040605デフォルトの名無しさん
2006/08/20(日) 14:23:081. オブジェクト単位でのグループ分けはできない
2. モジュール単位でのグループ分けができる
3. オブジェクト単位でのグループ分けができないのはまったく大した問題ではない。
と言っている。
個人的には、メソッド名がクラススコープなのは便利なので
これは言い過ぎだと思うが。
0606デフォルトの名無しさん
2006/08/25(金) 02:07:22Schemeプログラマのレベル10
http://practical-scheme.net/wiliki/wiliki.cgi?Scheme%3aScheme%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9e%e3%81%ae%e3%83%ac%e3%83%99%e3%83%ab10
Perlプログラマのレベル10
http://d.hatena.ne.jp/naoya/20050809/1123563794
0607デフォルトの名無しさん
2006/08/25(金) 10:00:46instance (RealFloat a) => Num [a] where
[a,b,c] + [d,e,f] = [a+d,b+e,c+f]
は出来るのに、
instance (RealFloat a) => Num (a,a,a) where
(a,b,c) + (d,e,f) = (a+d,b+e,c+f)
は出来ないのかな?仕様を見る限り出来そうな気がするんだけど、なんか間違ってる?
0608デフォルトの名無しさん
2006/08/25(金) 10:29:47http://www.sampou.org/haskell/report-revised-j/decls.html#instance-decls
> instance cx' => C (T u1 ... uk) where { d }
>
>ここで k>=0 および T は型シノニムではない。インス タンス化された構築子、
>(T u1 ... uk) は型構築子を単純な型変数 u1, ... uk に適用し たものである。
>これらの型変数は別々のものでなければならない。
というわけで、同じ型変数は二度使えない。
GHCとHugsではこれを許す拡張があるけど(ghc -fglasgow-exts および hugs -98)。
0609デフォルトの名無しさん
2006/08/25(金) 10:52:43そういうことだったか、ありがとう
0610デフォルトの名無しさん
2006/08/30(水) 03:48:460611デフォルトの名無しさん
2006/09/02(土) 16:28:05ttp://channel9.msdn.com/showpost.aspx?postid=231495
0612デフォルトの名無しさん
2006/09/03(日) 09:33:41一日中Haskellしてんの?
0613デフォルトの名無しさん
2006/09/03(日) 10:07:57それは思った。
しかもこの手の言語いじってる奴って大抵メジャーな言語も網羅してるし。
0614デフォルトの名無しさん
2006/09/03(日) 12:17:21遅すぎるわ
0615デフォルトの名無しさん
2006/09/03(日) 17:15:100616デフォルトの名無しさん
2006/09/03(日) 17:33:360617615
2006/09/03(日) 17:45:25そうじゃない偉い人がいっぱいいる気がする。
0618デフォルトの名無しさん
2006/09/03(日) 17:46:340619デフォルトの名無しさん
2006/09/03(日) 18:15:300620デフォルトの名無しさん
2006/09/03(日) 18:28:250621デフォルトの名無しさん
2006/09/03(日) 18:58:050622デフォルトの名無しさん
2006/09/03(日) 19:05:55偽なり
0623デフォルトの名無しさん
2006/09/05(火) 18:06:510624デフォルトの名無しさん
2006/09/05(火) 20:44:420625デフォルトの名無しさん
2006/09/05(火) 22:21:45どんなことに使ってますか。
0626デフォルトの名無しさん
2006/09/05(火) 22:24:240627デフォルトの名無しさん
2006/09/05(火) 22:43:540628デフォルトの名無しさん
2006/09/05(火) 23:32:45って本を誰か出版してくれ
0629デフォルトの名無しさん
2006/09/05(火) 23:48:270630デフォルトの名無しさん
2006/09/05(火) 23:50:050631デフォルトの名無しさん
2006/09/06(水) 00:43:220632デフォルトの名無しさん
2006/09/06(水) 06:56:20first class continuationは?
0633デフォルトの名無しさん
2006/09/07(木) 07:55:300634デフォルトの名無しさん
2006/09/07(木) 08:16:24コンパイラ技法を勉強するだけなら
別に Haskell じゃなくても、
使う言語はなんでもいいんじゃない。疑似言語でも。
Haskell で Haskell コンパイラの話か?
0635デフォルトの名無しさん
2006/09/07(木) 13:23:58そっちの方が人口多そうだ。
0636デフォルトの名無しさん
2006/09/07(木) 19:49:32class Animal a where
call :: a -> String
data Dog = Dog
instance Animal Dog where
call a = "bowwow"
data Sparrow = Sparrow
instance Animal Sparrow where
call a = "cheep"
みたいなのがあって、
animals = [Sparrow, Dog, Sparrow]
main = foldr1 (>>) (map (putStrLn . call) animals)
だとリストの中身の型が統一されていないってエラーになる。
型クラスはJavaのインターフェイスに似てるって「ふつうの」で読んだけど、
DogもSparrowもAnimalなんだから[Animal]のリストに入れられないの?
というかAnimalという型ができるわけじゃないのかな。
自分Java上がりなんだけど、Javaみたいな考え方がHaskellに通用しなくてまいった
0637デフォルトの名無しさん
2006/09/07(木) 20:21:21たぶん、
class Animal a where
call :: a -> String
instance Animal Dog where
...
instance Animal Sparrow where
...
として
func :: Animal a => [a] -> String
とした場合、
func :: [Dog] -> String
func :: [Sparrow] -> String
という2つの関数が作られるといった感じの理解のほうが近いように思う。
そして動的に関数を選択するのではなくコンパイル時には
すでに使用される関数は決定しているのだと思う。
クラスの意味としては、
Animalクラスのインスタンスならば、関数callを持っているということが保証される
という感じか。
0638デフォルトの名無しさん
2006/09/07(木) 20:56:57そうか、じゃあ[Animal]のリストを作るには
data Animal = Dog | Sparrow
call :: Animal -> String
call Dog = "bowwow"
call Sparrow = "cheep"
animals = [Sparrow, Dog, Sparrow]
main = foldr1 (>>) (map (putStrLn . call) animals)
とやるしかないかな。これだとAnimalに新しい仲間Catが加わったときに
callにも修正が入るよね。
call Cat -> "meow"
を追加し忘れてもコンパイルエラーは出ないし(フラグで警告は出せるらしいけど)、
こういうパターンマッチを全体にばら撒いてしまったら手に負えない。実際さっきそれで苦労してた。
コレだとまるでC言語で巨大なswitch文を書かざるを得なかった時代に逆行してる…
なんとかならんものかな?
0639デフォルトの名無しさん
2006/09/07(木) 21:00:56call Cat -> "meow" じゃなかった
call Cat = "meow" だ
0640デフォルトの名無しさん
2006/09/07(木) 22:22:24module Main where
import Data.Dynamic
data Dog = Ddog String deriving (Show, Typeable)
data Sparrow = Dsparrow String deriving (Show, Typeable)
class Animal a where
call :: a -> String
instance Animal Dog where
call (Ddog x) = x ++ ": \"bowwow\""
instance Animal Sparrow where
call (Dsparrow x) = x ++ ": \"cheep\""
dog x = toDyn $ Ddog x
sparrow x = toDyn $ Dsparrow x
animals = [dog "pochi", dog "shiro", sparrow "p-ko"]
callD x = case show x of
"<<Main.Dog>>" -> call (fromDyn x undefined :: Dog)
"<<Main.Sparrow>>" -> call (fromDyn x undefined :: Sparrow)
main = mapM_ (putStrLn . callD) animals
う〜ん、なんか無駄にややこしくなってるだけか。
call (fromDyn x undefined) だけで動いてくれれば良いんだけど、型が曖昧だからダメって言われるんだよな。
0641デフォルトの名無しさん
2006/09/07(木) 22:26:58したらいいのかは具体例に沿って考えないとよくわからん。型の切取り方がう
まくないんだと思うが。
ちなみに、 OCaml では polymorphic variant といって、「拡張可能な data」
みたいなのが簡単に作れる。 Haskell でも HList を使うと polymorphic
variant ができるという話。
ただどっちにしても、型エラーが発生したときは死にそうになる。
0642デフォルトの名無しさん
2006/09/07(木) 22:56:22Monadius見たら
weapon = missile | shot | laser ...
update missile = ...
update laser = ...
orz
Haskellで綺麗な設計でゲーム作れるんだろうか?
0643デフォルトの名無しさん
2006/09/07(木) 23:40:27リストに複数の型を押し込めたいのであればExistentially quantified typesが使えます。
ここら辺が参考になります。
http://en.wikibooks.org/wiki/Haskell/Existentially_quantified_types#Example:_heterogeneous_lists
http://haskell.org/ghc/docs/latest/html/users_guide/type-extensions.html#existential-quantification
http://d.hatena.ne.jp/lethevert/20060902/p1
コードはこんな感じでしょうか。
{-# OPTIONS -fglasgow-exts #-}
class Animal a where
call :: a -> String
data Dog = Dog
instance Animal Dog where
call _ = "bowwow"
data Sparrow = Sparrow
instance Animal Sparrow where
call _ = "cheep"
data AnimalH = forall a. Animal a => AH { a :: a, f :: a -> String }
animals :: [AnimalH]
animals = [AH Sparrow call, AH Dog call, AH Sparrow call]
main = foldr1 (>>) $ map (putStrLn . (\(AH x f) -> f x)) animals
0644デフォルトの名無しさん
2006/09/07(木) 23:53:18main = mapM_ (putStrLn . (\(AH x f) -> f x))) animals
ですね。
0645デフォルトの名無しさん
2006/09/08(金) 00:06:11data AnimalH = forall a. Animal a => AH a (a -> String)
じゃないと文句言われた。(GHC 6.4.2)
>>644
閉じ括弧が1個多い。
ちなみに、↓でもOKだった。
data AnimalH = forall a. Animal a => AH a
animals = [AH Sparrow, AH Dog, AH Sparrow]
main = mapM_ (putStrLn . (\ (AH x) -> call x)) animals
0646デフォルトの名無しさん
2006/09/08(金) 00:06:400647デフォルトの名無しさん
2006/09/08(金) 00:24:350648636と638
2006/09/08(金) 01:45:07凄い、Existentially quantified typesで完全に解決した!感動した!
OCamlやConcurrent Cleanみたいな他の関数型言語を学んでみるのも、
Haskellを使いこなす助けになるみたいだね。そのうちかじってみよう
ついでにmapM_も知ったし、みんなありがと
0649デフォルトの名無しさん
2006/09/08(金) 09:23:36data Animal = Animal { animalCall :: String }
dog :: Animal
dog = Animal { animalCall = "bowwow" }
sparrow :: Animal
sparrow = Animal { animalCall = "cheep" }
animals :: [Animal]
animals = [sparrow, dog, sparrow]
main = mapM_ (putStrLn . animalCall) animals
クラス階層(哺乳類と動物の関係とか)が必要ないなら、こっちが扱いやすいと思う。
0650デフォルトの名無しさん
2006/09/08(金) 22:10:34プロトタイプ信者乙
0651デフォルトの名無しさん
2006/09/08(金) 23:09:24実はそれも考えてたんだけど、dogとsparrowが別の構造を持つと困る。
たとえば、Sparrowは空を飛べるから「飛行高度」みたいなフィールドが必要になったとき、
Animalに追加すると飛べないdogにも追加されてしまって無駄になる。
それが必要なければ649がきっと一番シンプルだよね
0652デフォルトの名無しさん
2006/09/09(土) 02:17:200653デフォルトの名無しさん
2006/09/09(土) 04:10:090654デフォルトの名無しさん
2006/09/09(土) 09:13:35>>649のAnimalはインタフェースを表現する型であって、
個々の動物の構造を反映するものじゃない。
「飛行高度」のフィールドをAnimalインタフェースを介してのみ
使う(飛行高度によって鳴き声が異なる、とか)なら
sparrow :: Height -> Animal
を用意するだけで十分だし、専用のインタフェースから使いたいなら、
data Sparrow = {- 専用インタフェース -}
sparrowAsAnimal :: Sparrow -> Animal
で良く、いずれにしてもAnimalの変更は必要ない。
ただし、後者の場合は、>>649に書いたように
型クラスを使ったほうが便利かもしれないけど。
0655デフォルトの名無しさん
2006/09/10(日) 00:13:09一長一短
0656デフォルトの名無しさん
2006/09/10(日) 01:14:14ダウンキャストしたいとかなると大変なんだけど。
0657デフォルトの名無しさん
2006/09/10(日) 02:05:38本当だ。existential quantificationなしでもうまくいった。
代数的データ型をC++/Javaのクラスみたいなものだと思うのが、俺の勘違いの素みたい。
慎重に書いてけばダウンキャスト(?)も必要なさそうだ。
あぁ、感動のあまりもう手元のコードの大半をexistential quantificationで書き換えてしまった。
もっと落ち着いて、それぞれの方法を検討してみることにするよ。
0658デフォルトの名無しさん
2006/09/10(日) 15:35:17emacsのhakell-modeをインストールして
main = do cs <- getContents
putStr cs
と打って2行目でタブを押すとputStr csの先頭がgetContentsの真下にインデントされるんですが、
正しくはcsの真下ですよね?
手動インデントが激しくメンドクサイのですがなんとかならんでしょうか?
0659デフォルトの名無しさん
2006/09/10(日) 15:58:10main = do {
cs <-getContents;
putStr cs
}
とすればいいじゃん。
0660デフォルトの名無しさん
2006/09/10(日) 16:18:43何回か押せば?
0661デフォルトの名無しさん
2006/09/10(日) 18:20:19Emacsのタブインデントはそういうことじゃない。
0662デフォルトの名無しさん
2006/09/10(日) 19:31:46python-mode.elやhaskell-mode.elは
タブを押す回数によってインデントのレベルが変る
>>658の場合
getContents のあと改行してタブを押すと getContents までインデントされる
もう一度タブを押すと cs と同じレベル
次は main が補完される
次は一番外
もう一度押すと getContents までインデントされて以下ループ
使ったことないのに何言ってるの??
0663デフォルトの名無しさん
2006/09/10(日) 19:58:32知らなかった。ありがとう。
0664デフォルトの名無しさん
2006/09/10(日) 20:27:260665デフォルトの名無しさん
2006/09/10(日) 21:04:01あるよ。ttp://eclipsefp.sourceforge.net/index.html
0666デフォルトの名無しさん
2006/09/10(日) 21:34:420667デフォルトの名無しさん
2006/09/10(日) 22:53:49この場合、 turn-on-haskell-indent を
実行することに気付いてないんじゃない?
M-x turn-on-haskell-indent か、hookに入れとく。
# ちなみに、turn-on-haskell-simple-indentっていう、段が変わるだけのもある。
0668デフォルトの名無しさん
2006/09/10(日) 23:43:08;; (setq auto-mode-alist
;; (append auto-mode-alist
;; '(("\\.[hg]s$" . haskell-mode)
;; ("\\.hi$" . haskell-mode)
;; ("\\.l[hg]s$" . literate-haskell-mode))))
;;
;; (autoload 'haskell-mode "haskell-mode"
;; "Major mode for editing Haskell scripts." t)
;; (autoload 'literate-haskell-mode "haskell-mode"
;; "Major mode for editing literate Haskell scripts." t)
;; (add-hook 'haskell-mode-hook 'turn-on-haskell-decl-scan)
;; (add-hook 'haskell-mode-hook 'turn-on-haskell-doc-mode)
;; (add-hook 'haskell-mode-hook 'turn-on-haskell-indent)
;; (add-hook 'haskell-mode-hook 'turn-on-haskell-simple-indent)
0669デフォルトの名無しさん
2006/09/12(火) 04:55:12オレには無理みたいだ
0670デフォルトの名無しさん
2006/09/12(火) 05:04:430671デフォルトの名無しさん
2006/09/12(火) 08:49:41なにそのキッチンシンク第二弾
0672デフォルトの名無しさん
2006/09/14(木) 22:49:23これを使えばダウンキャストができる…わけではない。主型はひとつ。
0673デフォルトの名無しさん
2006/09/14(木) 22:51:380674デフォルトの名無しさん
2006/09/15(金) 00:11:30{-# OPTIONS_GHC -fglasgow-exts #-}
import Data.Typeable
import Data.Maybe
data Showable = forall a. (Show a, Typeable a) => S a
xs :: [Showable]
xs = [S (6::Int), S "foo", S '\^C', S "bar"]
fromShowable :: (Typeable a) => Showable -> Maybe a
fromShowable (S x) = cast x
main = putStrLn $ concat $ catMaybes $ map fromShowable xs
0675sage
2006/09/15(金) 12:29:370676デフォルトの名無しさん
2006/09/15(金) 13:00:37"foobar"と出た
concatがString要求してるからfromShowableがShowable->Maybe Stringになるらしい
catMaybesでStringにならなかったやつは消える
結局元々Stringだったのが残る
0677デフォルトの名無しさん
2006/09/16(土) 00:58:10細かいがStringを要求しているのはputStrLnね
0678デフォルトの名無しさん
2006/09/17(日) 15:33:35cmp :: (Ord a) => (a -> a -> Bool) -> NumberOrString -> NumberOrString -> Maybe Bool
cmp op (Number n) (Number m) = Just $ op n m
cmp op (String s) (String t) = Just $ op s t
cmp _ _ _ = Nothing
こんな関数を作ろうと思ったんですが
Couldn't match the rigid variable `a' against `Int' ...
と出てきてコンパイルできません。このような関数を定義するにはどうしたらいいんでしょうか?
0679デフォルトの名無しさん
2006/09/17(日) 16:21:59たぶん、やりたいことと型が合っていない。
その型だと、型変数aにはOrdのインスタンスであればどんな型でも代入できるから、
例えば、aにDoubleを代入した
(Double -> Double -> Bool) -> NumberOrString -> NumberOrString -> Maybe Bool
も、cmpの型の一つということになる。
つまり、opとしてDouble -> Double -> Boolの関数を渡せる訳だが、
これは意図したことじゃないだろう。
opとして「全てのOrdのインスタンスに適用できる関数」を期待するなら、
GHCやHugsでは、rank-2 polymorphismという拡張を使って、次のように書ける。
cmp :: (forall a. (Ord a) => a -> a -> Bool) -> NumberOrString -> NumberOrString -> Maybe Bool
ちなみに、この記法で元のcmpの型を表記すると、
cmp :: forall a. (Ord a) => (a -> a -> Bool) -> NumberOrString -> NumberOrString -> Maybe Bool
となって、変数aの全称量化のされかたが違うことが分かる。
0680デフォルトの名無しさん
2006/09/17(日) 17:17:240681デフォルトの名無しさん
2006/09/17(日) 18:37:00なんか動機とははそれでも良いじゃないと思うオレ
格好からはいるのが悪とは思ってないしモチベーションになればいいかなと
上の会話が理解出来るくらいのレベルになりたいなぁ
たぶん Haskell の理解度と言うよりプログラマとしてある程度のレベルに達してないとダメだろうなぁ
もっと頑張らないと
0682デフォルトの名無しさん
2006/09/17(日) 20:07:29forall a in { Int, String }. ...
と書けるdecidableな型systemがあれば何の問題もなかった。
0683デフォルトの名無しさん
2006/09/18(月) 10:20:580684デフォルトの名無しさん
2006/09/18(月) 10:25:06だけじゃないけど、正直それもあるw
メジャーなパラダイムや言語は押えておきたいというのが主な理由。
仕事で使うことは無さそうだけど、考え方の幅は広がるだろうから。
0685デフォルトの名無しさん
2006/09/18(月) 10:35:16おれの場合きちんと大学とかで計算機科学やってないから、
コンプレックスがあるんだよね。Haskell やるより計算機科学の
教科書マジメに読んだほうが早いかもしれないけど、
新しい概念を追いつづけるのは楽しいし格好良いと信じてる。
0686デフォルトの名無しさん
2006/09/18(月) 18:00:07計算機科学を学んだほうがいい。
子どものときは大人のアドバイスは聞かないが。
0687デフォルトの名無しさん
2006/09/18(月) 20:52:16その大人のアドバイスは子供の性質を考慮していないオナニーアドバイスだからだよ。
要するに好奇心旺盛な子供には、Haskellを通じてどうやって計算機科学を教えるかを考えるべきだ。
0688デフォルトの名無しさん
2006/09/18(月) 20:57:36なんかエロい構文
0689デフォルトの名無しさん
2006/09/18(月) 21:01:25Haskellの勉強を片手間にしつつ
計算機科学の勉強を勝手にHaskellと
関連付けながらしっかりこなせる。
難しいのは、好奇心が半端な子供へのアドバイスだ。
で、それとは別の話で、計算機科学の勉強したいだけなら、
どっかで教科書指定されてるような大きい本を買ってきて
一通り読んで、基本情報処理技術者試験でもうければいいよ。
どうせ基礎教養のようなもんだから、一通り触っておけば十分だろ。
その基礎を完璧に固めるのは結構苦労するけど。
0690デフォルトの名無しさん
2006/09/18(月) 21:41:19仕事ばっかで時間がないけど…
SICP みたいな質のたかーいじっくり楽しめるハスケル本希望。
0691デフォルトの名無しさん
2006/09/18(月) 22:04:25人それぞれ何じゃないかなぁ
それ以上言っちゃうと言葉遊びになっちゃうよ
0692デフォルトの名無しさん
2006/09/18(月) 22:09:59これは忘れてた。
暇人じゃないとなると量をこなす必要のある勉強はなかなか難しいよな。
0693デフォルトの名無しさん
2006/09/18(月) 22:20:17毎日時間決めてやれば問題ない。
俺とかおまえみたいに2chにきてる様じゃ駄目だろうけどな。orz
0694デフォルトの名無しさん
2006/09/18(月) 23:51:20でも2ch以外にHaskellの情報源なんて無くね?
0695デフォルトの名無しさん
2006/09/19(火) 00:19:08情報処理学会誌にたまに載る
0696デフォルトの名無しさん
2006/09/23(土) 13:12:05たとえば、必ず昇順になってるリストとか。
普通?の言語だと、操作もコンストラクタも自在だから、
性質を保つ操作だけ提供して、コンストラクタは空か最初にソートすればいい。
でもHaskellだと、データ構築子使って、
性質に違反した値をリテラルみたいに書けちゃうのを禁止できなくない?
0697デフォルトの名無しさん
2006/09/23(土) 13:21:51ADTじゃだめなの?
0698デフォルトの名無しさん
2006/09/23(土) 15:22:41モジュールで、データ構築子を隠して関数の利用を強制できるのか。
サンクス。
0699デフォルトの名無しさん
2006/09/24(日) 21:32:26haskell ってパーサーの構築に似てるとオモタ。
perl の RecDescent にそっくり。
0700デフォルトの名無しさん
2006/09/25(月) 12:09:15アンインストーラがまともに動かんけど。
0701デフォルトの名無しさん
2006/09/25(月) 20:01:300702デフォルトの名無しさん
2006/09/25(月) 20:47:520703デフォルトの名無しさん
2006/09/25(月) 21:37:290704デフォルトの名無しさん
2006/09/29(金) 12:29:03自分でコントロールできる型はいいけど、
クラスのインスタンスが、単に必要なメソッドを提供するだけじゃなくて、
クラスが求める制約を満たす、って出来ないのかな。
モナド則を満たさないでMonadインスタンス作ったらコンパイルエラーとか。
プログラム停止性問題とか絡むのかな?
0705デフォルトの名無しさん
2006/09/29(金) 19:13:37どうせソースの見た目が奇妙なんだから関数名も奇妙にしてほしい
0706デフォルトの名無しさん
2006/09/29(金) 20:01:220707デフォルトの名無しさん
2006/09/29(金) 20:35:03同感。
下線区切りかハイフン区切りか、せめて全部小文字にして、
CやPerlみたいに短い名前を使ってほしい。
>>706
例えばopenFileはopen_fileかopenfileかfopenにして欲しい。
0708デフォルトの名無しさん
2006/09/29(金) 20:41:38俺はopenFileが一番好き
0709デフォルトの名無しさん
2006/09/29(金) 20:48:390710デフォルトの名無しさん
2006/09/29(金) 21:03:55関数名も奇妙に、っていうのはそれでいうとどれ? fopen みたいなのを想定
してたのかな。
おれは openFile の方がいいよ。
CamelCase か下線区切りか、みたいなのはどっちでもいいんだが、短い名前で
省略するよりは冗長な方がずっといい。
0711デフォルトの名無しさん
2006/09/29(金) 21:13:300713デフォルトの名無しさん
2006/09/29(金) 21:34:05例えば↓みたいなのがモナド則を満たすかどうかをチェックできないと駄目なわけだよね。
import System.Random
import System.IO.Unsafe
import Control.Exception
data BadMonad a = X a | Y a deriving Show
instance Monad BadMonad where
return x = rndChg (X x)
X a >>= f = rndChg (f a)
Y a >>= f = rndChg (f a)
rndChgIO = randomIO >>= \ b -> return $ if b then id else chg
rndChg = unsafePerformIO rndChgIO
chg (X x) = Y x
chg (Y y) = X y
data BadMaybe a = BJust a | BNothing deriving Show
instance Monad BadMaybe where
return = dontStop . BJust
BJust a >>= f = dontStop $ f a
BNothing >>= f = dontStop $ BNothing
dontStop x = unsafePerformIO ( evaluate (reverse [0..]) >> return x )
BadMonadはたまに満たしちゃうこともある。
BadMaybeは一応満たすんだけどまじめに評価すると止まらない。
0714705
2006/09/29(金) 22:41:39fold は->((/)) とか激しい記号にしてほしい
0715デフォルトの名無しさん
2006/09/29(金) 22:43:080716デフォルトの名無しさん
2006/09/29(金) 22:54:170717デフォルトの名無しさん
2006/09/29(金) 23:16:58714の記号は何を意味していてどこがわかりやすいのかな。
0718デフォルトの名無しさん
2006/09/29(金) 23:34:320719デフォルトの名無しさん
2006/09/30(土) 02:03:36親切丁寧なライブラリがあった方が嬉しい。
0720デフォルトの名無しさん
2006/09/30(土) 03:03:41標準語でOK
0721デフォルトの名無しさん
2006/09/30(土) 14:19:24ところで、みんなは、日本語どうしてるの?
0722デフォルトの名無しさん
2006/09/30(土) 14:26:180723デフォルトの名無しさん
2006/09/30(土) 14:46:40つうか、コードの中じゃなくて、IOだよIO。
0724デフォルトの名無しさん
2006/09/30(土) 15:08:56EUCでソースを保存してiconvで変換
0725デフォルトの名無しさん
2006/09/30(土) 15:14:27使いたい文字コードをCharひとつに1バイトずつ埋め込んでおけば
とりあえずIOは通る。汚いけど。
俺の場合はたまたまその文字コードがUTF-8だっただけ。
0726ニュース速報+
2006/09/30(土) 15:17:35ニュース速報+ 板
http://news19.2ch.net/newsplus/
【社会】ICFPの国際プログラミング・コンテストで日本のチーム「kuma-」が2位に
http://news19.2ch.net/test/read.cgi/newsplus/1159369025/
0727デフォルトの名無しさん
2006/09/30(土) 15:32:30Charが16bitのくせに、こいつら1バイト単位じゃない?
これでどうやって日本語ファイルを扱えるようにするかって事。
初心者だから間違ってたらスマン。
0728デフォルトの名無しさん
2006/09/30(土) 16:01:00CharはUnicodeのコードポイントを表す型だけど、
GHCのIOライブラリは、まるでエンコードされた文字列のうちの一バイトを
表す型であるかのように扱う。
例えば、日本語版Windowsで、sjisで「欠席」とだけ書かれたファイルをreadFileした場合、
['\27424', '\24109']
が返るのが正しいが、実際は
['\140', '\135', '\144', '\200']
が返る。同様に、writeFileで「欠席」と書かれたファイルを作りたいなら、
['\140', '\135', '\144', '\200']を渡さないといけない。
>>724-725は、この挙動に合わせて、Charを1バイトを表す型として使っている。
ついでに言うと、
>Charが16bitのくせに
Charは21ビット。
0729デフォルトの名無しさん
2006/09/30(土) 16:03:51そんなこと一言も聞いてないが
0730デフォルトの名無しさん
2006/09/30(土) 16:35:13にあるIconv.hsc使ってる。ただ、このバージョンだとメモリリークするバグがあるので次のようにして直す(他にも[Word8]ではなく、StringからStringに変換する関数を追加してる)。
19c19
< module Iconv
---
> module Text.Iconv
25a26
> , iconvString
27c28
<
---
> , convertString
36c37,38
< import Monad (liftM)
---
> import Control.Monad (liftM)
> import Control.Exception (evaluate)
111a114,119
> iconvString :: Iconv -> String -> IO (String, Maybe Error)
> iconvString iconvData str
> = do
> (r, e) <- iconv iconvData (map (toEnum . fromEnum) str)
> return (map (toEnum . fromEnum) r, e)
>
0731デフォルトの名無しさん
2006/09/30(土) 16:36:29173c181,185
< where loop cd [] = unsafePerformIO (reset cd)
---
> where loop cd [] = unsafePerformIO (do
> result <- reset cd
> evaluate reset
> close cd
> return result)
193a206,212
> convertString :: String -> String -> String -> (String, Maybe Error)
> convertString from to str
> = let
> (r, e) = convert from to (map (toEnum . fromEnum) str)
> in
> (map (toEnum . fromEnum) r, e)
>
252a272
>
0732デフォルトの名無しさん
2006/09/30(土) 16:51:07単なるバイト列としてエンコード・デコード関数を用意すればOKって事だな。
って、>>730 がそれか。超サンクス!
しかし、こんなの処理系が標準で備えるべきモノじゃないか?
なんで未だにこんな基本的な機能もないんだ?
>Charは21ビット。
リアルUnicode(を想定)してるのか。そんな贅沢してるんなら、ちゃんと符号化もやれよw
0733デフォルトの名無しさん
2006/09/30(土) 17:40:26まあ結局GHCと合せるためにhSetBinaryModeでTrueを指定するんだけど。XMLとか扱うときはロケール意外のエンコーディングも使いたいし。
あと、話は変わるけど、HaXMLはISO-2022-JPに対応していない(2バイト文字が'<'などを含むため)。一旦Unicodeとかに変換しないと
0734デフォルトの名無しさん
2006/09/30(土) 18:03:270735デフォルトの名無しさん
2006/09/30(土) 18:41:420736デフォルトの名無しさん
2006/10/01(日) 05:17:15take n (x:xs) = x: take (n-1) xs
という定義に対して、ghci(6.4.2)で
> take 10 [1,2]
[1,2]
> take (-1) [1,2]
[1]
となります。
どっちも、take (非0) [] まで進んで、これはどっちにもマッチしなくてエラーになると思うのですが。
[]が(x:xs)にマッチするとしても、10はxとxsがどうなるのか…。
0737デフォルトの名無しさん
2006/10/01(日) 06:41:48myTake 0 _ = []
myTake n (x:xs) = x:myTake (n-1) xs
>myTake 10 [1,2]
Excertion (略) : Non-exhaustive patterns in function myTake
0738736
2006/10/01(日) 07:04:02D:\study\haskell>type aa.hs
mytake 0 _ = []
mytake n (x:xs) = x: take (n-1) xs
D:\study\haskell>ghci aa.hs
___ ___ _
/ _ \ /\ /\/ __(_)
/ /_\// /_/ / / | | GHC Interactive, version 6.4.2, for Haskell 98.
/ /_\\/ __ / /___| | http://www.haskell.org/ghc/
\____/\/ /_/\____/|_| Type :? for help.
Loading package base-1.0 ... linking ... done.
Compiling Main ( aa.hs, interpreted )
Ok, modules loaded: Main.
*Main> mytake 10 [1,2]
[1,2]
*Main> mytake (-1) [1,2]
[1]
*Main>
0739デフォルトの名無しさん
2006/10/01(日) 08:12:24> mytake n (x:xs) = x: take (n-1) xs
mytakeであるべきところがtakeになってるから。
HugsのPrelude.hsを見ると、takeの定義は下のようになってて、
第一引数が負の時は[]が返る。
take :: Int -> [a] -> [a]
take n _ | n <= 0 = []
take _ [] = []
take n (x:xs) = x : take (n-1) xs
0740デフォルトの名無しさん
2006/10/01(日) 10:24:440741デフォルトの名無しさん
2006/10/01(日) 11:23:17やっぱ無理ですた。
createList a b = createList (a:b)
createList a = a:[]
main = print ((createList 1 2 3 4) :: [Int])
なんかいい方法ないですかね?
0742デフォルトの名無しさん
2006/10/01(日) 12:28:21可変長引数のこと?
それならHaskellでは基本的に書けない。
0743デフォルトの名無しさん
2006/10/01(日) 15:15:360744デフォルトの名無しさん
2006/10/01(日) 15:25:43ところでその createList というのは、どういう型をもつのか考えたことあるのかな。
また、createList 1 というのが [1] になるべきか (\b -> 1:b) になるべきか、
というのはどう決定されるべきだと考えてるのかな。
0745741
2006/10/01(日) 15:52:56> createList 1 というのが [1] になるべきか (\b -> 1:b) になるべきか、
もちろん[1]になることを期待しました。
mainの方で[Int]としたのはうまいこと推論してくれるかな?と。
0746デフォルトの名無しさん
2006/10/01(日) 16:49:30ある。例えばGHCのText.Printf.printf。
http://darcs.haskell.org/packages/base/Text/Printf.hs
0747デフォルトの名無しさん
2006/10/01(日) 18:41:09> 可変長引数のこと?
そうです。単なる書き間違いです。
>>746
ヘタれな私にはムズいです。
じっくり取り組んでみます。
ありがとうございました。
0748デフォルトの名無しさん
2006/10/01(日) 18:57:08私達中華人民はあなたたちの掲示板を拝見して笑ってみてますよ。ではありがとうございました。
0749デフォルトの名無しさん
2006/10/01(日) 19:34:54ttp://d.hatena.ne.jp/yts/20050102
の下の方にも例がある。
createListはこれを参考にして作れそう。
0750デフォルトの名無しさん
2006/10/01(日) 19:41:54なるほど!引数の数によって型も変えちゃうようなイメージやね。
これならできそう。がんばってみる。
0751デフォルトの名無しさん
2006/10/01(日) 20:25:10instance VAFun a [Int] [Int] where
withVAList g = g []
createList :: VAFun Int [Int] x => x
createList = withVAList id
を加えてやるとInt型限定のcreateListができた。
createList (1::Int) (2::Int) (3::Int) :: [Int]
=> [1,2,3]
0752デフォルトの名無しさん
2006/10/01(日) 20:42:33にも可変長引数の実装例があって、buildってのがまんまcreateListみたい。
0753デフォルトの名無しさん
2006/10/01(日) 21:52:18> createList :: VAFun Int [Int] x => x
この型の意味がわからん。
ふつけるを読み返しては見たんだが…
xがVAFun か Int か [Int] って意味でいいのか?
> instance VAFun a [Int] [Int] where
こっちはますますわからん。
[Int]をふたつ渡すとVAFunになるような型ってことかな?
0754デフォルトの名無しさん
2006/10/01(日) 21:56:17そのサイトにあるこの表現、
class VAFun a r f | f -> r where
この縦棒(←記号名を忘れた)は「または」の意味でいいんだよな?
ふつけると入門Haskellを読み返したがそういう表現は無かったので、
念のため確認。
0755デフォルトの名無しさん
2006/10/01(日) 22:13:17まだ詳しくは読んでないけど、hugsとghcの拡張機能だと思う。
0756デフォルトの名無しさん
2006/10/01(日) 22:21:58VAFunは3引数の型クラス。(多引数の型クラスはHaskell98にはない)
VAFun a b cという条件は、a, b, cの三つ組がVaFunのインスタンスである、という条件を表す。
だから、
createList :: VAFun Int [Int] x => x
は、Int, [Int], xの三つ組がVaFunのインスタンスであるような全てのxについて、
createListはその型を取り得る、というように読む。
>>754
「| f -> r」の部分は、「ただし、fが決まればrはただ一つ決まる」という意味。
関数従属(functional dependency)といって、これもHaskell98にはない。
Type Classes with Functional Dependencies
http://web.cecs.pdx.edu/~mpj/pubs/fundeps.html
0757デフォルトの名無しさん
2006/10/01(日) 22:57:27ghcを使ってるんだけど、エラーで
Use -fglasgow-exts to allow multi-parameter classes
って出たのでどうやらそのとおり拡張らしい。
>>756
> 「| f -> r」の部分は、「ただし、fが決まればrはただ一つ決まる」という意味。
ただ一つ決まるというのはただ一つの型に決まるということですよね?
URIまで示してもらって悪いんですが、英語に明るくない私にはそこまで読み取れないので。
0758デフォルトの名無しさん
2006/10/01(日) 23:27:43そういうこと。
例えば、
instance VAFun a Int Int where
と
instance VAFun a Char Int where
の二つのインスタンス宣言があったとすると、fがIntのときrが一つに決まらない
(IntでもCharでもあり得る)から、コンパイルエラーになる。
その代わり、関数従属を指定したことで、withVAList sumの型である
(VAFun a a f, Num a) => f
が「意味のある」型になる。もしfからaが決まらないなら、
aを具体的に指定するすべががなく、この型は使いものにならない。
0759デフォルトの名無しさん
2006/10/05(木) 00:12:37Meadowでhaskel-modeでC-c C-lとかC-c C-rとかで帰ってこなくなることないですか?
ghc.exeがずっとCPU占有状態。ghc.exeが二つあることもあるような。
0760デフォルトの名無しさん
2006/10/05(木) 00:14:22無限ループになってるってことない?
0761デフォルトの名無しさん
2006/10/05(木) 01:03:43でも、バッファの内容は、実行(評価?)を含まず、
定義だけなので実行が無限ループはしてないと思います。
(初心者で判ってないので変な事言ってたらすみません)
0762あげ
2006/10/05(木) 20:30:460763デフォルトの名無しさん
2006/10/07(土) 14:11:23普通に前から結合順位が高いもの順?それを必要な分だけ進める感じ?
IOの>>や>>=をどういう風に組み立てればいいのかよく解らないので。
0764デフォルトの名無しさん
2006/10/07(土) 14:19:12結合と評価を混同するな
0765デフォルトの名無しさん
2006/10/07(土) 14:46:210766デフォルトの名無しさん
2006/10/07(土) 15:52:47評価の順序は、外から順。
f (g (h x))という式なら、まずfが呼ばれる。
1 + 3 * 2という式なら、これは(+) 1 ((*) 3 2)のことだから、まず(+)が呼ばれる。
ただし、結果が同じである限り、処理系は別の順序で評価するかもしれない。
>>や>>=を使ったときのIOの実行順序は、左から右。
これは評価順序とは関係なく、>>=の仕様がそうなっているというだけ。
0767デフォルトの名無しさん
2006/10/07(土) 16:45:40評価順は基本的に外からだけど不定、IOの>>や>>=は評価順に関係なく左から右
ということ?
>>や>>=も単なる関数だと思うんだけど、評価と関係なく左からってなんで出来るの?
IOだけ評価とは別の機構で順番が決まるの?
0768デフォルトの名無しさん
2006/10/07(土) 16:57:520769デフォルトの名無しさん
2006/10/07(土) 17:15:29>>=や>>の評価毎に、実行すべきモノがたまって行く、
ってイメージだったんだけど、全然違う?
構文解析後に、評価とは別に、そこに表れてる>>や>>=を左から順序が決まる、ということ?
式には直接表れていないけど、変数に含まれてる>>や>>=の順番は?
それって、変数を評価してみないと判らないと思うんですが。
0770デフォルトの名無しさん
2006/10/07(土) 17:20:43IO a型の値(動作と呼ぶ)は単なるデータで、それ自体が何かをする訳ではない。
例えば、getLine :: IO Stringは「標準入力から一行読むこと」を表すデータに過ぎないので、
getLineを評価しても何も起こらない。(これは、1 + 1を評価しても何も起こらない、というのと同じ)
同様に、putStrLn "Hello"を評価しても、「標準出力にHelloと表示すること」というデータが返ってくるだけで、
実際にHelloが出力される訳ではない。
ではどうやって実際に動作を実行するかというと、mainを実行したい値に束縛すれば良い。
Haskell処理系は、mainの値(mainの型はIO aなので、これは動作)を実際に実行する。
これ以外に動作を実行する方法はない。
(>>)は、二つの動作を組み合わせて一つの動作にする関数。
具体的には、
a >> b
は、
「aを実行し、次にbを実行すること」
を表す動作になる。(>>)はあくまで動作というデータ間の演算であり、
実際に動作を実行する訳ではないことに注意して欲しい。
ここで、aとbを評価する順序は未規定だが、
どうせ評価しても何も起こらないので、大した問題ではない。
0771デフォルトの名無しさん
2006/10/07(土) 18:10:43実行すべきモノのキューというより連結可能なリストが、IOモナド毎にあって、
最終的に>>や>>=による合成で出来たIOモナドのタスクリストが実行される。
評価順の不定があっても、出来るIOモナド(の実行足す栗須と)は同じだから問題ない、
というところでしょうか。
0772デフォルトの名無しさん
2006/10/07(土) 19:27:44そんな感じかな。
f _ a=a
main=f (putStrLn "hello") (putStrLn "world")
とか
main=seq (putStrLn "hello") (putStrLn "world")
とかやってもhelloは出力されないし。
>>770
ただ(>>)と(>>=)の動作はIOモナド限定ね。
0773デフォルトの名無しさん
2006/10/08(日) 06:16:31mySequence [] = return []
mySequence (x:xs) = x >>= (\h -> mySequence xs >>= (\t -> return (h : t)))
と定義して、
mySequence [putChar 'a', putChar 'b', putChar 'c']
は、abcと出力しました。
でも、>>=がふたつあります。
前の>>=はxの文字の1文字出力、後の>>=はxsの文字列出力を作るので、
それぞれの文字は、文字としてと、連結途中の文字列として、の複数回出力される気がするのですが。
0774デフォルトの名無しさん
2006/10/08(日) 08:25:07>前の>>=はxの文字の1文字出力、後の>>=はxsの文字列出力を作るので、
前の>>=について、左辺はxの一文字出力で、
右辺はxsの文字列出力だから、結果は(x:xs)の文字列出力になる。
前の>>=の結果がmySequenceの結果だから、mySequenceの結果も(x:xs)の文字列出力。
0775デフォルトの名無しさん
2006/10/08(日) 08:34:45mySequence [putChar 'a', putChar 'b', putChar 'c'] を定義に従って展開していくと、
最終的にはこんな感じのになる。
putChar 'a' >>= (\ha -> putChar 'b' >>= (\hb -> putChar 'c' >>= (\hc -> return (ha:hb:hc:[]))))
0776デフォルトの名無しさん
2006/10/08(日) 10:51:090777デフォルトの名無しさん
2006/10/08(日) 11:08:45x は「1文字出力の動作」だけど、 h は動作じゃなくて動作結果。でその動作
結果の値を受け取って return しているが、これは「値を返すという動作」な
ので出力動作はされない。
x という動作は1回しか実行されていないから問題なし。
0778デフォルトの名無しさん
2006/10/08(日) 20:54:03putChar 'a' >>= (\ha -> putChar 'b' >>= (\hb -> putChar 'c' >>= (\hc -> return (ha:hb:hc:[])))) で、
return (ha:hb:hc:[]) は、「"abc"を出力する動作」で、これが返り値。でも、その返り値は使われてない。
3つの>>=によって「'a'を出力する処理」「'b'出力する処理」「'c'出力する処理」がこの順で実際に実行される。
と言うことですね。
しかし、その形に展開する過程で、たとえば、
mySequence (putChar 'c':[]) = putChar 'c' >>= (\hc -> (return []) >>= (\tc -> return ('c' : tc)))
↓
mySequence (putChar 'c':[]) = putChar 'c' >>= (\hc -> return ('c':[]))
のような展開がありました。
この展開で>>=によって、[]を出力する事になってしまわないのでしょうか。
ここでは[]ですが、ほかに、"c"と"bc"が出力されるような展開がありました。
これらの出力実行はどうなってしまったのでしょうか。展開と評価は別?
展開ってなんでしょう? 評価と同様に、実際に>>=の定義によってなされるものですよね?
0779デフォルトの名無しさん
2006/10/08(日) 21:02:42mySequence (putChar 'c':[])
= putChar 'c' >>= (\hc -> (return []) >>= (\tc -> return ('c' : tc)))
= putChar 'c' >>= (\hc -> return ('c':[]))
これは手でやったんですが、
モナド則の(return a) >>=f = f aを念頭に置いてこう変換しました。
モナド則って処理系に入ってるものじゃなくて、>>=の定義が満たしているだけのモノですよね?
つまり、この変換は、>>=を評価することでしか処理系ではなしえないと思うのですが。
0780デフォルトの名無しさん
2006/10/08(日) 21:24:09>return (ha:hb:hc:[]) は、「"abc"を出力する動作」で、これが返り値。でも、その返り値は使われてない。
違う。return (ha:hb:hc:[])は、「なにもしない動作」で、(ha:hb:hc:[])が返り値。
一般にreturnは何もしない動作を表すw。
0781デフォルトの名無しさん
2006/10/08(日) 21:46:52展開がおかしい。
まず、mySequenceの定義から
mySequence (putChar 'c':[])
= putChar 'c' >>= (\h -> mySequence [] >>= (\t -> return (h:t)))
= putChar 'c' >>= (\h -> return [] >>= (\t -> return (h:t)))
ここで、モナド則から
return [] >>= (\t -> return (h:t))
= return (h:[])
よって、
mySequence (putChar 'c':[])
= putChar 'c' >>= (\h -> return (h:[]))
ちなみに、putChar 'c' の型は IO () なので、hに代入されるのは'c'ではなく () 。
なので、mySequence [putChar 'a', 略] >>= print とすると、
abc[(),(),()]と表示される。
0782デフォルトの名無しさん
2006/10/08(日) 23:27:31なるほど。IOのreturnを勘違いしていたんですね。
return (ha:hb:hc:[])は、[ha,hb,hc]に「なにもしない動作」がくっついたもの、ですね?
>>781
モナド則は、>>=の定義が従っているだけですよね?
つまりモナド則を使った展開では>>=が評価されてるんですよね?
そのとき、「左辺処理=[]を何もしない」の後に「右辺処理=(h:t)を何もしない」がされる事になる。
でいいんでしょうか。
putChar 'c'の値自体は、カス()に「'c'出力処理」が付いたものであって、
'c'に「出力処理」が付いたものではないんですね。とんでもない勘違いをしていましたね…。
だから、>>=の右辺に渡されるのはカス()だけ、と。
やっとたどり着いた気がします。ありがとうございました。
0783デフォルトの名無しさん
2006/10/09(月) 15:19:44http://sourceforge.net/projects/jvm-bridge/
これ使ってる人いる?もう開発・メンテされてないのかな?完成してて拡張不要って事?
0784デフォルトの名無しさん
2006/10/12(木) 09:26:11http://www.haskell.org/pipermail/haskell/2006-October/018629.html
0785デフォルトの名無しさん
2006/10/12(木) 09:33:47SMPサポート: スレッドの並列実行とControl.Parallelのプリミティブによる並列評価
LANGUAGEプラグマ: 使われている言語拡張を明示して、OPTIONS_GHCの代わりに
びっくりパターン: 正格な関数が書きやすくなった
Text.Reget.Posix: if str =~ "^[a-z_][a-zA-Z0-9'_]*$" then ..
Data.ByteString: 効率の良いバイト列/8ビット文字列
Data.Sequence: updateを含む数多くの操作をそれなりに効率よくこなすリスト代替コンテナ
:mainコマンド: ghciで、引数つきでmainを実行
impredicative polymorphism: [forall a. (Show a) => a -> String]
UTF-8ソースファイル: ∀a. a → a
Data.Foldable: foldの任意のコンテナへの一般化
Data.Traversable: よくわからん
Control.Monad.Instances: Functor ((,) a)
Foreign.ForeignPtr: 終了子に余分な引数を与えられるようになった
Data.Array.Storable.unsafeForeignPtrToStorableArray
0786デフォルトの名無しさん
2006/10/12(木) 09:45:510787デフォルトの名無しさん
2006/10/12(木) 13:08:540788デフォルトの名無しさん
2006/10/12(木) 13:16:03>UTF-8ソースファイル
ソースだけかよ…。orz
0789デフォルトの名無しさん
2006/10/12(木) 13:35:23むしろ新しいIOライブラリ(Streamsとか)の整備待ちのような気もする。
0790デフォルトの名無しさん
2006/10/12(木) 13:37:50ttp://www.haskell.org/ghc/dist/6.6/ghc-6-6.msi
UTF-8で
main = putStrLn "こんにちわ世界"
とか書いたら一応文句言わずに読み込むんだが、実行すると化けまくり。
0791デフォルトの名無しさん
2006/10/12(木) 14:44:020792デフォルトの名無しさん
2006/10/12(木) 17:03:10それじゃもっとひどいじゃねぇか。
中途半端イヤ!
0793デフォルトの名無しさん
2006/10/12(木) 17:21:23hPutChar が各文字を castCharToCChar していて、コードポイントが 0xff を
越える文字はその時点で丸められるという話だな。
ただ、 putStr でこれに対応してしまうと、今度はバイナリデータが扱えなく
なるので、現状の方がまだマシ。
ただ文字列→UTF-8文字列の変換が標準で欲しいのは確か。
0794デフォルトの名無しさん
2006/10/12(木) 17:51:25putStrはHandleがバイナリモードかどうか知ってるんだから、その点は問題ないと思う。
むしろ、ロケールにかかわらずUTF-8で出力されるとしたらそっちが問題だろう。
0795デフォルトの名無しさん
2006/10/12(木) 18:31:26バイナリモードは Windows で改行コードを扱えるようにするだけのモードと
いう認識なんだがそこまでやるかなぁ。
で、文字コードやロケールなどを考慮に入れると、現状の枠組みでは弱すぎる
と思う。無理にあれこれいじるよりはむしろ Streams のような(ssc の方が近
いか)仕組みを採用する方向に持っていった方がいいんじゃないかな。
0796デフォルトの名無しさん
2006/10/12(木) 21:46:36UTF-8で出力出来れば、別のプログラム(文字コード変換とか)をパイプで繋げば良いし。
0797デフォルトの名無しさん
2006/10/12(木) 22:01:320798デフォルトの名無しさん
2006/10/12(木) 23:06:03どの言語のなんてコンパイラとどういう比較をして
どのくらいいまいちだったの?
比較するのに使ったソースと比較結果とかをだしてちょ
0799デフォルトの名無しさん
2006/10/12(木) 23:56:290800デフォルトの名無しさん
2006/10/13(金) 00:35:41Haskellはモナドと浮動小数演算が遅い
これは常識
0801デフォルトの名無しさん
2006/10/13(金) 00:38:220802デフォルトの名無しさん
2006/10/13(金) 00:57:380803デフォルトの名無しさん
2006/10/13(金) 11:20:200804デフォルトの名無しさん
2006/10/13(金) 11:22:39浮動小数演算の速度を確かめてみた。
main = print $ itermult 10000000 1.9
itermult :: Int -> Double -> Double
itermult 0 x = x
itermult n x = itermult (n-1) (x * 1.000001)
こんなコードを実行すると、Cで書いた場合を1として、
7 (ghc-6.4.2)
3 (ghc-6.4.2 -fexcess-precision)
6 (ghc-6.6rc2)
6 (ghc-6.6rc2 -fexcess-precision)
の時間が掛かった。同様のコードを整数について書いた場合、Cに比べて25%ほど遅かった。
ちなみに、GHCの正確性解析はitermultが両方の引数について正格であると
正しく判断しているので、無駄な遅延が原因ではない。
モナドが遅いってのは意味が分からん。どのモナド?
0805デフォルトの名無しさん
2006/10/13(金) 13:06:510806デフォルトの名無しさん
2006/10/13(金) 15:24:280807デフォルトの名無しさん
2006/10/13(金) 15:31:35最適化切れ。
0808デフォルトの名無しさん
2006/10/13(金) 15:32:340809デフォルトの名無しさん
2006/10/13(金) 16:44:280810デフォルトの名無しさん
2006/10/13(金) 17:00:000811デフォルトの名無しさん
2006/10/13(金) 17:58:200812デフォルトの名無しさん
2006/10/13(金) 18:46:57windows上でbuildするのは不可能に近い。
そろそろ整理し直した方がいいんじゃないか?
0813デフォルトの名無しさん
2006/10/13(金) 19:02:46なものなのかな? そこのところがよくわからないな。どう整理したらいいと
思う?
あと、 building manual には、 Windows に関するわりと詳細な記述があるよ
うに思うけど、それでも不可能に近いものなの?
0814デフォルトの名無しさん
2006/10/13(金) 22:35:11そうなの?ふつうにコマンド一発で出来たと思うが。
そんなことよりクロスコンパイラを作れないことが問題だ。
0815デフォルトの名無しさん
2006/10/14(土) 07:54:27俺も挫折した。
0816デフォルトの名無しさん
2006/10/14(土) 08:39:27libHSbase.aを作るところで一度に渡すファイル数が多すぎるか何かでこけた。
一旦渡すべきファイルのリストをファイルに書き出して
ar q libHSbase.a @ファイルリスト としてやれば作れたんだけど、
その後もlibHSbase_p.a作るところで同じ理由でこけて、
なんかやる気がなくなった。
0817デフォルトの名無しさん
2006/10/15(日) 00:47:42もともとソースについてしか挙がってねぇじゃん。
http://hackage.haskell.org/trac/ghc/ticket/397
http://hackage.haskell.org/trac/ghc/search?q=encoding+Char&ticket=on
おまえら頭良いんだから、英語でバグレポート挙げろよ!
ちゃんとIO系で対応してくれって。
0818デフォルトの名無しさん
2006/10/15(日) 18:27:180819デフォルトの名無しさん
2006/10/15(日) 21:38:13詳しくみてないがエラストテネスのふるいが3割速くなった
0820デフォルトの名無しさん
2006/10/15(日) 21:57:12凄いな。
ついでにエラトステネスのふるいも計測してみて
0821デフォルトの名無しさん
2006/10/16(月) 08:07:28f (x:xs) = x : f [y | y <- xs, y `mod` x /= 0]
これで -O3 つけてコンパイルで
6.4.2
./a.out 7.000s user 0.020s kernel 99% cpu 7.045s real
6.6
./a.out 10.369s user 0.012s kernel 99% cpu 10.397s real
0822デフォルトの名無しさん
2006/10/16(月) 08:30:360823デフォルトの名無しさん
2006/10/16(月) 12:37:300824デフォルトの名無しさん
2006/10/16(月) 13:13:510825デフォルトの名無しさん
2006/10/16(月) 18:47:270826デフォルトの名無しさん
2006/10/16(月) 23:38:22f :: (Num a) => (a -> a) -> a
f k = g 10
where
g :: (Num a) => a -> a
g = k
main = print $ f id
GHCでコンパイルすると、下のようなエラーになってしまいます
(gの型を明示的に書かなければコンパイルできます)。
「gの型のaは、fのaと同じ」ということが記述できれば解決するような
気がするのですが、なにかうまい方法はありますでしょうか?
where節の関数の型は書かないのが普通なのでしょうか?
test.hs:6:2:
Inferred type is less polymorphic than expected
Quantified type variable `a' is mentioned in the environment:
k :: a -> a (bound at test.hs:3:2)
When trying to generalise the type inferred for `g'
Signature type: forall a. (Num a) => a -> a
Type to generalise: a -> a
In the type signature for `g'
When generalising the type(s) for `g'
0827デフォルトの名無しさん
2006/10/16(月) 23:52:14そのままコピペするとインデントが無くなるので書き込むときには注意。
↑これってテンプレに入れといた方がよくね?
まぁその程度で意味不明になるほどのコードは今のところそうそう出てきてないけど。
0829デフォルトの名無しさん
2006/10/16(月) 23:55:28アホなミスだば。
g = k
0831デフォルトの名無しさん
2006/10/17(火) 00:18:000832デフォルトの名無しさん
2006/10/17(火) 03:13:07だから、
f :: (Int -> Int) -> Int
f k = g 10
where
g :: Int -> Int
g = k
とか、
f :: (Char -> Char) -> Char
f k = g 'a'
where
g :: Char -> Char
g = k
だと、うまくいくでしょ。
0833デフォルトの名無しさん
2006/10/17(火) 03:14:58ってまあ、俺の方が初心者だと思うので、嘘言ってたらゴメン。
0834デフォルトの名無しさん
2006/10/17(火) 08:38:48Haskell98では、クラス宣言の場合をのぞいて型変数のスコープは一つの型式の中だけ。
これは既知の欠陥で、回避するためのGHC拡張が用意されている。
具体的には、明示的なforallキーワードを使って束縛された型変数は、
定義全体にスコープが及ぶので、それを使う。
f :: forall a. (Num a) => (a -> a) -> a
f k = g 10
where
g :: a -> a
g = k
main = print $ f id
コンパイル時に-fglasgow-extsオプションが必要。
詳しくは、
http://www.haskell.org/ghc/docs/latest/html/users_guide/type-extensions.html#scoped-type-variables
0835デフォルトの名無しさん
2006/10/17(火) 23:17:04いけました!ありがとうございます。
0836デフォルトの名無しさん
2006/10/17(火) 23:44:270837デフォルトの名無しさん
2006/10/18(水) 23:49:48やっつけだけど、良かったらどうぞ。
http://yogimo.sakura.ne.jp/ssc/ssc-0.0.9.tar.gz
使い方 (ghc-6.4.2以上が必要)
アーカイブを展開して、そこに移動し、
runhaskell Setup.lhs configure
runhaskell Setup.lhs build
runhaskell Setup.lhs install
でインストールできる。アンインストールは、
runhaskell Setup.lhs unregister
してから、インストール先のディレクトリ(インストール時に表示される)を手で削除。
使いたいときは、モジュールの先頭に
import System.IO.SSC.Haskell98
import Prelude hiding(putChar, putStr, putStrLn, print, getChar,
getLine, getContents, interact, readFile, writeFile, appendFile, readLn)
と書いておけば、標準のライブラリよりも優先して使われる。
インタフェースはSystem.IOと同じなので、特にいろいろ考えることなく使える。
main = putStrLn "諸行無常のHELLO WORLD"
とか。ただし、このライブラリのHandleは標準のHandleと互換性がないので注意。
0838デフォルトの名無しさん
2006/10/19(木) 11:27:41WinXP, GHC 6.6で試してみました。
GHCiで837のコードを動かしてみたら見事に化けました。
GHCiはコードページを28591に変えちゃうんで
cmd.exeでラスタフォントを使ってる場合は化けて当然なわけですが、
一旦フォントをTrueTypeFontに変更してGHCiを起動、:! chcp 65001で
UTF-8のコードページに変えると、
sHELLO WORLD
O WORLD
という表示になりました。
まぁ、CP932(Shift JIS)に変更してやればきちんと表示されましたけど。
ちなみに、ファイルにリダイレクトさせると、コードページが何であってもShift JISで出力されてました。
0839デフォルトの名無しさん
2006/10/19(木) 19:37:15テストありがとうございます。
その挙動は、プログラムがコンソールのコードページ(chcpで設定できる)ではなく
システムのコードページ(「地域と言語のオプション」で設定できる)を参照することによるものです。
これは不便なので、コンソール入出力についてはコンソールのコードページを使うように修正しました。
最新版はここに置いておきます。
http://yogimo.sakura.ne.jp/ssc/index_ja.html
0840デフォルトの名無しさん
2006/10/19(木) 22:26:50tick :: State Int Int
tick = do
n <- get
put (n+1)
return n
plusOne :: Int -> Int
plusOne n = execState tick n
上記のtickのコードで使われているgetについてですが、getって
get = State $ \s -> (s,s)
って定義されてますよね。
じゃあ n <- getのnには
\s -> (s,s)っていう関数が束縛されてるんじゃないでしょうか?
でも次のputでは数値として使われてるから、nは数値なんだろうけど、
どうしてそうなるのかわからないです。
0841デフォルトの名無しさん
2006/10/19(木) 22:39:43do式で使われる<-は左辺を右辺に束縛する訳じゃない。
do
n <- get
put (n + 1)
は、
get >>= (\n -> put (n + 1))
の略記。
0842デフォルトの名無しさん
2006/10/19(木) 22:45:10get に限らず State はそもそも関数みたいなものだと思ってくれ。
「State s a」というのは、大雑把に言えば s -> (a, s) という型の関数。
そして、State モナドの束縛も一種の関数合成と考える。ただし、ふつうの
(.) とかと違うのは返り値の型が (a, s) のように分かれているという点。な
ので平常時は a 型の方だけが渡されていって、 s の方は無視する(変更しな
い)ように合成している。
以上をふまえて、その tick という値は、
(\s -> let (n, s') = get s in (\s -> let (_, s'') = put (n+1) in (n, s'')) s')
みたいな関数だと考えられる。
すると get と put の定義から、
(\s -> let (n, s') = (s, s) in (\s -> let (_, s'') = ((), n+1) in (n, s'')) s')
となり、うまく行っているのがわかると思う。
0843840
2006/10/19(木) 23:25:39>get に限らず State はそもそも関数みたいなものだと思ってくれ。
>「State s a」というのは、大雑把に言えば s -> (a, s) という型の関数。
これはnewtype宣言のことを言ってるって思っていいんでしょうか。
>そして、State モナドの束縛も一種の関数合成と考える。ただし、ふつうの
>(.) とかと違うのは返り値の型が (a, s) のように分かれているという点。な
>ので平常時は a 型の方だけが渡されていって、 s の方は無視する(変更しな
>い)ように合成している。
例えば、getContentsはIO::Stringじゃないですか。で、
do
cs <- getContents
print cs
見たいにつかうじゃないですか。というわけで、
左辺 <- 右辺
は右辺のモナドの印(上の例でいればIO)が外れてただの値になり、
左辺に入る、という理解をしていました。その考え方でいくと
Stateの印が外れた関数(runState)が左辺に入る。で良いとおもっていたのですが・・・
なんでa型の値だけが左辺に渡されるのでしょう??
それと「平常時」ってのが気になるんですが、平常じゃない場合もある・・・?
0844デフォルトの名無しさん
2006/10/19(木) 23:49:36どうも
Java歴数ヶ月のデザインパターンも把握してないunkoです
Haskellが世界最強プログラミングコンテスト(?)みたいので
いつも1位だって聞いてここきました
で、偉大なハッカーはPerlとかLispなんかを愛用してるみたいですが
その点Haskellはどうですか?
2chの住民的な意見を期待してる
0845デフォルトの名無しさん
2006/10/19(木) 23:55:47型の話とデータの話を混同してないか。
型について言えば、<-の左辺の型は、右辺の型からモナドを外したものになる、と言うのは正しい。
getContentsならIO Stringに対してIOを外したStringだし、
getならState s sに対してState sを外したsだ。
データについて言うと、右辺から左辺を取り出している訳ではまったくない。
getContentsは標準入力を読むという動作、getは単なる関数をラップしたものであって、
そこにStringやs型の値を内包している訳ではない。
0846デフォルトの名無しさん
2006/10/20(金) 00:43:12Haskellが活躍してたのは去年まで。
今年は見る影も無い。
問題の特質を見抜いて、適切な道具を選ぶのが偉大なハッカー。
特定のツールに固執するのは間違い。
0847デフォルトの名無しさん
2006/10/20(金) 01:03:50あれ?
今年はGoogleの社員チームが1位になったんだよね?
その中にHaskell使ってる人いなかった?
0848デフォルトの名無しさん
2006/10/20(金) 02:21:55今回のコンテスト・・・というか、ゲームの内容見た?
今回の内容じゃあ言語の優劣は出ないよ。
Haskell使ってる人が居ても、ただそれに慣れてるってだけさ。
0849デフォルトの名無しさん
2006/10/20(金) 03:21:58「平常時」から外れるのは実際に状態を操作する系の処理、ようするに get、
put、modifyなどのことを想定して書いた。
あとは 845 の言うとおりかなぁ。
型について言うと、 instance Monad IO だから、 IO String から IO がはず
れて String になる。
同じように、 State では instance Monad (State s) だから、 State Int Int
に対しては State Int がはずれて Int が出てくるわけだ。
0850838
2006/10/20(金) 03:34:58Win2K, GHC6.6でssc-0.0.10を試してみました。
cp65001で837のコードを動かしたら、
諸行無常のHELLO WORLD
LO WORLD
という表示になりました。
なんでLO WORLDがくっつくんだろう。
あと、リダイレクトさせた場合はやっぱりShift JISになるみたいです。
0851デフォルトの名無しさん
2006/10/20(金) 10:57:26>という表示になりました。
これはWin32 APIのWriteFileが実際に出力したバイト数よりも小さい値を戻すのが原因です。
OSの問題なわけですが、どうしても必要なら対策を考えます。
>あと、リダイレクトさせた場合はやっぱりShift JISになるみたいです。
これは意図した動作です。標準入出力がリダイレクトされた場合、コンソール入出力ではないので、
システムのコードページにしたがってコード変換します。
0852デフォルトの名無しさん
2006/10/20(金) 11:10:02>これはWin32 APIのWriteFileが実際に出力したバイト数よりも小さい値を戻すのが原因です。
こんなすごいバグがあるんだ。10年以上 Windows でプログラム書いてるけど
経験したことも聞いたこともありませんでした。
UTF-8で"諸行無常のHELLO WORLD"をコンソールに WriteFile すれば再現可能ですか?
0853デフォルトの名無しさん
2006/10/20(金) 11:25:21私の環境(WinXP SP2 日本語版)では再現できます。chcp 65001した状態で、
下記のコードを実行すると、4/8 writtenと表示されますが、実際には8バイト全て出力されています。
# include <windows.h>
# include <stdio.h>
int main(void)
{
const char *msg = "\xe8\xab\xb8\xe8\xa1\x8c\r\n";
DWORD written;
WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), msg, strlen(msg), &written, NULL);
fprintf(stderr, "%d/%d written\n", (int)written, (int)strlen(msg));
}
すれ違い御容赦。
0854デフォルトの名無しさん
2006/10/20(金) 11:26:05main = putStrLn "\230\151\165\230\156\172\232\170\158"
をTrueTypeFontで表示しているcmd.exe上でコードページ65001のもとで
実行するとpermission deniedになるんですが、
それもこれに関連したバグなんでしょうか?
0855デフォルトの名無しさん
2006/10/20(金) 11:48:17実行してみると、妙な記号と 8/8 writtenと表示されました。
コンソールのプロパティを調べると、フォントが「ラスタ フォント」になっている。
他にもう1つだけ選択可能な Lucida Console フォントに変更してみると、4/8 writtenとなって
再現しマスタ。
というか漏れのPCだと、そもそもCP65001 で日本語フォント使えないっぽいw
0856デフォルトの名無しさん
2006/10/20(金) 12:06:30chcp 65001する前にフォントをMSゴシックに変えればOK
0857デフォルトの名無しさん
2006/10/21(土) 02:01:44興味もったからこれからインストールしてハローワールドくらいやってみようと思う
ちなみにJava歴5ヶ月のプログラマ初心者です
なにか注意点ある?
心構えとか
0858デフォルトの名無しさん
2006/10/21(土) 02:02:160859デフォルトの名無しさん
2006/10/21(土) 02:06:230860デフォルトの名無しさん
2006/10/21(土) 03:46:510861デフォルトの名無しさん
2006/10/21(土) 11:19:02returnがreturnじゃないこと
0862デフォルトの名無しさん
2006/10/21(土) 15:24:460863デフォルトの名無しさん
2006/10/21(土) 18:55:060864デフォルトの名無しさん
2006/10/21(土) 18:58:09どのあたりが難しかった?
0865デフォルトの名無しさん
2006/10/21(土) 19:11:231位と3位がgoogleチームで1位のチームはC++とHaskell、2Dが使用言語だね
>>848
VM作成なんてHaskellとかのお家芸みたいなものじゃないかと
0866デフォルトの名無しさん
2006/10/21(土) 19:16:35"かんたんな"説明してくれ
0867デフォルトの名無しさん
2006/10/21(土) 19:21:470868デフォルトの名無しさん
2006/10/21(土) 19:22:03>VM作成なんてHaskellとかのお家芸みたいなものじゃないかと
冗談じゃない。よほどチューニングに慣れたHaskell使いじゃないと
まともな速度で動くVMを短時間では作れないだろう。
Haskell有利な点があったとすれば、パズルを解くような補助プログラムを
書きやすいということだと思う。
0869デフォルトの名無しさん
2006/10/21(土) 19:27:38具体例も挙げれないんじゃおまえもアホに含まれる
0870デフォルトの名無しさん
2006/10/21(土) 19:35:56ttp://itpro.nikkeibp.co.jp/article/NEWS/20060927/249198/
0871デフォルトの名無しさん
2006/10/21(土) 19:57:42Perl6 の Haskell での実装である Pugs は恐ろしく短期間で出来上がったらしいし
0872デフォルトの名無しさん
2006/10/21(土) 20:03:560873デフォルトの名無しさん
2006/10/21(土) 20:13:23によると、VMの仕様が簡単で、一方その上で動くソフトが重いので、低水準言語向きだったとか。
0874デフォルトの名無しさん
2006/10/21(土) 20:13:250875デフォルトの名無しさん
2006/10/21(土) 20:47:54ツールチップでリファレンス表示とか、
書いてるそばからエラー指摘&補正案提示とか、
そういう開発環境出て来ないんかなぁ。
0876デフォルトの名無しさん
2006/10/21(土) 21:22:12関係ありまくりだって。
たとえば black の 1000 点を受理させるとか、
adventure でオートパイロット走らせるとかするには
それなりにスピードがでないと困る。
0877デフォルトの名無しさん
2006/10/21(土) 21:40:450878デフォルトの名無しさん
2006/10/22(日) 00:27:152Dってどういう言語?
0879デフォルトの名無しさん
2006/10/22(日) 00:37:32ゲーム内で出てくる変態言語の一つ。
いくつかの基本素子を二次元平面上に配置・配線することで
プログラムを(ASCII Artで)表現することができる。
自分の中で自分に結線することができたりするなど、
細かい部分で関数型言語の香りが感じられる言語。
ゲーム内にはこの言語のインタプリタが入っており、
ペアノ算術やリストの反転、レイトレをイメージした漸化式を解く
プログラムなどを作成することになる。
0880( ´_ゝ`)フーン
2006/10/22(日) 02:53:540881デフォルトの名無しさん
2006/10/22(日) 03:59:00参加者の方ですか?
0882デフォルトの名無しさん
2006/10/22(日) 14:30:47漢字や仮名を識別子に使えないのはどうなんだろう。
0883デフォルトの名無しさん
2006/10/22(日) 15:22:410884デフォルトの名無しさん
2006/10/22(日) 15:36:44ギリシャ文字やキリル文字や、さらには全角空白まで認められてる言語仕様なのに、
漢字や仮名が使えないのは片手落ちっぽいな、と思っただけ。
0885デフォルトの名無しさん
2006/10/22(日) 17:38:090886デフォルトの名無しさん
2006/10/22(日) 20:09:06おしえろおまえら
0887デフォルトの名無しさん
2006/10/22(日) 20:11:110888デフォルトの名無しさん
2006/10/22(日) 20:21:44Hugs
0889デフォルトの名無しさん
2006/10/22(日) 20:24:160890デフォルトの名無しさん
2006/10/22(日) 21:12:06WinHugs-Sep2006.exe(14MB)だけインストールすれば使えんの?
だとすれば hugs98とSep2006.tar.gz(5.3MB) ってなに?
あと、MinGWとかいらないの?
(↑これがなんなのかよく知らないが)
0891デフォルトの名無しさん
2006/10/22(日) 21:13:54読め
0892デフォルトの名無しさん
2006/10/22(日) 21:16:23うん。
>だとすれば hugs98とSep2006.tar.gz(5.3MB) ってなに?
ソースコード
>あと、MinGWとかいらないの?
いらない。
0893デフォルトの名無しさん
2006/10/22(日) 21:20:09WinHugsをいじって作れるかどうか、ちょっとソース調べてみるか。
0894デフォルトの名無しさん
2006/10/22(日) 21:55:34qsort _ [] = []
qsort f (x:xs) = before ++ (x : after)
where before = qsort f $ filter (not . (f x)) xs
after = qsort f $ filter (f x) xs
これを実行しようとしたら
ERROR file:.\Qsort.hs:5 - Syntax error in input (unexpected `=')
なにが悪いんですか
0895デフォルトの名無しさん
2006/10/22(日) 21:56:49インデントがおかしい。
afterのカラム位置をbeforeと揃えるべし。
0896デフォルトの名無しさん
2006/10/22(日) 22:07:33Undefined variable "s"
とかでて、適当にスペースを直したら
Undefined variable "a"
になった
その変数は定義されてませんとかいうけど
そんな変数作ってません><
0897デフォルトの名無しさん
2006/10/22(日) 22:21:32module Qsort where
qsort _ [] = []
qsort f (x:xs) = before ++ (x : after)
where before = qsort f $ filter (not . (f x)) xs
after = qsort f $ filter (f x) xs
これをコピペしてもだめ?
0898デフォルトの名無しさん
2006/10/22(日) 22:25:29Qsort> qsort (<) [8,3,5,2,7,1,9]
っていうように引数?を指定してないだけだった
勝手が違うから全然わかりましぇん
0899デフォルトの名無しさん
2006/10/22(日) 23:20:33いまのところの感想だと、数学の公式勉強するための言語って感じ
ところで今までは.hsファイルを直接開いて(WinHugsに関連づけて)やってたんだけど
直接WinHugsを起動したときに
hugs>
から始まるけど、どうやってファイルを指定すればいいの?
0900デフォルトの名無しさん
2006/10/23(月) 01:14:44qsortBy _ []=[]
qsortBy f (x:xs)=impl id++x:impl not where
impl g=qsortBy f $ filter (g.f x) xs
qsort::Ord a=>[a]->[a]
qsort=qsortBy (>)
beforeとafterをまとめてみた。
0901デフォルトの名無しさん
2006/10/23(月) 07:39:46:load
0902デフォルトの名無しさん
2006/10/23(月) 21:00:21そこまでアホじゃない・・・
パス名の指定はどうすんの?
まさか全ドライブから自動検索なんてしないよね?
0903デフォルトの名無しさん
2006/10/23(月) 21:35:30:?
(ttp://cvs.haskell.org/Hugs/pages/hugsman/commands.html)
0904デフォルトの名無しさん
2006/10/23(月) 23:14:16日本語を使えよ
0905デフォルトの名無しさん
2006/10/23(月) 23:34:29偏差値しかなさそうだな
0906デフォルトの名無しさん
2006/10/23(月) 23:35:57絶対パスでも、カレントディレクトリからの相対パスでも良い。
0907初心者A
2006/10/24(火) 21:47:47ねーねー
大学もでてない以前に高校で物理すら習ってない俺には
クイックソートすら何かいてるんだが意味不明なんだが
だれか記号の意味おしえて
0908デフォルトの名無しさん
2006/10/24(火) 21:53:53Haskellや類似の言語を一つも知らないなら意味が分からないのは当然。
入門書でも読んでみたらどうよ。
0909デフォルトの名無しさん
2006/10/24(火) 22:01:16どうせレス伸びないんだし
http://pc8.2ch.net/test/read.cgi/tech/1128011645/
なんならこっちでもいいし
0910デフォルトの名無しさん
2006/10/25(水) 02:12:040911デフォルトの名無しさん
2006/10/27(金) 18:38:07Concurrent Clean の方が高速で実用性がありそうだな
言語仕様ほぼ変わらないし
0912デフォルトの名無しさん
2006/10/27(金) 20:52:470913デフォルトの名無しさん
2006/10/27(金) 22:50:300914デフォルトの名無しさん
2006/10/27(金) 23:03:000915デフォルトの名無しさん
2006/10/27(金) 23:04:33C#とJavaはほとんどいっしょ
0916デフォルトの名無しさん
2006/10/27(金) 23:50:43副作用に対するアプローチが違うだけじゃん
0917デフォルトの名無しさん
2006/10/28(土) 00:10:44すごくデカいちがいじゃん
0918デフォルトの名無しさん
2006/10/28(土) 00:23:230919デフォルトの名無しさん
2006/10/28(土) 01:41:100920デフォルトの名無しさん
2006/10/28(土) 01:49:02条件満たしてる?
0921デフォルトの名無しさん
2006/10/28(土) 11:30:09入出力だったら
http://www.geocities.jp/lethevert/softwares/clean/gettingStarted20.html
とか見て自分で判断しろ。
0922デフォルトの名無しさん
2006/10/28(土) 11:37:42さきにこっち読む方がいいかも。一意性型とかの説明。
http://www.geocities.jp/lethevert/softwares/clean/gettingStarted19.html
意味論の違いのほかにも、表記の違いはけっこうある。 Clean は関数の型を
a -> b -> c じゃなくて a b -> c って書くみたいだし。型クラスの制約の書
き方も違うし、型クラスの粒度はとても細かいし。
0923デフォルトの名無しさん
2006/10/28(土) 16:40:090924デフォルトの名無しさん
2006/10/28(土) 17:25:10初代とSEEDを同じガンダム扱いされたら、お前だって嫌だろ?
0925デフォルトの名無しさん
2006/10/28(土) 17:48:02遅延評価や参照透明性などの基本的な考え、型の概念などもほぼそのまま使える
コンセプトとしてかなり同根のものだろ
記述も基本的なところ以外はほとんど差もなし
Haskell 使えるヤツなら脳コストも少なく楽に移行できるだろう
Monad も言語で保証されて居るものではないのでその概念を持っていくことは普通に出来る
で、IDE で環境を配布して C++ 並みに高速と来れば使わない手はない
まぁまだ環境が整っていないってのはあるがw
あれだ、人が増えればそれなりに環境も整うからおまいらもっと使ってやってくださいお願いします
0926デフォルトの名無しさん
2006/10/28(土) 21:06:32lethevert乙
0927デフォルトの名無しさん
2006/10/29(日) 19:11:470928デフォルトの名無しさん
2006/10/29(日) 19:35:37Prelude> :set +s
Prelude> foldr seq () $ map (\_ -> product [1..10000]) [1..10]
()
(7.23 secs, 878865620 bytes)
GHCiだとこんな感じか。
0929デフォルトの名無しさん
2006/10/29(日) 19:47:04ghcでコンパイルした場合と似たような速度になるんですかね。ひとまずやってみます。
0930デフォルトの名無しさん
2006/10/29(日) 23:07:21残念。
Failed to load interface for `Prelude' とか言われてしまう。
0931デフォルトの名無しさん
2006/10/29(日) 23:31:19http://fedoraproject.org/extras/6/i386/repodata/repoview/ghc642-prof-0-6.4.2-4.fc6.html
ってのがあるみたいだが。
0932デフォルトの名無しさん
2006/10/29(日) 23:37:46できそうです。
ありがとうございました。
0933デフォルトの名無しさん
2006/11/01(水) 00:30:320934デフォルトの名無しさん
2006/11/01(水) 00:35:590935デフォルトの名無しさん
2006/11/01(水) 00:36:400936デフォルトの名無しさん
2006/11/01(水) 10:07:070937デフォルトの名無しさん
2006/11/02(木) 08:17:33俺の研究室ではわりと普通の光景だが?
0938デフォルトの名無しさん
2006/11/02(木) 08:24:560939デフォルトの名無しさん
2006/11/02(木) 09:31:37どっか簡単に導入ってサイト作っている人いないのかね。
これだけ圏論だHaskellだって騒いでいたのに正直なんの関連性があるのかよくわからん。
0940デフォルトの名無しさん
2006/11/02(木) 09:38:43っていうかすでにConceptual Mathematicsじゃないのね・・・。
0941デフォルトの名無しさん
2006/11/02(木) 10:38:09圏論関係ありません
0942デフォルトの名無しさん
2006/11/02(木) 12:04:41言語の各機能について圏論的に説明したって面白いことはあまり無いと思う。
この分野で圏論が強いのは、関数型言語が圏論的に綺麗な構造を
しているのでプログラムの性質がしらべやすくなっている、ってだけ。
たとえばリストでは map は f: A → B を函手で写したもの、
fold, unfold は代数の始対象, 終対象から一意に定まる射、
などと特徴付けられ、いろんな性質が直ちにわかったりする。
0943デフォルトの名無しさん
2006/11/02(木) 16:19:47というよりも、圏論的なのは処理系実装上の問題であって、圏論云々は一般プログラマが気にすべき話じゃないよね。
0944デフォルトの名無しさん
2006/11/02(木) 17:31:30俺の考えでは、そもそも素晴らしい関数型言語の世界があって
現実の言語処理系はそれをどれだけ綺麗に書けるか、という感じ。
だから、書きやすさを度外視すれば C++ で圏論に基づくプログラム
を書くこともできて、実際 Google の MapReduce はそうなっている。
Google の中の人が一般プログラマかはあやしいと思うけど、
気にすべき話じゃないってのは何か違うなあと思う。
0945デフォルトの名無しさん
2006/11/02(木) 17:38:32関数の途中で結果を出力させたいのですが、
↓このようなことはできますか?
「print p」の型はIO ()ですが、それを
さっと気軽に埋め込めるといいんですが・・
fun1 :: Int -> Int
fun1 n =
let p = n * 3 in
print p
p + 1
0946デフォルトの名無しさん
2006/11/02(木) 17:42:560947デフォルトの名無しさん
2006/11/02(木) 20:24:41>>fold, unfold は代数の始対象, 終対象から一意に定まる射、
詳しく。代数の始対象、終対象ってなに?
アイディアだけでもっていうかアイディアだけくれ。
というか圏論と代数のつながりがイマイチわからん、普遍射とかはわかるんだけれど。
準同型射で類別したもの=代数
くらいの認識です。
0948デフォルトの名無しさん
2006/11/02(木) 20:25:510949デフォルトの名無しさん
2006/11/02(木) 21:39:28Haskellにはどうしても_|_がつきまとうのですっきりいかない。
coproductの扱いとか。
0950942
2006/11/02(木) 21:47:43>>947
代数: http://en.wikipedia.org/wiki/F-algebra
始対象: http://en.wikipedia.org/wiki/Initial_object
あたりを前提として説明する。分からなければ再度聞いてくれ。
以後、扱う圏 C はすべての型からなる圏とする。
関数型言語でよく出てくる型は再帰型というもので、たとえば
data List = Nil | Cons A List
みたいに再帰的に定義される。こう定義された List というのは
数学的には 函手 T = 1 + A×I の不動点で定めたことになる。
ここで 1 は 一点だけからなる型への定函手、A は型 A への定函手、
I は恒等函手、+ は直和、×は直積。
関数型言語で考えている圏では、こういう函手の不動点の存在を示すことが
でき、しかもその不動点が代数の始対象になることが証明できる。
たとえば T = 1 + A×I でやってみると、不動点は
1 + A×1 + A×A×1 + ... なる型で、すなわち加算無限個の
A の要素からなる型、つまり A のリストになる。これを L と書く。
h: T L → L は何かというと L が T の不動点だから h: T L = L なる同型
があって、具体的には h Nil = Nil, h (a,as) = (a:as) がそうなる。
0951942
2006/11/02(木) 21:49:35>>947
(L,h) は始対象なのだから任意の (X,f) に対して一意に
g: (L,h) → (X,f) が存在して、g . h = f . L g が成立する。
この両辺に (a,as) を食わせてみる。L g = id + id×g に注意すると
左辺 = g (h (a,as)) = g (a:as)
右辺 = f (L g (a,as)) = f (a, g as)
つまり g (a:as) = f (a, g as)。カリー化されているけど、これはまさに
g = fold f をあらわしていて、fold が自然に導入される射だということがわかる。
また、ここまでの議論の双対をとると unfold が同様にあらわれる。
もとの函手として T = 1 + A×I×I でやると全く同じように
二分木の上での fold やら unfold が出てくるし、もっと複雑な
データ構造の上でも同様に議論できたりする。
0952947
2006/11/02(木) 21:59:27ちょっと理解するまでに時間かかるけどとりあえずカキコ
明日あたり質問するかも。
にしても函手のそういう使い方は知らんかった。
単なる「カテゴリ間のモルフィズム」程度の認識しかなかったけどそういう風に論理展開できるのね。
っていうか圏論の基礎にそんなこと載ってたっけ?
まぁ、圏、函手、普遍射、随伴、自然変換、モナドの部分くらいしか読んでいないんだけどね・・・。
0953デフォルトの名無しさん
2006/11/02(木) 22:02:130954デフォルトの名無しさん
2006/11/02(木) 22:04:220955デフォルトの名無しさん
2006/11/02(木) 22:05:42諦めろ。数学者のアタマに停止しない計算は存在しない。
0956947
2006/11/02(木) 22:10:10>I は恒等函手、+ は直和、×は直積。
直積Xって積圏作る函手でしょ。
直和+ってアーベリアンな積圏作る函手ってこと?
0957947
2006/11/02(木) 22:23:20そんなの知らないよ。orz
F-algebraは既知じゃないです。orz
0958942
2006/11/02(木) 22:30:53分離和 (separated sum) といったほうが良かったかも。
C の対象 A, B について A+B であらわされる対象は A の要素と
B の要素の集まり。共通する要素はラベル付けして区別しておく。
f :: A -> A', g :: B -> B' について f+g :: A+B -> A'+B' は
x ∈ A+B が A に属する要素なら f, B に属する要素なら g を
適用するようなもの。
>>957
何らかの自然っぽい構造を持ったものはだいたい代数と言ってしまうので
ミスリーディングではあるんだけどね。
0959947
2006/11/02(木) 22:43:48>>分離和 (separated sum) といったほうが良かったかも。
初耳です。orz
そして圏論の基礎にも載っていない。
958さんは何の本を読んでいるのですか?
自分は圏論の基礎以外持ってないっす。
0960デフォルトの名無しさん
2006/11/02(木) 22:47:08自分は和書でも読むのが遅いのに英文だと輪をかけて遅くなるし…
少しは慣れないと。
0961947
2006/11/02(木) 22:48:58○942さんは何の本を読んでいるのですか?
0962デフォルトの名無しさん
2006/11/04(土) 02:54:34すまんす。
data HogeFuga = Hoge String | Fuga String
hogeList = [Fuga "", Hoge "aaa",Fuga "bbb"]
ってデータ定義とリストがあって
Hogeをリストから検索したいとき
findHoge = find isHoge hogeList
where
isHoge flg = case flg of {(Hoge _) -> True; _ -> False}
ってなかんじで書いてみたけど
どうにも case 式がダサイというか冗長なかんじ。
なんかスマートに書ける関数とかイディオムとか
ないですかね。
(某言語の instanceof みたいな)
0963デフォルトの名無しさん
2006/11/04(土) 03:44:44ない。
0964デフォルトの名無しさん
2006/11/04(土) 03:57:18こういうちょっとしたマクロの需要は確かにあるはすだけど、
いちいち$(testConstr [| Hoge |])なんて書いてたら冗長過ぎて略記法にならない。
0965デフォルトの名無しさん
2006/11/04(土) 04:00:52isHoge (Hoge _) = True
isHoge _ = False
って書くのが普通じゃないの
0966962
2006/11/04(土) 10:51:50ないっすか。(´・ω・`)
>>964
テンプレートハスケル?
なんか藪から蛇が!?
>>965
まあ、元の書き方よりは大分短いのでこれで
よしとすべきですかね
0967デフォルトの名無しさん
2006/11/04(土) 11:03:29findHoge = head (filter isHoge hoge)
where
isHoge (Hoge _) = True
isHoge _ = False
データ構造がそのままならパターンマッチしか無いけど
変えていいならこう
data HogeFuga = Hoge | Fuga
hogeList = [(Fuga, ""), (Hoge, "aaa"), (Fuga, "bbb")]
findHoge = lookup Hoge hogeList
0968デフォルトの名無しさん
2006/11/04(土) 11:44:21{-# OPTIONS_GHC -fglasgow-exts #-}
import GHC.Exts
import Data.List
sameConstr :: a -> a -> Bool
sameConstr x y = dataToTag# x ==# dataToTag# y
findHoge = find (sameConstr Hoge{}) hogeList
data HogeFuga = Hoge String | Fuga String
deriving (Show)
hogeList = [Fuga "", Hoge "aaa", Fuga "bbb"]
0969デフォルトの名無しさん
2006/11/04(土) 20:17:15「圏論の基礎」の原題を三回読んで,改めて本を探すべし.
ちなみに僕には Barr-Wells の本が判りやすかった.
>>958
> 何らかの自然っぽい構造を持ったものはだいたい代数と言ってしまうので
> ミスリーディングではあるんだけどね。
数学の側の感覚でいうと,作用(素)のつくる代数というものに相当するんじゃないかと思う.
0970942
2006/11/04(土) 21:48:06分離和は集合の圏での普通の意味の直和と一致するから
問題ないけどね。MacLane p.80 あたり参照。
俺が読んだ本は多すぎて紹介しきれんけど、プログラミングを
圏論的に解説したものとしては
http://db.cs.utwente.nl/Publications/PaperStore/db-utwente-404F4540.pdf
ってのが読みやすかった。好みが分かれそうだけど。
>>958
普通、作用素の代数といったら作用素環を指すのでアレだけど、
さすがに位相空間とか前順序まで作用素と呼ぶのは広すぎる気が。
0972962
2006/11/04(土) 22:39:54実は自分が扱ってるのは標準ライブラリのGetOptの返値なんで
さすがに自分で仕様は変えられないです。
http://www.haskell.org/ghc/docs/6.4.2/html/libraries/Cabal/Distribution-GetOpt.html
まあオプションの種類が一杯あるときは
データ変換しておく価値もあるかも?
>>968
おお、一番求めてるモノに近いっす。
でも標準じゃないのね。orz
0973デフォルトの名無しさん
2006/11/05(日) 11:30:09統合しようという話がある
http://lists.boost.org/Archives/boost/2006/10/112316.php
http://opensource.adobe.com/gil/html/gildesignguide.html#OtherImageLibrariesDG
より抽象化された記述からcを吐き出す言語があると聞いて
のぞきにきたのだけど
Glasgow Haskell Compiler
の吐くコードは、データ構造の指定みたいなのできるの?
画像でいうと
char image_rgb[]={r,g,b, r,g,b...}
char image_bgr[]={bgr,bgr}
とか.
計算速度はcのプログラムと比べて我慢できるLvなの?
0974デフォルトの名無しさん
2006/11/05(日) 12:31:09これは間違っていないけど、たぶん誤解している。
Haskellは、抽象化された記述をもとにコンパイル時計算をして
最適なコードを出力するような方向性の言語ではない。
むしろ、抽象化の解決は実行時に行われることが多い。
GHCには強力な最適化器があるので、これをなだめすかして
効率的なコードを吐かせることも不可能じゃないが。
>データ構造の指定みたいなのできるの?
意味が分からん。生のバイト列を扱えるかどうかという疑問なら、扱える。
>計算速度はcのプログラムと比べて我慢できるLvなの?
何を、どのように、どれくらいまじめに書くかによる。
Computer Language Shootout BenchmarksでのHaskellとCの比較。
http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&lang=ghc&lang2=gcc
0975947
2006/11/05(日) 23:42:06>「圏論の基礎」の原題を三回読んで,改めて本を探すべし.
>ちなみに僕には Barr-Wells の本が判りやすかった.
ども!ありがとうございます。
3回ですか。正直、圏論敵考えを展開するための土台部分が弱いので後半部分はきついです。普通の代数をもう少しやり直してみます。(たぶんそちらのほうが早道なので)
そのあとにBar-Wellsを見てみます。(できたら)
>>970
>分離和は集合の圏での普通の意味の直和と一致するから
>問題ないけどね。MacLane p.80 あたり参照。
ここら辺完璧すっ飛ばしてました。読んでみます。
>俺が読んだ本は多すぎて紹介しきれんけど、プログラミングを
>圏論的に解説したものとしては
>http://db.cs.utwente.nl/Publications/PaperStore/db-utwente-404F4540.pdf
ってのが読みやすかった。好みが分かれそうだけど。
ぱっとみですがこれ結構いいかも。薄いし全部印刷して一回読んで見ます。
ありがとうございます。
> 何らかの自然っぽい構造を持ったものはだいたい代数と言ってしまうので
> ミスリーディングではあるんだけどね。
環構造持っていれば代数。という感じじゃないんですかね。
わかってきたらまた質問するかもです。
そのときはよろしくお願いします。
0976デフォルトの名無しさん
2006/11/05(日) 23:57:50三回読めってのは中身ではなく原題のことだろう。
「Categories for the Working Mathematician」
なので、基本的にあの本は数学屋向け。プログラム屋には向かない。
0977947
2006/11/06(月) 00:24:18そういう意味か。確かに検索したら
http://www.amazon.co.jp/gp/product/0131204866/sr=8-3/qid=1162739828/ref=sr_1_3/250-2097820-9798628?ie=UTF8&s=english-books
でfor computing scienceだ。
でもあの本はあの本で含蓄があっていいよ。
なんていうか射で表現される世界というものが見えてきて面白い。
考えが確かにシンプルにできる。実用性はあんまりないが。
0978デフォルトの名無しさん
2006/11/06(月) 00:34:01何分馬鹿PGなもので関数言語はLispちょっとわかるぐらいの馬鹿です。
0979デフォルトの名無しさん
2006/11/06(月) 01:15:16WEBだけー
0980デフォルトの名無しさん
2006/11/06(月) 01:20:36まじっすかできればその時参照したページなどを
次スレで追加していただけないでしょうか?
0981デフォルトの名無しさん
2006/11/06(月) 02:04:270982デフォルトの名無しさん
2006/11/06(月) 02:29:07shiroさんのPractical Schemeの記事でも読んだら?
HaskellでなくSchemeで
しかも純粋な純粋な関数型の世界とはちょっと違うけど勉強になるよ
あとはnobsunさんのsampou.orgか
Haskellだけど記事が少ない
0983デフォルトの名無しさん
2006/11/06(月) 02:41:34簡単に作れて、工夫することで言語仕様の理解が深まる教材だと思う。
0984デフォルトの名無しさん
2006/11/06(月) 02:48:54それスレ立ててレクチャーしてくれよ
【Haskell】1がオセロゲーム教えるスレ
このスレは1が延々と、Haskell言語を使いオセロゲームの作り方について
詳しく丁寧に説明していくスレです。
Haskellの言語仕様の理解を深めるのに最適な教材です
0985デフォルトの名無しさん
2006/11/06(月) 04:07:59逆だろw
【Haskell】1がオセロゲームを作るスレ
0986デフォルトの名無しさん
2006/11/06(月) 11:29:56いくらでも工夫の余地はある。
0987デフォルトの名無しさん
2006/11/06(月) 20:51:59めんどくさがらずに教えろゴラァ!
0988デフォルトの名無しさん
2006/11/06(月) 20:54:37作ってみ。
0989デフォルトの名無しさん
2006/11/06(月) 20:55:090990デフォルトの名無しさん
2006/11/07(火) 01:49:15って考えたときどの資料みればいいの?
0991デフォルトの名無しさん
2006/11/07(火) 02:23:060992次スレ立てられなかったので誰かよろしく
2006/11/07(火) 18:37:59http://www.sampou.org/cgi-bin/haskell.cgi
http://shidot.dyndns.org/hs/
過去ログ
関数型プログラミング言語Haskell
Part1 http://pc.2ch.net/tech/kako/996/996131288.html
Part2 http://pc2.2ch.net/test/read.cgi/tech/1013846140/
Part3 http://pc8.2ch.net/test/read.cgi/tech/1076418993/
Part4 http://pc8.2ch.net/test/read.cgi/tech/1140717775/
Part5 http://pc8.2ch.net/test/read.cgi/tech/1149263630/
関連スレは>>2
関連書籍は>>3
・2chの仕様により、行頭の半角スペースは表示されません。
コードをインデントしたいときは、代わりに&nbsp;または全角スペースを使うことができます。
09932
2006/11/07(火) 18:38:38・関数型言語Part IV
http://pc8.2ch.net/test/read.cgi/tech/1083649982/
・【数学者】Haskellはクソ言語【オナニー】
http://pc8.2ch.net/test/read.cgi/tech/1128011645/
・純粋関数型言語Concurent Clean
http://pc8.2ch.net/test/read.cgi/tech/1075629340/
・関数型言語ML(SML, OCaml, etc.), Part 4
http://pc8.2ch.net/test/read.cgi/tech/1133003340/
・((Common Lisp) (Scheme) :Part 15)
http://pc8.2ch.net/test/read.cgi/tech/1151025773/
・【入門】CommonLispその2【質問よろず】
http://pc8.2ch.net/test/read.cgi/tech/1140012484/
・Emacs Lisp 2
http://pc8.2ch.net/test/read.cgi/tech/1068467385/
0994デフォルトの名無しさん
2006/11/07(火) 18:39:550995デフォルトの名無しさん
2006/11/07(火) 21:26:29関数型プログラミング言語Haskell Part6
http://pc8.2ch.net/test/read.cgi/tech/1162902266/
0996デフォルトの名無しさん
2006/11/07(火) 22:46:03せんとりがっせんいくぞごらぁー(AA略
0997デフォルトの名無しさん
2006/11/07(火) 22:49:47あらいぐまハスケル
あらいぐまハスケル
あらいぐまハスケル
0998デフォルトの名無しさん
2006/11/07(火) 22:51:04(;`・ω・) 。・゚・⌒) 今夜はハスケルです。オセロゲーム作るよ!!
/ o━ヽニニフ))
しー-J
アッ! 。・゚・
∧,,∧ て 。・゚・。・゚・
(; ´゚ω゚)て //
/ o━ヽニニフ
しー-J 彡
∧,,∧ ショボーン
( ´・ω・)
c(,_U_U ・゚・。・ ゚・。・゚・ 。・゚・
━ヽニニフ
よしバレてない
クルッ ∧,,∧
ミ(・ω・´ )つ サッサ
c( U・ ゚U。彡・ 。・゚・
━ヽニニフ
∧,,∧ 。・。゚・。 ゚・。゚・ モナド〜
( ´・ω・)つ\・゚・ 。・゚・・/
0999デフォルトの名無しさん
2006/11/07(火) 22:52:50\ハスケッ、ススン、ハ、ケルッ/
♪ ('A`) ♪
_ ノ )>_ キュッキュ♪
/.◎。/◎。/|
| ̄ ̄ ̄ ̄ ̄|
1000デフォルトの名無しさん
2006/11/07(火) 22:54:22人 ││ ●\ ●\
ノ二\ ナ ゝゝ V ●●● ●\ ●\
/ / 乙 つ O ●\ ●\ ●\ ●\
●●● ●\ ●\ ●\ ●\
●\ ●\ ●\ ●\ ●\ ●\
●●\ ●\ ●\ ●\ ●\ ●\ ●\
●\ ●\ ●\ ●\ ●\ ●\ ●\
●\ ●\ ●\ ●\ ●\ ●\ ●\
●\ ●\ ●\ ●\ ●\ ●\ ●\
●\ ●\ ●\ ●\ ●\ ●●● \
●\ ●\ ●\ ●\ ●\ \\\
●\ ●\ ●\ ●●● \
●\ ●\ ●\ \\\
●\ ●●● \ ┌┐ ┌┐
●\ \\\ ┣━┳┃┃ ┃ ││ ││
●●●\ ┃ ┃┃┃ ┣┓ ━╋ ━╋ V V
\\\\ ┛ ━┛ ┃ ┏┫ ┏┫ O O
/■\ ) (´⌒(´
⊂(゚Д゚⊂⌒`つ≡≡≡(´⌒;;;≡≡≡
ズザーーーーーッ
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。