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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
2デフォルトの名無しさん: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/
3デフォルトの名無しさん: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/
4デフォルトの名無しさん:2006/06/03(土) 01:04:03
クソ言語
5デフォルトの名無しさん:2006/06/03(土) 01:04:52
  ┏┳┳┓     ハイ.     ┏┳┳┓
┏┫┃┃┃    うんこは.  ┃┃┃┣┓
┃┃┃┃┣┓   ここまで ┏┫┃┃┃┃
┃      ┃┃┏━━━┓┃┃      ┃
┃ うんこ. ┣┫ . ・∀・ ┣┫. STOP!┃
┗━━━━┛┗┳━┳┛┗━━━━┛
            ┏┻┓┃
        ┏━┛  ┣┻┓
        ┗━━━┫  ┗━┓
.             ┗━━━┛
6デフォルトの名無しさん:2006/06/03(土) 01:20:55
・Haskellプログラミングチュートリアル
http://grape.sapid.org/tutorial/haskell.html

・Haskell Tutorial for C Programmers(英日対訳)
http://www.kt.rim.or.jp/~kbk/haskell-intro/intro.html
7デフォルトの名無しさん:2006/06/03(土) 07:28:45
うむ
8デフォルトの名無しさん:2006/06/03(土) 08:03:34
>>前スレ997-998
日本でHaskellがはやってることを世界に知らしめてどうしようっていうんだ。
HWNだって意図からして情報量を抑えて内容を精選するべきなんだから、
役に立たず、興味も引かない情報を載せる余裕はないだろ。
9デフォルトの名無しさん:2006/06/03(土) 10:59:06
( ゚д゚)ポカーン
10デフォルトの名無しさん:2006/06/03(土) 15:07:19
http://www.haskell.org/pipermail/libraries/2006-May/005397.html

ここで、Lazy I/O は良くないとかいう話があるんですが、
理解できない。

saxParse :: String -> [SaxEvent]

このような、入力は良くなくて、

saxParse :: Monad => m Char -> m SaxEvent

がいいらしいのだが、
これで、入力できるでしょうか?

せめて、

saxParse :: Monad => [m Char] -> m SaxEvent

こんな感じじゃないと、無理なような気がするのですが、
解説希望。
1110:2006/06/03(土) 15:25:08
>>10
なんか分かった気がする。
getChar :: IO Char のように、
評価する毎に次の文字が取得できるモナドを
仮定しているような気がしてきた。
12デフォルトの名無しさん:2006/06/03(土) 16:18:39
>>11
それで合ってる。
細かいことをいうと、getCharはモナドではなくて動作(アクション)で、
動作に対して行うのは評価ではなくて実行ね。
1310:2006/06/03(土) 17:09:08
>>12
ありがとう。

話は変わるが。

http://www.haskell.org//pipermail/haskell-cafe/2003-October/005190.html

Haskell を分岐して遅延評価を捨てた言語を作りたい、
(...)
90%のケースで遅延評価がいい評価戦略でないことを確信した。
(...)
Haskell はいい言語だ、純粋はグッド、型クラスもグッド、
モナドもグッド、しかし、遅延評価はうんこ。

前からうすうす気になっていたが、同じことをいってる奴を発見。
遅延評価って、美しいんだけどね。
14デフォルトの名無しさん:2006/06/03(土) 17:37:33
MLでええやん
15デフォルトの名無しさん:2006/06/03(土) 19:31:09
MLって寂れてるよね
未来がなさそう
16デフォルトの名無しさん:2006/06/03(土) 19:33:55
だから他の言語の話をするなと
17デフォルトの名無しさん:2006/06/03(土) 20:15:33
あってて良かった遅延評価のケースを語ってくれ
18デフォルトの名無しさん:2006/06/04(日) 02:30:29
俺はまだhaskell歴1ヶ月のしろーとで、まだまだ分かってないことも多いので、
もっと他にもいろいろあると思うが、俺の体験から言うと、
1.再帰関数による探索をしているアルゴリズムで、枝刈りが簡単にできる。
2.遅延(無限)リスト。
3.再帰関数でリストを作りながら、それを別の関数に突っ込める。
といったところかな。
こういったことができるとことで、より宣言的にプログラムが書けるような気がする。
まあ、「あってて良かった正格評価(指定)」のケースも結構あるけどね。
1918:2006/06/04(日) 02:35:53
「あって良かった」だな……
20デフォルトの名無しさん:2006/06/04(日) 03:05:44
そして、先行評価と遅延評価を細かくチューニングできるような仕組みを求める声が上がり、
だが次第にそのチューニングすらめんどくさくなってきて「解析して自動的にうまいこと
切り替えるようにしてくれよ」とか言われだすが、どうみても決定不能です。本当に(ry
21デフォルトの名無しさん:2006/06/04(日) 03:18:00
コンパイラの最適化ってのは、
大抵問題が決定不能だから近似解を求めるものですがなにか
22デフォルトの名無しさん:2006/06/04(日) 03:25:20
Cleanでは、20の内容がそのまま実装されている。
だから速い。
23デフォルトの名無しさん:2006/06/04(日) 18:13:26
じゃあ何故クリーンではなくはすけるのだ?
24デフォルトの名無しさん:2006/06/04(日) 18:59:31
遅延評価のIOとかが便利にできるかが問題だとすればCleanも十分不便だし、
GHCは正則評価できる。
25デフォルトの名無しさん:2006/06/04(日) 19:54:05
前スレ>>973
なんでIOモナドの話に世界を持ち出したらダメなの?
なんかの論文にも出てた気がするけど。
concurrencyのせい?Concurrent Haskellの論文にはπ計算とか出て来て正直分からん。
(ふつけるまだ読んでない私が言うのも何だけど

type IO a = State World a みたいな感じの理解でとりあえずおいとくのはアリだと思うんだけど。
26デフォルトの名無しさん:2006/06/04(日) 21:08:42
>>25
大体次のような感じ。concurrencyは念頭になかった。
・どこかでHaskellレベルの概念と実世界の概念を対応させなきゃいけない
 (Worldを持ち出しても、World -> Worldの関数が実世界の何に対応するかを
 説明しなきゃいけない。(*1))んだから、余計なものを持ち込まない方がいい。
・IO aには十分簡単な説明(「a型の値を返すアクション」「無引数でa型の値を返す
 (Cの)関数へのポインタ」)があって、実例もあげやすいのに対し、世界はそうではない。
 例えば、この本ではアクションが起こる順番が定まっていることを各中間世界の依存性から
 言っているけど、それぞれの中間世界の値が(計算で?)決定されることと、
 一つしかない実世界の状態が変化することの関係が不明瞭。

しかし、考えてみると、初めて世界を使ったIOモナドの説明を読んだとき
全然納得できなかったことの腹いせのような気もしてきた。
不必要にきつい表現を使ったことをお詫びします。

*1: ただし、この本ではアクションがWorld->Worldの関数だとは言っていないし、
 世界を表す値があるとはっきり言っている訳でもない。
> IOモナドは概念的に「まだ入出力を実行していない現実世界」をアクションの中に包み込んでいます。
27デフォルトの名無しさん: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アクションに渡される引数の簡約が、評価順のトップになるという感じなのかな。
(わかりにくい説明でスマソ)
28デフォルトの名無しさん:2006/06/04(日) 22:15:18
>>27
Tackling 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 [])
-- 左端を簡約。ここでエラー発生。
2927:2006/06/04(日) 22:25:59
ありがとう。まさしくその論文ですねWorldが出てくるのって。
Cleanとかの"world as value"という感じ?
30デフォルトの名無しさん:2006/06/04(日) 22:47:46
>>27 のdo記法版を見て期待してしまう動作は最初のx <- return (head [])でエラー発生なんだけど、実際にはそういう風にはならないのか。
let x = head [] だったりすると余計にそう考えてしまうんだけど、実際にはx <- return (head [])とまったく同じでした。

逆にprint "hoge"の前にxを評価してエラーを発生させるためにはどうすればよいのだろう。
一応seq x (return ())を入れてやればエラーが起きたけど、もっと別の方法はないのかな?
31デフォルトの名無しさん:2006/06/04(日) 23:04:56
Control.Exception.evaluate x
とか。
32デフォルトの名無しさん:2006/06/04(日) 23:12:46
>>31
Hoogleで検索して結局それに行き着きました。
returnの代わりにevaluateを使えば良いから、変な行を追加する必要が無くてすっきりしますね。
33デフォルトの名無しさん:2006/06/05(月) 04:53:12
モナドの説明はこれが一番判りやすかったね

世界で一番か二番くらいにやさしい「モナド入門」
ttp://d.hatena.ne.jp/m-hiyama/20060419/1145432492
34デフォルトの名無しさん:2006/06/05(月) 07:59:01
私たちは素晴らしいモナドのモナドのモナドのモナドのモナドのモナドのモナドの中にいる。
35デフォルトの名無しさん:2006/06/05(月) 08:14:38
それにしても、日本語の本が出た影響ってすげぇな。
いきなり過疎スレが復活してるし。
ネットでいろんな文章見かけるようになった。
36デフォルトの名無しさん:2006/06/05(月) 08:16:41
amazonこねーーーーーー
配送予定日: 2006/6/3 - 2006/6/4
今日は6月5日だ( ゚Д゚)ヴォケ!!
37デフォルトの名無しさん:2006/06/05(月) 13:04:19
いいか、みんな
        (゚д゚ )
        (| y |)

amazonで注文すればokと信じていたのに、
いつまでたっても商品が来ない。
    amazon ( ゚д゚)  ok
       \/| y |\/

これらをくっつけて
        ( ゚д゚) amazonok
        (\/\/

逆から読むとこのざま、というわけだ
        ( ゚д゚) konozama
        (\/\/

amazonは当てにならない、ということだな
        (゚д゚ )
        (| y |)
38デフォルトの名無しさん:2006/06/05(月) 15:30:16
自作関数が既存の物よりどれほど低速か知りたいのですが
所用クロックなんかを教えてもらうにはどうすればいいですか?
39デフォルトの名無しさん:2006/06/05(月) 15:30:57
つーか本屋でもみかけないんだが、本当に発売されてる?
40デフォルトの名無しさん:2006/06/05(月) 16:08:44
渋谷のブックファーストで1時間探したが無かった
入門〜はあった
41デフォルトの名無しさん:2006/06/05(月) 16:51:46
>>38
:set +s

GHCでは時間と使用メモリ、Hugsでは使用セル数と簡約回数がわかる。
ただ、GHCの使用メモリ量は、同じ式を評価してもコロコロ変わる……
42デフォルトの名無しさん:2006/06/05(月) 17:16:36
中野のあおい書店には両方十冊くらいあった。
43デフォルトの名無しさん:2006/06/05(月) 17:18:09
GHCで-prof -auto-allオプションをつけてコンパイルして、
+RTS -pオプションをつけて実行ファイルを走らせれば
実行ファイル名.profに各関数の使用時間とかが出力される。

でも、Hugsで調べたほうが手間が少なくてよいかも。
44デフォルトの名無しさん:2006/06/05(月) 18:31:04
hugsで
ERROR - Garbage collection fails to reclaim sufficient space
のメッセージがでちゃうと以後何を評価しても同じメッセージがでてしまいます
この場合再起動するしかないのでしょうか?
hugsのバージョンはZaurs版の hugs98_Mar2005-patched-1_arm.ipkです。

プロンプトまで戻ってきていてGC不可能ってことは最後に評価してある式はまだ評価途上のままのこってるってこと?

45デフォルトの名無しさん:2006/06/05(月) 18:53:15
>>44
バグなんじゃないか?
手元のHugs March 2005(Linux/x86)だとそのメッセージが出た後も普通に使える。

それから、役に立つかどうか分からないけど、Hugsには:gcというコマンドがある。
4645:2006/06/05(月) 19:05:11
ごめん。>>45は忘れてくれ。再現できた。
k = [1..]
と書いたスクリプトを用意して、
length k
を評価するとそうなるな。
4745:2006/06/05(月) 19:10:29
既知の問題っぽい。
http://cvs.haskell.org/Hugs/pages/users_guide/haskell98.html
の一番下にある。
48デフォルトの名無しさん:2006/06/05(月) 19:13:53
>>46
追試ありがとうございます。
zaurus固有ならコンパイル環境そろえて自力で最新版とか考えたのですが違うみたいですねぇ。

49デフォルトの名無しさん:2006/06/05(月) 19:14:51
うわしまったこれじゃ
stack overflowまでループじゃん…って時は
どうやって停めますか?
50デフォルトの名無しさん:2006/06/05(月) 19:16:54
>>47
あう、重ねがさねありがとう。
まさに無限リストいぢくってる最中だったので、ビンゴっぽいです。

51デフォルトの名無しさん:2006/06/05(月) 20:31:20
この関数型言語ってほんとおつむの良し悪しが出るね
慣れてないからかね
52デフォルトの名無しさん:2006/06/05(月) 21:56:10
ちょっとパズル的なところがあるからじゃないかな。
道具がprimitiveすぎるからだと思うんだけど。

C++ templateも近いものがある。
53デフォルトの名無しさん:2006/06/05(月) 22:01:54
というかここに居る人たちレベル高すぎて・・・
恥ずかしくてレベルの低い質問も出来ないよw
54デフォルトの名無しさん:2006/06/05(月) 22:07:48
せっかく2chにHaskellのスレがあるのにろくに活用されてないのは悲しい。
ということでレベルの高低にかかわらずどんどん質問するべきだと考える。
俺に答えられることなら喜んで答えるので。
55デフォルトの名無しさん:2006/06/05(月) 22:23:12
日本語のHaskellの本を書いている人の日記を見ても、
あんまり大した情報が書かれて無いね。
Webに書いてもお金にならないからかね。
56デフォルトの名無しさん:2006/06/05(月) 22:50:34
君のレスが面白くないのもお金(ry
57デフォルトの名無しさん:2006/06/05(月) 23:26:08
アマゾンにいったら、速攻で、紹介者のIDナンバーである Id=abc を消してしまおう。
http://www.amazon.co.jp/o/ASIN/B0007D5J4C/503-3205663-9082354?SubscriptionId=abc
58デフォルトの名無しさん:2006/06/06(火) 08:07:02
くだすれHaskell(超初心者用)
立ててくれ
59デフォルトの名無しさん:2006/06/06(火) 08:09:53
【ネタ心物歓迎】ハスケル質問箱 for Perler
立ててくれ
60デフォルトの名無しさん:2006/06/06(火) 10:58:09
div 整数 整数
ってひょっとしてちゃんと約分までしてくれる?
61デフォルトの名無しさん:2006/06/06(火) 11:05:27
結果も整数だから約分は関係ないんじゃないか?
62デフォルトの名無しさん:2006/06/06(火) 11:28:37
fact n = product [1..n]
Conbi n r = (fact n) `div` ((fact r)*(fact (n-r)))

したらなんか結果が優秀なんだけど
途中計算で約分してるとしか思えない
63デフォルトの名無しさん:2006/06/06(火) 11:53:19
>>62
オーバーフローしてないって事?
それなら単に整数のデフォルト型がInteger(無限長整数)だというだけの理由。
試しに
fact :: Int -> Int
とでも書いてInt(固定長整数)を使うように指定してやれば、ちゃんとオーバーフローするはず。
64デフォルトの名無しさん:2006/06/06(火) 12:00:26
約分じゃなくて、
deforestrationしていたら面白いのにな。
65デフォルトの名無しさん:2006/06/06(火) 21:03:13
haskell勉強して、なんかいいことあるの?
人に自慢して、うっとうしがられるくらい?
66デフォルトの名無しさん:2006/06/06(火) 21:04:54
>>65って生きていて、なんかいいことあるの?
人に、うっとうしがられるくらい?
67デフォルトの名無しさん:2006/06/06(火) 21:12:10
http://www.haskell.org/haskellwiki/Jobs
に求人情報があるんだけど、
日本の Haskell の求人、どっかにない?
68デフォルトの名無しさん:2006/06/06(火) 21:36:14
研究者とかならあるんじゃね?
69デフォルトの名無しさん:2006/06/07(水) 01:22:17
>>66
??
???
70デフォルトの名無しさん:2006/06/07(水) 02:55:57
そんなの自分で考えなでしょ。
言語マニアも居れば、遥かに先を見ていて、通過点と考えてる人も居るだろうし。
71デフォルトの名無しさん:2006/06/07(水) 02:56:05
「入門Haskell」と「ふつうのHaskell入門」の両方買ったんだけど、
正直「ふつう」の方が読みやすい。

特に序盤。「入門」はいきなりおいてけぼりを食らった気がした。
「ふつう」の方はわざわざ式を展開してくれるとか丁寧。
もう関数型言語を理解してる人にとっては、
「そんな方法でページ稼ぎやがってー」と思われるのかもしれないけど、
勉強し始めの身にはありがたい。
いい入門書だと思う。
72デフォルトの名無しさん:2006/06/07(水) 03:02:02
対象読者が違うってことなのかな?
色んな対象への本があるってのはいい事だと思う。
73デフォルトの名無しさん:2006/06/07(水) 06:42:15
Visual Haskellなんてのがあるんだな。
商用アプリは製作禁止だっけ?
74デフォルトの名無しさん:2006/06/07(水) 12:59:17
ghciで深刻でないバグを見つけた。
インタプリタに処理させた後で
上押してさっきの入力を呼びだしてそれを繰り返し処理

高速に繰り返すと
<interactive>:1:0: Notin scope: `g〜'

ってエラー起こす。
g〜ってのは、関数名の先頭一文字めだけgになった関数名にバグ表記という意味
sum -> gum
75デフォルトの名無しさん:2006/06/07(水) 16:04:21
第一引数のリストから、第二引数のリストとで重複する要素を取り去ったリストを得る
高速な関数ありますか?
76デフォルトの名無しさん:2006/06/07(水) 16:38:51
my@ARR1=(0,1,2,3);
my@ARR2=(1,2);
my@TMP=grep {my$ARR1=$_;!grep{$ARR1==$_}@ARR2}@ARR1;
print "@TMP\n";
77デフォルトの名無しさん:2006/06/07(水) 17:21:30
頭のおかしい方がいます
78デフォルトの名無しさん:2006/06/07(水) 17:29:18
( ´,_ゝ`)プッ こんな簡単な関数も書けないくせに偉そうにw
79デフォルトの名無しさん:2006/06/07(水) 17:38:38
Visual Haskellなんだが、インスコできなかった。
Visual Studio2005だとダメっぽいな。
80デフォルトの名無しさん:2006/06/07(水) 18:06:51
頭のおかしい方がいます
81デフォルトの名無しさん:2006/06/07(水) 20:04:41
>>79
どうもそうらしいね。俺の知り合いもそう言ってた。2003でないとダメぽ
82デフォルトの名無しさん:2006/06/07(水) 21:23:01
>>79
version0.0ってのがスゴス
83デフォルトの名無しさん:2006/06/07(水) 22:42:34
Haskell.NETはどうなったんだ?
STL/CLI(旧STL.NET)は使えるのか?
84デフォルトの名無しさん:2006/06/07(水) 23:28:07
>>75
第二引数のリストに Eq 以外に Ord などの特徴があれば、
二分木やハッシュにしておけば速くならないかな?
85名無しさん♯:2006/06/08(木) 01:29:25
>>83
現状のCTSの仕様では実現はむずかしそう。
ttp://www.haskell.org//pipermail/haskell-cafe/2005-January/008250.html

ただ、Mondrian for .NETを再構築しようとの動きはあるみたい。
ttp://research.microsoft.com/~emeijer/
86名無しさん♯:2006/06/08(木) 01:31:16
リンク間違えた・・・。こっちの方。
ttp://www.haskell.org//pipermail/haskell-cafe/2005-January/008244.html
87デフォルトの名無しさん:2006/06/08(木) 02:16:43
遅延評価ってスレッドみたいなもん?
88デフォルトの名無しさん:2006/06/08(木) 02:26:02
最近おぼえた言葉をとりあえず繋げてみるのはやめような。
89デフォルトの名無しさん:2006/06/08(木) 02:57:52
ごめんなさい。。。

遅延評価ってオンザフライみたいなもん?
90デフォルトの名無しさん:2006/06/08(木) 03:08:41
まぁ、ニュアンス的にはそんなもんかな
91デフォルトの名無しさん:2006/06/08(木) 03:30:42
遅延評価=つん読
92デフォルトの名無しさん:2006/06/08(木) 05:44:29
遅延評価によるプロセス切り替えのオーバーヘッドがクリティカルな場合
バッチ処理的にやりたくなったら、遅延評価をしないという選択はできるのですか?
93デフォルトの名無しさん:2006/06/08(木) 05:47:01
>遅延評価によるプロセス切り替え

なにこれ
94デフォルトの名無しさん:2006/06/08(木) 06:18:32
プロセスっていうか
必要な分が揃ったら処理とかやってくわけですよね?
関数のバケツリレーで
あの関数を処理してちょっと停めてこっちの関数移ってとか
切り替えにオーバーヘッド時間かかると思うのです
95デフォルトの名無しさん:2006/06/08(木) 07:22:56
日本語でおk
96デフォルトの名無しさん:2006/06/08(木) 09:54:27
>94
とりあえず遅延評価でググって上から順に見てってみろ。
97デフォルトの名無しさん:2006/06/08(木) 14:25:27
>必要な分が揃ったら処理とかやってく
どうみても理解してません本当に(ry
98デフォルトの名無しさん:2006/06/08(木) 14:43:13
><
99デフォルトの名無しさん:2006/06/08(木) 16:07:14
>>=
100デフォルトの名無しさん:2006/06/08(木) 17:23:46
ちょwww
101デフォルトの名無しさん:2006/06/08(木) 18:14:19
必要になったら使うってことでよい?
式なんだけど、関数ポインタ渡すみたいな
102デフォルトの名無しさん:2006/06/08(木) 18:14:48
> 関数ポインタ渡すみたいな
違うか。匿名メソッドを渡すみたいな幹事なんだろうか
103デフォルトの名無しさん:2006/06/08(木) 18:40:45
>>101-102
何を言ってるか分からん。
104デフォルトの名無しさん:2006/06/08(木) 18:43:36
>>75
今頃だけど notElemってのがあった
diff xs ys = [x | x <- xs, notElem x ys]
105デフォルトの名無しさん:2006/06/08(木) 18:48:15
>>103
遅延評価=その場で評価されないって意味で書いた
106デフォルトの名無しさん:2006/06/08(木) 18:50:17
import List
main = print ([1,2,3,4,5] \\ [2,3,4])
107デフォルトの名無しさん:2006/06/08(木) 18:54:45
>>105
「何」が「どの場」で評価されないと?
何か聞きたいなら他人に判るように(出来るだけ厳密に)書いてくれ。

なんにせよ、「必要になるまで使わない」のはHaskellに限らず当り前。
108デフォルトの名無しさん:2006/06/08(木) 19:14:53
>>102
それは(実装の意味で)かなり正しい。例えば有名なたらいまわし関数を
遅延評価を意識して 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());
}
109104=106:2006/06/08(木) 19:22:45
すまん、挙動が違った
diff [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]
どっちにしろこれ自体が遅いのかもしれないけど
110デフォルトの名無しさん:2006/06/08(木) 20:00:40
111デフォルトの名無しさん:2006/06/08(木) 20:15:17
実装って事はメタレベルの話だからまったく違うだろと
同じレイヤーで話せっての
112デフォルトの名無しさん:2006/06/08(木) 21:34:43
私は遅延評価の「実装」の話を尻鯛です。グラフリダクション?
手元にPeyton JonesのImplementingとImplementation of Functional Programmingの本があるんだけど
1990年とかで古過ぎ。
GHCはどんな風にコンパイルしてるのか,それなりにまとまった読み物はない?
113デフォルトの名無しさん:2006/06/08(木) 21:42:51
>>112
http://citeseer.ist.psu.edu/peytonjones92implementing.html
これの内容は大部分いまのGHCにも通用するんじゃないか?
114デフォルトの名無しさん:2006/06/08(木) 21:48:15
まじすか。どうもありがとう!
今見たら Implementation ... は 1987, Implementing...は1992だった。
多分>>113のやつだと思う。ちゃんと読んでみますです。。
115デフォルトの名無しさん:2006/06/08(木) 22:13:14
>>112
遅延評価の実装をまったく知らないなら、
GHC に興味を持つ前に SICP でも見て自分で実装してみたほうがいいと思う。
SICP 読まなくても、scheme の promise の仕組みを知ってれば、実装は出来る。
116デフォルトの名無しさん:2006/06/09(金) 00:19:31
遅延評価のせいでやたら処理が遅くなってる場合はモナドですか?
117デフォルトの名無しさん:2006/06/09(金) 00:23:48
やっぱり
くだすれHaskell(超初心者用)
のスレ立てが急務だ。
おまいら正直あまりにとんちんかんで低レベルな質問が増えて
辟易してるだろう?
118デフォルトの名無しさん:2006/06/09(金) 00:24:48
そんな事書いてる暇があれば立てろという突っ込みは受理しません
119デフォルトの名無しさん:2006/06/09(金) 00:36:21
まあでもなんだかんだでそっちも見て結局辟易するんじゃね?
120デフォルトの名無しさん:2006/06/09(金) 00:38:42
>>116
(IO以外の)モナドと遅延評価は関係ない。
Stateモナドでスライド辞書書いてみて
身にしみた。
121デフォルトの名無しさん:2006/06/09(金) 01:56:59
浮動小数演算遅せー
IORef遅せー
String遅せー
うおぉぉぉ
122デフォルトの名無しさん:2006/06/09(金) 06:53:00
ハスケル製アプリで金取るの駄目?
123デフォルトの名無しさん:2006/06/09(金) 07:53:35
型クラスに関わる(型)推論がどのようになされるのか解説はありませんか?
ちょっとちがうのかもしれないけど、型変数同士がうまく単一化されてくれないんです…
どちらにせよ、fundepsとかmultiparameter type classがどんな風に計算されるのかを
ちゃんと知っておきたいんですが。
124デフォルトの名無しさん: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
125デフォルトの名無しさん:2006/06/09(金) 08:52:16
うごごご…全角スペースになってませんでしたorz

で,ここで
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が単一化できてない感じです。
126デフォルトの名無しさん:2006/06/09(金) 08:57:16
あ,
class Stateful c s | c -> s where
で行けましたOTZ
まあでも情報きぼんぬです
127デフォルトの名無しさん:2006/06/09(金) 10:13:35
>>122
もちろん問題無いが、おまいには金を取れそうなアプリなど作れないだろう
128デフォルトの名無しさん:2006/06/09(金) 10:15:27
>>127
エスパーの方ですか?
129デフォルトの名無しさん:2006/06/09(金) 11:56:30
>>127
シェアウェアとかおkなんですか?
夢広がりんぐ
130デフォルトの名無しさん:2006/06/09(金) 12:06:35
vipperには無理だろ、お祭り意識がなくなったらやる気なくしちゃうんだから。
131デフォルトの名無しさん:2006/06/09(金) 13:05:56
その前に知能が(ry
132デフォルトの名無しさん:2006/06/09(金) 14:44:09
遅延評価ってバッチ処理より処理終了が遅れますよね?
133デフォルトの名無しさん:2006/06/09(金) 16:54:46
ttp://headlines.yahoo.co.jp/ranking/php/book/pc.html

PHP研究所
コンピュータ(書泉グランデ調べ 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円
134デフォルトの名無しさん:2006/06/09(金) 18:17:32
理解できないのに買う見栄っ張りがそれだけ多いということだな
135デフォルトの名無しさん:2006/06/09(金) 18:24:23
いやあ、理解できるでしょう。がんばれば。
C系以外を使った事が無いと、なかなか目が慣れない、ということはあると思うけれど。
136デフォルトの名無しさん:2006/06/09(金) 19:17:33
>>134
書籍ビジネスは本棚に本を並べることを趣味とする人たちがターゲットですよ
137デフォルトの名無しさん:2006/06/09(金) 19:27:27
Haskellをステータスだと思う人が増えただけでも良いかと
知名度も上がるだろうし
138デフォルトの名無しさん:2006/06/09(金) 20:48:35
TRONWARE が18位なことに驚き
139デフォルトの名無しさん:2006/06/09(金) 23:12:47
GHCが人手を募集している。
140デフォルトの名無しさん:2006/06/10(土) 07:00:22
Haskellが万能だと思ってる俺の熱を冷ましてくれ。
いつもHaskellの事を考えてしまって生活が破綻する。
141デフォルトの名無しさん:2006/06/10(土) 07:10:25
コンパイラの実装を把握していて、pros/cons を分かった上で使ってるなら良いんじゃないの。
もしそうなら、Haskell が万能というよりは貴方が万能な訳だ。
142デフォルトの名無しさん:2006/06/10(土) 12:40:43
O(N^3) の対角化ルーチン書いて。
143デフォルトの名無しさん:2006/06/10(土) 13:21:07
Haskellおもすれー(^ω^ )
144デフォルトの名無しさん:2006/06/10(土) 13:24:46
>>143
   λ,,,,,,λ ガオー!
  ∩`iWi´∩ λ,,,,λ グオー!
  ヽ |m| .ノ∩`iWi´∩
   |  ̄| ヽ |m| .ノ
   |   | |  |
   U⌒U  U⌒U
145デフォルトの名無しさん:2006/06/10(土) 13:55:07
>>140
Cに遜色ないくらい高速にアクセスできるHashtableを実装してみてくれ。
146デフォルトの名無しさん:2006/06/10(土) 14:02:13
lastの実装とか馬鹿臭くないですか?
先頭から辿るなんて。
単調減少リストをクイックソートする最悪ケースがあったとして
遅延評価なら結果リストの最後の要素はすぐ返せると思いきや、
lastは初めから辿る実装なので、結局リストの初めが出来上がらないことには動き出せないわけで
則ちこのケースではリスト完成するまで待たされるという事じゃないですか!

プリミティブな関数程綿密に設計されなければならないとい事ですか?
147デフォルトの名無しさん:2006/06/10(土) 14:09:17
>>146
それはlastの問題じゃなくて、Haskellのリストが単方向リストであることの帰結。
148デフォルトの名無しさん:2006/06/10(土) 14:26:41
両方向リスト作れって事ですか?
149デフォルトの名無しさん:2006/06/10(土) 14:33:04
操作のたびに全体をコピーしないといけないので、両方向リストは効率が悪い。
IOモナドの中で操作するデータ構造にすれば別だけど。
関数的に使えて、両端からのアクセスが速いデータ構造も研究されてるらしい。
2-3 finger trees
http://www.informatik.uni-bonn.de/~ralf/publications/FingerTrees.pdf
150デフォルトの名無しさん:2006/06/10(土) 14:59:46
>>149
どうもありがとうございますた
151デフォルトの名無しさん:2006/06/10(土) 16:07:35
lastなんてたかだかO(n)の処理。どうでも良い。
152デフォルトの名無しさん:2006/06/10(土) 18:54:19
ふつうのHaksell買ったけど特に説明うまいとは思えんかったな
153デフォルトの名無しさん:2006/06/10(土) 20:11:50
はじめに出たやつよりはましだろ。
154デフォルトの名無しさん:2006/06/10(土) 21:01:16
Haskellの勉強しようとすると、Clara Haskilのレコードを聴きだして勉強が進まない。
155デフォルトの名無しさん:2006/06/10(土) 21:06:13
なんかフジテレビに白石ひよりが出てるな
156デフォルトの名無しさん:2006/06/10(土) 22:10:28
>>152
> ふつうのHaksell
それ、パチもんだから。
157デフォルトの名無しさん:2006/06/11(日) 01:40:36
最低限の代数学のセンスないとダメだから。
無理だと思った人はとっととあきらめて。
158デフォルトの名無しさん:2006/06/11(日) 02:20:20
>>154
Haksellができたところで現実的には何も変わらんから気にするな
159デフォルトの名無しさん:2006/06/11(日) 03:10:22
変わらないなら変えるんだ!
160デフォルトの名無しさん:2006/06/11(日) 05:10:03
関数型言語やってると脳が活性化しますね。
物事を再帰関数で考える所も、ワーキングメモリ増強に良い気がします。
161デフォルトの名無しさん:2006/06/11(日) 05:11:53
concatってなんて発音するの?
コンキャット?
162デフォルトの名無しさん:2006/06/11(日) 07:10:38
辞書引きなさいよ
163デフォルトの名無しさん:2006/06/11(日) 07:35:31
分からないなら黙ってなさいよ
164デフォルトの名無しさん:2006/06/11(日) 09:52:52
分かってる人も答えなさんなよ
165デフォルトの名無しさん:2006/06/11(日) 10:00:29
>>160
再帰で考える方がワーキングメモリは少なくて済むんじゃないか。
166デフォルトの名無しさん:2006/06/11(日) 10:16:56
>>165
俺は最初再帰関数の処理手順がイメージつかなくて脳が悲鳴を上げた

脳にスタックを作るのはいい体操になると思う
167デフォルトの名無しさん:2006/06/11(日) 11:28:03
小学生ですが、小学生でも理解できるでしょうか?
168デフォルトの名無しさん:2006/06/11(日) 11:31:11
出来ない理由はない。
169デフォルトの名無しさん:2006/06/11(日) 11:32:35
このスレ住人に理解できることが小学生に理解できないわけがないだろ。
170デフォルトの名無しさん:2006/06/11(日) 11:56:23
このスレに東大生はいますか?
171デフォルトの名無しさん:2006/06/11(日) 12:03:31
何で東大生を探しているの?
172デフォルトの名無しさん:2006/06/11(日) 12:04:15
どうもこの瞬間にはいないようです。
173デフォルトの名無しさん:2006/06/11(日) 12:11:55
BBSのログは一つだけだから、瞬間には唯一人しかいないに決まってる。
174デフォルトの名無しさん:2006/06/11(日) 12:30:15
>>172≠東大生は恒真らしいということですか
175デフォルトの名無しさん:2006/06/11(日) 13:33:32
諸君、議論したまえ。
176デフォルトの名無しさん:2006/06/11(日) 13:35:11
もうすることないです
177デフォルトの名無しさん:2006/06/11(日) 15:10:26
Haskell製のテキストエディタあったろ
あれいじってなんか書け
178デフォルトの名無しさん:2006/06/11(日) 15:18:14
Haskellって案外生産性が低いんだよな。
Pythonと比べて30倍くらい時間かかる。
179デフォルトの名無しさん:2006/06/11(日) 15:26:54
>>178
今のところはね。
180デフォルトの名無しさん:2006/06/11(日) 16:05:17
VBの方が生産性高いよね。すぐに動くコードが出来上がる。
181デフォルトの名無しさん:2006/06/11(日) 16:47:36
BASICより遅いよな、ぶっちゃけ。
まあその代わり素晴らしい表現力があるが。
182デフォルトの名無しさん:2006/06/11(日) 17:08:20
haskellの最大の欠点(つかocamlもなんだけどよ)
unicode対応まだ〜?チンチン!!(AA略)

183デフォルトの名無しさん:2006/06/11(日) 18:23:35
ocaml日本語使えるじゃん
184デフォルトの名無しさん:2006/06/11(日) 19:02:14
>>183
# ["漢字文字列"] ;;
- : string list = ["\138ソ\142\154\149カ\142\154\151\241"]
↑これを使えるっていうのならね
185デフォルトの名無しさん:2006/06/11(日) 19:46:20
>>157
何の煽りか知らないけど、
代数学の知識なんて要らないんじゃ?集合論の知識すら要らないような。
モナドの話になるとちょっと代数が関わってくるけど,Haskellerならreturnが単位元な事と>>=の結合則が成り立つ事が分かっていればいい。

Haskell は
・マニュアルの読み方
・データと型の名前空間が違うということ
・構築子は大文字で,関数や型変数は小文字だということ
・演算子の中置記法
・let文の書き方
・パターンマッチの使い方
・型構築子の概念 (Either a bは a と b の 二つの「型引数」を持った型,とか)
・IOモナドの使い方 (>>=とreturnの型が分かること)

これだけわかればとりあえず使えるはず。(常識的なC,Javaに慣れていれば)
高階関数なんかは頭をひねってくれ。lisp/schemeでも使うでそ。
186デフォルトの名無しさん:2006/06/11(日) 19:51:10
特に IOモナドは,数学の概念とかは忘れて,単に
(>>=) :: 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
ということ。ただこれだけ。
187デフォルトの名無しさん:2006/06/11(日) 20:16:31
>>185
> Haskellerならreturnが単位元な事と>>=の結合則が成り立つ事が分かっていればいい。

代数じゃん!
188デフォルトの名無しさん:2006/06/11(日) 20:17:31
>>184
wwwwwwwwwwwwwwwwwwww
189デフォルトの名無しさん:2006/06/11(日) 21:02:09
> >>=の結合則
別に成り立たなくてもプログラムの意味は変わらないと思う
190デフォルトの名無しさん:2006/06/11(日) 21:14:34
do
 do
   a
   b
 c

do
 a
 do
   b
   c
で意味が違うのは嫌じゃないか?
191デフォルトの名無しさん:2006/06/11(日) 22:06:19
>>188
何わらってんだかしらんが、一文字を一文字として扱えない段階で話にもなってないって事じゃねぇの?
192デフォルトの名無しさん:2006/06/12(月) 00:00:00
日本語なんて使うなよ
それとも英語も出来ない人ですかw
193デフォルトの名無しさん:2006/06/12(月) 00:12:45
>>192
釣りですか?
194デフォルトの名無しさん:2006/06/12(月) 01:05:17
>>191
釣りですか?
195デフォルトの名無しさん:2006/06/12(月) 01:11:51
>>193
釣りですか?
196デフォルトの名無しさん:2006/06/12(月) 01:22:59
you
 can
  do
   shityainayo
197デフォルトの名無しさん:2006/06/12(月) 06:36:21
$! でバッチ処理的にソートさせてみたら、
なんと遅延評価させるものより遅くなった!
死にたい
198デフォルトの名無しさん:2006/06/12(月) 06:41:55
>>187
自分で一からモナドを書かない限り、代数は使わなくても済むよ〜、
と言いたかった。

もちろん知っておいた方がいいのは間違いない。
他にfoldrとfoldlは与える演算子が結合的なら結果が同じになるとか。

ただ普通にCやJavaでやっていた計算をHaskellでやる分には何も考えなくても書ける。
199197:2006/06/12(月) 06:59:15
しかもメモリ馬鹿食いしてる!
200デフォルトの名無しさん:2006/06/12(月) 09:07:00
>>192
そういう煽り方しておもしろいですか?

201デフォルトの名無しさん:2006/06/12(月) 11:29:15
手軽にランダムリスト得たい時はどうしますか?
202デフォルトの名無しさん:2006/06/12(月) 13:18:54
Haskellで乱数は使ったことなかったのでちょっと試しに書いてみた。

module 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) とかすれば乱数リストが取れた。
203デフォルトの名無しさん:2006/06/12(月) 14:24:32
>>202
あり^^
204デフォルトの名無しさん:2006/06/12(月) 17:19:48
>>202
randomsRUnsafeをtakeするのをreplicateしたら全部同じリストなんですね。
205デフォルトの名無しさん:2006/06/12(月) 19:00:59
nobsunの ハッカーがHaskellを使うべきでない10の理由 超ワロス
206202:2006/06/12(月) 19:06:14
>>204
それはしょうがないんじゃないかと思う。

それはそれとして、
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 }
207デフォルトの名無しさん:2006/06/12(月) 19:23:45
>>191
Hugsだと

Hugs.Base> "あいうえお"
"\12354\12356\12358\12360\12362"

になる。
でもロケールのエンコーディングに変換されるのでUnicode環境じゃないときびしい。
208207:2006/06/12(月) 19:24:48
>>191
×でもロケールのエンコーディングに変換されるので
○でも入出力時にロケールのエンコーディングに変換されるので
209デフォルトの名無しさん:2006/06/12(月) 19:31:47
>Unicode環境じゃないときびしい。
なんで?どこでも使えるためのlocaleだと思うんだが。
210デフォルトの名無しさん:2006/06/12(月) 22:31:09
>>207
WinHugsだと

Hugs> "あいうえお"
"\642554146"

になる。
どう見てもバグ。
211デフォルトの名無しさん:2006/06/12(月) 22:55:58
>>210
WinHugs付属のhugs.exeだと

Hugs> "あいうえお"
"\130\160\130\162\130\164\130\166\130\168"

だったり。

lengthに関してはどっちも

Hugs> length "あいうえお"
10

まぁ、putStrで表示してくれるからとりあえずは使える。(GHCみたく構文解析レベルではねられるよりはマシ)

Hugs> putStr "あいうえお"
あいうえお
212デフォルトの名無しさん:2006/06/13(火) 03:56:09
Linux

Hugs.Base> putStr "あいうえお"
あいうえお
Hugs.Base> length "あいうえお"
5
Hugs.Base> "あいうえお"
"\12354\12356\12358\12360\12362"
213デフォルトの名無しさん:2006/06/13(火) 07:31:40
haskellのメッキは剥がれるのか?
214デフォルトの名無しさん:2006/06/13(火) 10:29:52
sampou.org のデータがふっとんだんだね。
日本の Haskell の普及に貢献したことは忘れない。合掌。
215デフォルトの名無しさん:2006/06/13(火) 14:13:11
仕様変更がある内はHaskellで
仕様確定して仕上げる時に、速くしたい部分をC++で
って感じで構築すればおk?
216デフォルトの名無しさん:2006/06/13(火) 23:55:48
>>214
一部wget -mしたもの持ってるけどなにか役に立つかな?
217デフォルトの名無しさん:2006/06/14(水) 01:50:17
>>205
OSMのやつ?
タイトルが気になったから、立ち読みして来た。

けど、私にはつまんなかった。
何が言いたいのか、わからんかった。
218デフォルトの名無しさん:2006/06/14(水) 12:12:35
多相的な関数について、型変数が特定のクラスのインスタンスであるかどうかによって
実装を切替えることってGHC拡張の範囲でできる?
219デフォルトの名無しさん:2006/06/14(水) 12:23:41
>>218
たとえば、どんな風なことをしたい?
220デフォルトの名無しさん:2006/06/14(水) 13:03:13
普段は線形探索だけど、Ordのインスタンスに対しては二分探索を使う、とか。

-- 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を呼ぶ ...


でも実装を考えてみたら渡すべき辞書がないから無理だな。
どっちにしてもレスありがとう。
221デフォルトの名無しさん:2006/06/14(水) 13:06:26
コンパイル時切り替えなら、
C++風の、特殊化とtype traitsで出来るんじゃないか?
222デフォルトの名無しさん:2006/06/14(水) 13:28:47
>>221
型クラスは実行時解決だからな。
型クラスで書いてると、ときどき全部Template Haskellで書き直したくなる。
223デフォルトの名無しさん:2006/06/14(水) 19:02:39
Template Haskell良さそうね。
型や宣言を書き換えられない([d||]の中に$()が書けない)のがアレだけど。
224デフォルトの名無しさん:2006/06/14(水) 22:16:14
すみませんが、質問です。
無名関数を演算子的に中置記法で使うことは出来ないのでしょうか?

*Main> 2 `(x y -> x + y)` 3
<interactive>:1: parse error on input `('
225デフォルトの名無しさん:2006/06/14(水) 22:21:49
>>224
バッククォートで囲めるのは単一のトークンだけ。
226224:2006/06/14(水) 22:23:23
おお、そんな制約が。
では出来ないのですね。ありがとうございました。
227デフォルトの名無しさん:2006/06/14(水) 22:44:08
the Reportじっくり追えば分かるね。
228デフォルトの名無しさん:2006/06/15(木) 08:18:12
>>223
>型や宣言を書き換えられない([d||]の中に$()が書けない)のがアレだけど。
$(..)が書けないのは型宣言だけかと? 宣言に対して [|d hoge = $(...)|] は書けるっぽい。
確かに[d| data S = $(...) |]は無理。
229デフォルトの名無しさん:2006/06/15(木) 11:17:44
  ┏┳┳┓              ┏┳┳┓
┏┫┃┃┃ スレ違い雑談は┃┃┃┣┓
┃┃┃┃┣┓   ここまで.┏┫┃┃┃┃
┃      ┃┃┏━━━┓┃┃      ┃
┃スレ違い ┣┫ ・∀・ ┣┫  END ┃
┗━━━━┛┗┳━┳┛┗━━━━┛
            ┏┻┓┃
        ┏━┛  ┣┻┓
        ┗━━━┫  ┗━┓
                ┗━━━┛
230デフォルトの名無しさん: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
231デフォルトの名無しさん:2006/06/15(木) 12:42:54
>>230
(.)は一引数の関数しか合成できない。
232デフォルトの名無しさん:2006/06/15(木) 12:44:30
>>230
ttp://www.sampou.org/haskell/tutorial-j/functions.html
この辺でも見て、カリー化を勉強するとよろし
一応curry (bar.uncurry foo) 5 2でなんとかなる
233230:2006/06/15(木) 13:07:17
>>231-232
ありがとうございます。やさしい(not Easy but Gentle)Haskell入門を読んでみます。
しかし、
    http://www.shido.info/hs/haskell3.html
    6.3. 関数の合成
    . は関数を合成します。 
    foo $ hoge x y ⇔ (foo . hoge) x y
このページは間違っているようですね。うーん。
234デフォルトの名無しさん:2006/06/15(木) 13:11:23
報告しといた。
235デフォルトの名無しさん:2006/06/15(木) 13:18:40
>>230
(.) :: (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)はその許された幅からも逸脱しちゃってるよ、とエラーメッセージを出している。
236デフォルトの名無しさん:2006/06/15(木) 13:25:49
>>232
curry, uncurryを使わなくても、 (bar .) . foo でOK。
ちなみに、fooが3引数だと、 ((bar .) .) . foo でOK。
237232:2006/06/15(木) 15:15:22
>>236
勉強になった
238デフォルトの名無しさん:2006/06/15(木) 15:52:18
な、なんだっ(ry
239デフォルトの名無しさん:2006/06/15(木) 20:10:31
$ってなに?
240デフォルトの名無しさん:2006/06/15(木) 20:30:36
>>239
関数適用演算子。
f $ x = f x
右結合で優先順位0の演算子なので、括弧を省略するのに使える。例えば、
length $ filter null $ lines str
は、
length (filter null (lines str))
と同じ。
241デフォルトの名無しさん:2006/06/15(木) 22:07:32
論理学での記述でいうドットかな。
242デフォルトの名無しさん:2006/06/16(金) 08:09:40
Template Haskellの話題がスレ違いだとはorz

あと 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と間違える可能性がなくはない。 $ (...)とする。
243デフォルトの名無しさん:2006/06/16(金) 08:32:50
>>242
勉強になった
244デフォルトの名無しさん:2006/06/16(金) 10:14:53
ジュンク堂池袋本店、ふつケルと入門Haskellが並んで平積み、は
いいのだが……

POPに描かれている「はすケロ」なる、蛙と思われるキャラの絵は何だ。
245デフォルトの名無しさん:2006/06/16(金) 14:10:26
プリミティブですみませんが、質問です。

my_length [] = 0
my_length (x:xs) = 1 + my_length xs

ここで、x:xs が()で囲われなければならないのはなぜでしょう?

私は「:」演算子が関数適用より優先順位が低いからだと思っていたのですが、
どうも違うような気がしてきました。

そもそも「:」はデータコンストラクタだということで、「ふつケル」の7章と
9章を見てみたのですが、()についての記述は見つかりませんでした。
246デフォルトの名無しさん:2006/06/16(金) 14:56:32
>>244はすケロタンの画像きぼんぬ
247デフォルトの名無しさん:2006/06/16(金) 15:13:18
>私は「:」演算子が関数適用より優先順位が低いからだと思っていたのですが、
その理解で良いと思う。
構文的には、そこに書けるのはapat (atomic patternかな)だけだから、ということになる。
http://haskell.org/onlinereport/syntax-iso.html
248245:2006/06/16(金) 15:20:27
>>247
なるほど!ありがとうございます。
演算子の優先順位の問題なら、()の代わりに$が使えるはずだと思っていたの
ですが、それはエラーになってしまったので、間違いだったかと思い始めまし
た。
そうではなくて、パターンマッチに$が許されないからだったのですね。
249デフォルトの名無しさん:2006/06/16(金) 15:23:38
>>242
関数は小文字から始めることになっているから問題ない。
Dataという関数はありえない。
250デフォルトの名無しさん:2006/06/16(金) 15:25:35
>249
型コンストラクタ
251250:2006/06/16(金) 15:29:21
間違えた。
データコンストラクタだな
252249:2006/06/16(金) 15:55:07
データコンストラクタを(.)で繋ぐことってないような
 Data.hoge  =>  モジュール
 data.hoge  =>  関数合成
 Data hoge  =>  データコンストラクタ
でいいのでは?
253デフォルトの名無しさん:2006/06/16(金) 16:01:21
普通に繋ぐよ
254デフォルトの名無しさん:2006/06/16(金) 16:03:08
>>252
>データコンストラクタを(.)で繋ぐことってないような
ふつうにあると思うが。
map (Just . length) ["foo", "bar", "xzzzy"]
==> [Just 3, Just 3, Just 5]
255249:2006/06/16(金) 16:36:50
俺が無知だった<(_ _)>
256デフォルトの名無しさん:2006/06/16(金) 17:11:47
高校生のムチムチの太股
257デフォルトの名無しさん:2006/06/16(金) 21:27:10
関数言語のプログラムをCにコンバートすることってできないかな?
258デフォルトの名無しさん:2006/06/16(金) 21:28:47
>>257
ghcはまさにそれをやってる訳だが。
259デフォルトの名無しさん:2006/06/16(金) 22:28:46
>>257
chicken はまさにそれをやってる訳だが。
260デフォルトの名無しさん:2006/06/16(金) 22:31:50
C言語のプログラムをHaskellにコンバートすることってできないかな?
261デフォルトの名無しさん:2006/06/16(金) 23:04:17
ドストエフスキーの小説をHaskellにコンバー(ry
262デフォルトの名無しさん:2006/06/17(土) 00:32:53
プルーストの『失われた時を求めて』を遅延評価で圧縮する事って出来ないかな?
263デフォルトの名無しさん:2006/06/17(土) 01:09:38
>>258
そうなん?
264デフォルトの名無しさん:2006/06/17(土) 01:10:55
>>258
ほんとだ!
ghcのディレクトリみたら、gcc入ってた。つか、mingw
265デフォルトの名無しさん:2006/06/17(土) 08:05:11
ghcは普通、ネイティブコンパイラを使って一足飛びにバイナリを吐いてるんだよね?
-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

266デフォルトの名無しさん:2006/06/17(土) 08:06:52
まあでも直観的にはネイティブコンパイラのほうが、
スタック等の細かい所を弄れて早そうな感じがするね。

gcc経由したほうが早くなるのは何故なんだぜ?
267デフォルトの名無しさん:2006/06/17(土) 08:52:28
factorize 1000000000001
[73,137,99990001]

みたいに素因数分解する関数を作り、
1== length (factorize 1000000000001)
を入力すると
素因数分解するだけなのと同様な時間を要するようです。
73と137はすぐ見つかり、遅延評価により即表示されるので、
137が見つかった時点で終了して
False
となってくれる事を期待したのですが、わざわざ最後の素因数まで探してるようです。

lengthがリストの最後に行くまで値を返さないから
ボトルネックになっているという認識で良いですか?
268デフォルトの名無しさん:2006/06/17(土) 08:56:01
ハスケルさんがコンパイラ作成のプロではないからじゃね?
269デフォルトの名無しさん:2006/06/17(土) 09:20:09
>>267
そうね。
p [] = False
p [x] = True
p (x:y:xs) = False
こんな感じで。
270デフォルトの名無しさん:2006/06/17(土) 09:56:13
>>269
あり^^
271デフォルトの名無しさん:2006/06/17(土) 10:25:31
というか
素因数分解で結果のリストが一つの要素ってつまり素数の事だから
p n = [n]==(factorize n)

の方が適してましたね
272デフォルトの名無しさん:2006/06/17(土) 14:48:28
Int値が内部でChurch numeralとかで表現されてたら
>>267の期待通りになるかもしれないが、32or64bitで
表現されてる以上、strictに計算してみないと比較
できんわな。
273デフォルトの名無しさん:2006/06/17(土) 16:21:51
大発見?

ユニット型()って独立した1つの型として扱われてるけど
たんなる要素数0のタプル型じゃね?
274デフォルトの名無しさん:2006/06/17(土) 17:33:19
http://www.sampou.org/haskell/report-revised-j/exps.html#unit-expression
>ユニット式 () は () 型 (4.1.2 節を見よ)の、 _|_ 以外の唯一の要素である。
>これは無引数タプルとみなすことができる。
275デフォルトの名無しさん:2006/06/17(土) 22:53:24
うむ
常識だったか。
276デフォルトの名無しさん:2006/06/18(日) 20:37:20
Haskellで書いたプログラム(のオブジェクト)をC++でリンクしたいんだけど可能ですか?
スクリプト言語で機能拡張できるソフトがあるじゃないですか、そんな感じで。
277デフォルトの名無しさん:2006/06/18(日) 21:18:00
>>276
FFI か。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.
278デフォルトの名無しさん:2006/06/18(日) 21:53:50
http://www.reid-consulting-uk.ltd.uk/docs/ffi-FFI_Preprocessors.html#SECTION00042000000000000000
にあるが、便利なツールが何もないから、FFIの仕様を良く読んで頑張ってw
279デフォルトの名無しさん:2006/06/19(月) 18:47:44
>>512
OO厨ってキモイよ
ここ見るとそれがよく分かる
ttp://b.hatena.ne.jp/entry/http://blogs.itmedia.co.jp/tamaki/2006/06/post_57ab.html
280276:2006/06/19(月) 21:10:29
ありがとう>>277-278
これはいばらの道だ。
いきなりHaskellで0から書き直そうなんて
言えないのですよ
281デフォルトの名無しさん:2006/06/19(月) 21:50:07
単にforeign exportするだけなら何も難しいことはないと思うが。
282デフォルトの名無しさん:2006/06/19(月) 21:59:04
283デフォルトの名無しさん:2006/06/19(月) 22:13:46
284デフォルトの名無しさん:2006/06/19(月) 23:16:11
スタイルは逆であるべきじゃないの?
C++で作成したモジュールをHaskellにエクスポートするって方向で

Haskellで作って高速化したい細部をC/C++でとかじゃないの?
285デフォルトの名無しさん:2006/06/19(月) 23:27:30
勝手に決めるな。
286デフォルトの名無しさん:2006/06/19(月) 23:58:13
>Haskellで作って高速化したい細部をC/C++でとかじゃないの?
実際やろうとすると難しい
俺には絵に描いた餅のように思える
287デフォルトの名無しさん:2006/06/21(水) 07:34:20
>>232-236 を見て逆に bar を先にしたいときに
((. bar) . foo . bar) って書けるんだなと思ったが
さすがにこれは (\x y -> foo (bar x) (bar y)) って
書いたほうが可読性的にいいか。
288デフォルトの名無しさん:2006/06/21(水) 09:07:03
>((. bar) . foo . bar) って書けるんだなと思ったが

更に変形して ( . foo . bar ) ( . bar ) とすればfoo,barの出現順序が \ x y -> foo (bar x) (bar y) と同じになる。
もっと変形すれば ( . ( . foo)) ( . bar ) ( . bar ) と書けて、 . の数がそれぞれの引数の数に対応する。

ただ、そんな変形するよりも素直に foo (bar x) (bar y) と書いた方が可読性も良いし、リダクション数も少ない。
289デフォルトの名無しさん:2006/06/22(木) 02:31:23
書籍の話。

このスレッドでは『入門Haskell』の評価があまり高くなかったけれど、
私はとてもいい本だと思った。とにかく面白かった。
もうLISPの時代じゃない、Haskellならこんなにエレガントに書けるんだ、という
主張が横溢していて、Schemeしか知らなかった私の目のウロコを吹き飛ばした。
しかし、モナドで挫折。ぜんぜん分からない。

『ふつうのHaskell』も読んでみた。『入門』よりずっとやさしく、これなら
LISPを知らなくても読めそう。しかしレイアウトルールや遅延評価、部分適用な
んかについてはずっと詳しく丁寧に説明されている。するする読めるぞ。
しかし、モナドで挫折。やはりぜんぜん分からない。

…まあ、継続やYコンビネータも、分かるのにホント、時間かかったから、モナドも諦めずに取り組むしかないか。

ということで、同じこれらの書籍の読者の皆さま、いかがお過ごしでしょうか?
何とかモナドは征服されましたか?

先達の皆さま、やはりここから先は、↓に取り組むしかないのでしょうか?
http://www.sampou.org/haskell/a-a-monads/html/
290デフォルトの名無しさん:2006/06/22(木) 02:48:17
>>289
>>33は?最初の方しか読んでないけど、最初の方はわかりやすい。
291289:2006/06/22(木) 02:58:36
>>290
ありがとう。あれは出てすぐに全部読んだ。
確かに分かりやすいけれど、今思うと、モナドの中の、IOモナドだけの説明だと思う。
つうか、説明じゃなくて比喩。
だからMaybeモナドやリストモナド、Stateモナドまでを統一的には理解できそうにない。
292デフォルトの名無しさん:2006/06/22(木) 05:44:01
型 m a の構造が
・Maybe … a に値Nothingを加えた型
・State … s -> (s, a)
・Cont … (a -> r) -> r
・List … [a]
のように様々な構造をしている。これらはそれぞれ なんらかの「計算」を表すと見なせる。例えば:
・Maybe … 「失敗した」という意味のNothingを含むように拡張した型
・State … 「前の状態」をもらって、計算結果と次の状態の対を返す計算
・Cont … 「継続」(a ->r) をもらって、答えの型rの値を返す計算
・List … リストのどれもが値であるような、非決定的な計算。非決定性オートマトンの状態を思い浮かべると近いか
293デフォルトの名無しさん: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
294デフォルトの名無しさん:2006/06/22(木) 06:05:44
Listの>>=の説明、「リスト[[b]]が得られるので、concatで[b]に潰す。の間違い」

でっす。
上の説明でよくわからない所は遠慮なく聞いて欲しいっす。
295デフォルトの名無しさん:2006/06/22(木) 06:10:19
mの構造に関わらず、「2つの計算を組み合わせて新しい計算を作る関数」が
m a -> (a -> m b) -> m b
という型で表せる、という所が美しいんです。

又、これがちょうど do 構文のような手続き的な書き方にもマッチしているのも面白い。
296デフォルトの名無しさん:2006/06/22(木) 07:48:54
2つの計算を組み合わせて新しい計算を作る美しい関数 = .

. :: (a->b) -> (b->c) -> (a->c)

297デフォルトの名無しさん:2006/06/22(木) 07:58:56
>>289
モナドを理解するには、よく使う二・三種類のモナドに十分に(普段のコーディングで使えるくらい)
慣れるのが一番早いと思う。というわけで教科書より実践を勧める。
多くの人にとってOrdクラスが難しくないのは整数や文字列の比較に親しんでいるからであって、
全順序集合の諸性質について特に勉強したわけじゃないだろう。

この順番はHaskellを使う上での重要度にも対応する。IOモナドの使い方を知らなければ
まともなプログラムを書けるかさえ怪しいが、モナドとは何かを知らなかったところで
多少設計の幅が狭まるだけだ。

とりあえずの理解としては、>>292のようにm a型の値を「計算」と捉えるとか、あるいは「範囲式([1..9]とか
['a'..'z']とか)の多重定義のためにEnumクラスがあるように、do式の多重定義のためにMonadクラスがある」
というのでいいんじゃないだろうか。
298デフォルトの名無しさん:2006/06/22(木) 09:12:36
いまだに Lisp, Lisp と言ってるヤツが可哀想に見えたきた。
299デフォルトの名無しさん:2006/06/22(木) 09:40:19
どっちも好き
300デフォルトの名無しさん:2006/06/22(木) 10:58:12
HaskellよりLispの方が最強だろ。
柔軟性においてこれに勝る言語はない。
301デフォルトの名無しさん:2006/06/22(木) 12:08:45
まあな
302289:2006/06/22(木) 14:24:28
おお、ノマドについて、丁寧で親切な説明が、こんなに!
例を並べて、それらに統一的な説明をもらったせいか、今までで一番分かった
気がするよ。心から感謝します。

結局ノマドというのは、二つ以上の計算を組み合わせる時の、汎用的、統一的
な方法ということなんだろう。
いろんな計算の組み合わせを、すべてノマドという様式で統一的に扱うように
したら、パワフルでエレガントで、見通しが利くようになった。その計算の内
容自体は、リストモナドみたいに簡単なものもあるし、そうでなくて難しいも
のもあるけど、様式はすべて同じ。

『入門Haskell』にはいろんなモナドが載っているけれど、どうも計算内容自
体が難しくて、ついていけなかった。これからしばらくは、内容よりも様式に
注目して、様式がどのように共通しているか、共通化されてどのように嬉しい
のか、一つ一つ考え直してみようと思う。

では、ありがとうございました。
303デフォルトの名無しさん:2006/06/22(木) 15:02:00
ノマド?釣りなのか。
まあでもこの説明(>>292-295)で分かってもらえたんだったら、
これを広めればHaskellももっと認知されるな。
304デフォルトの名無しさん:2006/06/22(木) 15:04:04
>様式がどのように共通しているか、共通化されてどのように嬉しいのか、
モナド変換子とか foldMとかrepeatMとかかな?
あとは手当たり次第に、
Monad m => ... という型シグネチャを持ってる関数や型クラスを全部当たってみれば自ずと分かるな。
305デフォルトの名無しさん:2006/06/22(木) 15:05:56
>>300
>柔軟性においてこれに勝る言語はない。
そのとおりだけど、それが何か?
306デフォルトの名無しさん:2006/06/22(木) 15:13:38
Haskellは柔軟性を求めてないのでは?
307デフォルトの名無しさん:2006/06/22(木) 15:13:57
まあいいんじゃないの?
静的型チェックがない言語なんて放っとけばいいじゃん。
308デフォルトの名無しさん:2006/06/22(木) 15:17:25
静的型チェックがないおかげでLispのほうが優れている。
309デフォルトの名無しさん:2006/06/22(木) 15:49:48
>>308
優れているというなら実例をいくつかあげてもらえるかな。
310289:2006/06/22(木) 16:02:28
×ノマド → ○モナド
すげえ。書いてるときは、この間違いに全然気づいてなかった。
遊牧民が何で関係あるんだ。
あまりの低能ぶりに自分でもびっくり。
311デフォルトの名無しさん:2006/06/22(木) 16:36:45
>>309
一旦数値を入れた変数に文字列入れることが簡単に出来るんだぜw
ほれ。

(setq a 1)
(setq a "string")


え?そんな副作用は汚いし避けるべきだって?
本当にそうかい?w
Lispなら2行で簡単に終わり。
既存のコードを修正することもない。
モナドのように仕様が肥大化することもないのさ。

新しい型を作るって?構造体使うって?
そんなことしなくてもLispなら2行で簡単に終わり。
既存のコードを修正することもないw
312デフォルトの名無しさん:2006/06/22(木) 16:47:10
HQ9+なんかもっとすごいぜ!

H

これで"Hello, world!"が出るんだ。たった一文字だぜ!
短かさにおいてこれに勝る言語はない。
313デフォルトの名無しさん:2006/06/22(木) 16:49:58
「グリーンスパンの第10法則」のグリーンスパン先生も、「Common Lispには
ML風の型推論が欲しい、いっそ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
314デフォルトの名無しさん:2006/06/22(木) 17:23:06
そうやって、型にこだわるところから柔軟性が失われ、仕様の肥大化へと
悪魔の道へ突入していく。
315デフォルトの名無しさん:2006/06/22(木) 17:59:56
>>309
(replace '+ 'print func) ;;funcの中の+演算をprint関数に変える
みたいなことができてしまう。
funcのソースコードを動的にいじっているのも凄いし、
+とprintなんて引数の型とか全然違うのに置き換えられるのも凄い。
316デフォルトの名無しさん:2006/06/22(木) 18:04:45
柔軟性柔軟性って、Lisperは酢かソフランでも飲んでろ。

317デフォルトの名無しさん:2006/06/22(木) 18:07:25
>>315
「凄い」を「危ない」に置き換えて読めと言っているようにしか見えない。

>>311
>モナドのように仕様が肥大化
モナド知ってて書いてるのかこいつ。。。加えてSICPにも載ってるside effect bugをもう一度読み直してみれ。
簡単なのは良いことだし,emacsのような動的に拡張できたほうが気持ちが良い環境というのもあるけれど,
型が無いことは最早モダンなプログラミング言語のメリットに数えることは難しい。
318デフォルトの名無しさん:2006/06/22(木) 18:09:01
>>314
柔軟性をわざとなくしてるんだよ?
319デフォルトの名無しさん:2006/06/22(木) 18:10:01
>>311
モナドは言語仕様ではありません。
320デフォルトの名無しさん:2006/06/22(木) 18:10:57
>>311はどうやら知識が足りないみたいだから、議論にはならないな。
321デフォルトの名無しさん:2006/06/22(木) 18:13:29
Haskellでプログラムを書けば,型のおかげでランタイムエラーがないことを (ほぼ) 保証できる。
特に純粋関数型部分なら,パターンマッチの漏れが無ければ,ランタイムエラーが「起こらない」。
(メモリのオーバーフローや,再帰が止まらない可能性はある)
Lispにそれができるのかな?
322321:2006/06/22(木) 18:15:18
あ,0除算とかも防げないか。当たり前だけど。
323デフォルトの名無しさん:2006/06/22(木) 18:26:59
柔軟であることは強力だが、それは諸刃の剣であり
人間が間違いを犯す余地を増やす。
Lisp は確かに柔軟であるが、使いこなすには
間違いを犯さない注意深く優秀な人間でなければいけない。
そのようなものにとっては Lisp は Haskell より優れているだろう。
しかし煽りだか釣りだかネタだかよくわからない>>311のようなバカには
Lisp は奨められない。Haskell にしとけ。
324デフォルトの名無しさん:2006/06/22(木) 18:34:35
テスト駆動開発隆盛の現在、その危なさも問題じゃないということが
わかってきてるんだよ。
時代が進むにつれてLispが有利になる。まだ時代はLispに追いついていないんだよ。
325デフォルトの名無しさん:2006/06/22(木) 18:38:30
lisperも流石にC++やJavaをコキおろす時のようにはいかないと思う。

>時代が進むにつれてLispが有利になる。
ガベコレや継続がまだ余り知られていなかった時代じゃあるまいし。
Lispに型システムさえあればねえ。。。

機械によるプログラムの安全性の保証が必要になる分野はこれから沢山出てくると思われる。
そんな所にLispが使われていたら俺は嫌だ。せめてJavaにしてくれ。

テストではバグがないことは示せないが、型ならある種のバグの不在が証明できる。
326デフォルトの名無しさん:2006/06/22(木) 18:40:25
まあそのうちわかるよ。機械による安全性の保証をするにも型が邪魔だってことがね。
時代が証明するだろうw
327デフォルトの名無しさん:2006/06/22(木) 18:40:52
>>324
> テスト駆動開発隆盛の現在、その危なさも問題じゃない

いやそれは危ないのが現実になってしまっても、
バグ頑張って取るから大丈夫ですって言ってるだけだろ。
328デフォルトの名無しさん:2006/06/22(木) 18:41:46
バグ頑張って取らなきゃいけない時点で負けなんだよ。
329デフォルトの名無しさん:2006/06/22(木) 18:43:04
>機械による安全性の保証をするにも型が邪魔だ
完 全 に 誤 解 で す 。
330デフォルトの名無しさん:2006/06/22(木) 18:44:20
誤解というより無知なんだろうな
331デフォルトの名無しさん:2006/06/22(木) 18:47:18
もうやめようよ。
基礎知識がないみたいだから、説明するにも基礎から説明しないといけなくなる。
332デフォルトの名無しさん:2006/06/22(木) 18:49:13
なんか便乗されてるw あんまり無知無知言ってやるなw
333デフォルトの名無しさん:2006/06/22(木) 18:51:00
わかるよ。
Haskellは数学を使っているし、最新の研究を盛り込んだ学術的な言語、
だからHaskellは凄いに違いない、マンセー!
そういう奴もあらわれるわな。
そういう雰囲気を持った言語だよ。Haskellってのは。
だから、Fortoranの次ぐらいに古いLispなんかに劣ってるとは信じられない、
相手が無知なんだ!そう思う気持もね。
その先入観はわかるw
334デフォルトの名無しさん:2006/06/22(木) 18:54:40
Hoare理論も計算モデルも意味論も型が入ったとたんに難しくなるw
型のせいで理論が肥大化するんだよ。
335デフォルトの名無しさん:2006/06/22(木) 18:54:52
>>331
そうだね。妄想も激しいみたいだしね。
336デフォルトの名無しさん:2006/06/22(木) 18:55:09
と言うか、ネタキャラを演じて、玄人ばかりだったらやらないような、
初心者向けのテーマの議論を盛り上げようとしてくれているんだろうけれど、
ちょっとうまくかみ合わなくて、痛々しい感じがして、そこがつらいよな。
337デフォルトの名無しさん:2006/06/22(木) 18:57:18
>>336
普通にLisp信者ですが何か?w
Lispに劣ってるHaskellなんかが威張ってるのが気に食わなくてね。
338デフォルトの名無しさん:2006/06/22(木) 19:02:42
マイナーなほうが幸せな面もあるよ。
339デフォルトの名無しさん:2006/06/22(木) 19:02:57
個人的には、ここでlisplisp言ってる人にぜひ、Haskellじゃなくていいから、OCamlとかCleanをやると良いと思う。
単に雰囲気だけじゃなく、利点があるわけで。
触りもせずに批判するのは怠慢。
全ての言語はLispに収束すると無批判に信じるのは無能。

というか、言語のどれが最強というのがそもそも意味がないんだけど。

>だから、Fortoranの次ぐらいに古いLispなんかに劣ってるとは信じられない、
ええ、Haskell にも、LispどころかJavascriptにさえ劣っている部分がありますよ。型があるってことです。
もちろん、Lispより優れている部分もあります。型があることと、遅延評価がある事です。
340デフォルトの名無しさん:2006/06/22(木) 19:05:23
ん,Lispに遅延評価ってないんだっけ。マクロがあるからcall-by-nameはできるか。
341デフォルトの名無しさん:2006/06/22(木) 19:21:20
lisp信者じゃないけどその程度の認識でlispを批判するのもどうかと
342デフォルトの名無しさん:2006/06/22(木) 19:29:26
Lisperだからってevalなよ。
343デフォルトの名無しさん:2006/06/22(木) 19:29:45
Haskell屋の気に入らないところは、さんざん型を崇め奉る癖に、
自分のコードには型宣言をほとんど書かないこと。
型が仕様だというなら、推論させずに自分でちゃんと書け!
そうすればSystem F並の記述力も得られるだろが
344デフォルトの名無しさん:2006/06/22(木) 19:33:45
いやむしろLisperだからevalしか能がない。
345デフォルトの名無しさん:2006/06/22(木) 19:39:30
遅延評価はHaskellのはるか前からLispで実現してた
346デフォルトの名無しさん:2006/06/22(木) 19:39:52
>>340
マクロとは別に、delay-forceって構文があるんだけど、とにかく煩雑になりがち。
何から何まで手動でやらなきゃならない。

Haskellの遅延評価、グラフ簡約を知ったときには、LISPがHaskellの30年前に
生まれた言語だということを痛感した。
347デフォルトの名無しさん:2006/06/22(木) 20:24:10
たかがdelay-forceで大げさな。
OCamlだってそうじゃねえか。
大抵はlambdaやマクロでこと足りるしな。
348デフォルトの名無しさん:2006/06/22(木) 20:29:39
形無し言語逝ってよし
349デフォルトの名無しさん:2006/06/22(木) 20:34:19
何も考えず定義を書き下せば、それなりに効率よく実行されるのは、一度味わうと結構オイシイよ。
ビバ遅延評価。まあ遅延評価じゃない方が良かったという意見はどっか上の方でもあったけど、
何度も言われているけど様は「向き不向き」でそ。

もちろん効率ばかり気にするCモンキーな人々には遅延評価はオススメできない。
350デフォルトの名無しさん:2006/06/22(木) 20:39:30
議論に便乗して論点に関係ない意見を垂れ流すのはやめれw
351デフォルトの名無しさん:2006/06/22(木) 20:53:42
>>325
> そんな所にLispが使われていたら俺は嫌だ。せめてJavaにしてくれ。

Javaの型は明らかに崩壊しているので、アレなら無い方が記述力が上がって
便利なのではないかという気がするぞ…
352デフォルトの名無しさん:2006/06/22(木) 21:05:51
別に論点ずれてないし。HaskellよりもLispのほうが優れている、とかいう厨なおじさんが居るから
遅延評価のお陰でスッキリ書けるHaskellもいいぞ、と言ってるんだけど。それも釣りなのか。
353デフォルトの名無しさん:2006/06/22(木) 21:11:06
>>352
>343
354デフォルトの名無しさん:2006/06/22(木) 21:15:59
>>343は、それはそれで気になる。
というかどうでもいいLisperよりもずっと気になる。

System F並の記述力って何? よく知らないので詳細きぼん。
System Fが多相型のシステムだというのは調べれば分かるんだけど。どれくらいリッチなのか。
355デフォルトの名無しさん:2006/06/22(木) 21:27:32
>>339
>ええ、Haskell にも、LispどころかJavascriptにさえ劣っている部分がありますよ。

お前、Javascriptをなめんなよ?
356デフォルトの名無しさん:2006/06/22(木) 21:28:55
javascriptが優れてるのはよーく分かってるから。
357デフォルトの名無しさん:2006/06/22(木) 21:31:30
Lisp>JavaScript>Haskell
Haskell厨は身の程をわきまえろよ。
358デフォルトの名無しさん:2006/06/22(木) 21:32:43
VBはどこに入りますか?
359デフォルトの名無しさん:2006/06/22(木) 21:34:41
Lisp>JavaScript>VB=Haskell
この辺。
360デフォルトの名無しさん:2006/06/22(木) 21:36:50
Haskellって大規模なデータをちょっとづつ変更しようとしたら、丸ごと変更しなくちゃいけない
ところがどうしようもなく糞。
361デフォルトの名無しさん:2006/06/22(木) 21:37:41
豊富なライブラリと簡単な開発環境、日本語ドキュメントがそろうと
Haskellの開発効率最強でしょうか。
362デフォルトの名無しさん:2006/06/22(木) 21:38:04
Lispが最強。
363デフォルトの名無しさん:2006/06/22(木) 21:42:03
>>361
Haskellは開発環境を作るという点ではあまり向いていないかも。
便利な開発環境というのは、リアルタイムでソースを解析する必要があるけど、
ああいう複雑な構文は解析するのも一苦労じゃないかな。
JavaやC#の方が向いている。

Lispも向いているんだけど、最近誰も使ってないから、emacs以外は進化した環境が
あんまりないね。
364デフォルトの名無しさん:2006/06/22(木) 21:47:18
Haskellの構文は複雑か?
Haddockはパーザを持ってるわけだし,パッケージLanguage.Haskellとかも使えんかな。
とりあえずVisual Haskellとeclipsefpに期待。

Lispの開発環境にはアレグロ何とかがあるけど、この話をすると何とかさんが湧いてくるのでやめとく。
365デフォルトの名無しさん:2006/06/22(木) 21:49:17
まあ、Haskellを使いたいと思ってない人にわざわざ説明してやる気もないんだけど。。。
366デフォルトの名無しさん:2006/06/22(木) 21:49:48
二つともeclipseJDTに比べたらウンコだね。
367デフォルトの名無しさん:2006/06/22(木) 21:50:03
どうでもいいけど日本語扱いたいよ。
文字コード変換ライブラリとかどっかに転がってないかな。
368デフォルトの名無しさん:2006/06/22(木) 21:52:14
>>366
あれは全言語含めた全開発環境中でトップクラスと言っても過言ではないでしょ。
NetBeansでJavaもいいけど。
開発環境ではJavaや.NETが一歩も二歩もリードしてる。
369デフォルトの名無しさん:2006/06/22(木) 21:52:49
>>367
haskellerなら英語で書きなよ。
370デフォルトの名無しさん:2006/06/22(木) 21:55:31
javaが優れてるわけじゃなくてユーザーが多いからだけどね。
371デフォルトの名無しさん:2006/06/22(木) 21:58:58
>>368
また年季の入ったLisperやSmalltalkerに喧嘩売るような発言を…
372デフォルトの名無しさん:2006/06/22(木) 22:00:11
どっちも型ないし、このスレのスタンス的には喧嘩売る方向で。
373デフォルトの名無しさん:2006/06/22(木) 22:02:41
静的型付けがあった方がいいとか、何十年も前から言われ続けてるのに
結局静的型付けがない言語が生き延びてる。
それどころか、AjaxやPythonなどのブームで勢いを取り戻し始めている。
374デフォルトの名無しさん:2006/06/22(木) 22:03:32
20年後、HaskellとLispのどちらが生き延びているかといったら、
Lispだろうなw
375デフォルトの名無しさん:2006/06/22(木) 22:05:54
その分優れたな静的型付けの言語が現れていることでしょう。
ずっと変わらないのはLispだけ。
376デフォルトの名無しさん:2006/06/22(木) 22:12:18
Ajaxがブームなのは、ブラウザ周りの文字列からの型変換(シリアライズ/デシリアライズ)に関して明確な仕様も実装もないため。
また、HTTPが文字列ベースのプロトコルだから。
つまりIEその他のブラウザがクソで、wwwサーバやその仕様にも進歩がないから。

IEがユーザからの入力を型の付いた形で扱えていれば、それを操作するスクリプト言語も静的型付けのものを用いるのが妥当になる。
wwwサーバがCGIを呼び出す時点で型が付いた値を渡していれば、それを扱うwebアプリも静的型が付いた型安全な言語で良くなる。
全部レガシーのせい。もしくはwebの研究者とプログラミング言語の研究者がサボっているせい。

...等と言ってみる。
377デフォルトの名無しさん:2006/06/22(木) 22:15:29
なんでも人のせいにするな、と親に言われなかったか?
378デフォルトの名無しさん:2006/06/22(木) 22:15:46
>>375
Lispは時代のはるか先を行く言語だからな。
どこぞの言語がLispのガーベッジコレクションや遅延評価などを真似したりして
ちょっとずつ時代が追いついてきてるけどなw
379デフォルトの名無しさん:2006/06/22(木) 22:21:55
それこそ数十年後には、The 型付き言語 みたいなのが現れてるかもしれんな。
それぞれのプロトコルやwebサーバ、OS等も型付き言語を意識した設計がなされる。

なぜLisperがこうした未来を想像できないのか不思議だ。
ガベコレやクロージャが現在の言語でやっと使われているのと同じで、
C#やJavaにも型推論が入る時代が既にそこまで来ているわけで。
380デフォルトの名無しさん:2006/06/22(木) 22:23:42
数十年後には静的型付きという概念は劣勢に追い込まれてるだろうからな。
381デフォルトの名無しさん:2006/06/22(木) 22:24:08
ガベコレが馬鹿にされていた時代があった。
効率は悪いし、そもそもmallocを呼んでfreeを呼ばない馬鹿は居ないと皆が思っていたからだ。
でも今ではガベコレ無しの言語なんて考えられない。

同じように、型や型推論がこの先重要な位置を占める世界を欠片も想像できないとは、おまえら本当にLisperなのか。
382デフォルトの名無しさん:2006/06/22(木) 22:26:49
>>381
答えはこういうことだよ。
静的型付けは*現在*重要な位置を占めている。
現在は動的型付けが馬鹿にされている時代だ。
効率は悪いし、危険だとみなが思っているからだ。
でもそのうち静的型付けの言語なんて考えられなくなる。
383デフォルトの名無しさん:2006/06/22(木) 22:26:57
何度も言われているが、無批判無根拠にLispが至上であると妄信するやつはカス。
もちろんそうじゃないlisperの方が多数派だろうが。
384デフォルトの名無しさん:2006/06/22(木) 22:28:04
>>381もあるかもしれんな。それが答えだとは全く思わんが。
385デフォルトの名無しさん:2006/06/22(木) 22:30:01
Javaを見ろよ。静的静的なんていってたのは最初だけ。
現在はクラスを動的にロードしまくり、Springとかリフレクションバリバリ使って
どこが静的なんだよって感じだ。
今でも兆候は現れてるよ。
386デフォルトの名無しさん:2006/06/22(木) 22:30:32
それwebだけでそ
387デフォルトの名無しさん:2006/06/22(木) 22:31:24
Haskellの話題に戻ってください
388デフォルトの名無しさん:2006/06/22(木) 22:37:33
>現在は動的型付けが馬鹿にされている時代だ。
>効率は悪いし、危険だとみなが思っているからだ。
危険なものと自分で言っているのに、それを今後みんなで使うようになると妄想できる根拠は何だ?
389デフォルトの名無しさん:2006/06/22(木) 22:38:37
動的とかwebとかどうでもいいよ
390デフォルトの名無しさん:2006/06/22(木) 22:39:27
「そんなのはlispのやることでしょ」
391デフォルトの名無しさん: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/
392デフォルトの名無しさん:2006/06/23(金) 00:13:49
関数型と手続き型
http://pc8.2ch.net/test/read.cgi/tech/1145115971/

↑ちょうどいい。このスレでやるか
393デフォルトの名無しさん:2006/06/23(金) 02:42:59
入門HaskellとふつうのHaskellって両方読んだほうが良い?
394デフォルトの名無しさん:2006/06/23(金) 04:05:28
動的型付け言語は、短いプログラムを書くのに適している。
まさに「スクリプト言語」はこれに相当して、
こういうのは逆に静的型付けだと鬱陶しい。

逆に、静的型付け言語は、長いプログラムを書くのに適している。
動的型付け言語で起こるだろう多くのバグを、
コンパイル時に排除できるからだ。

「素晴らしい言語」なんてのは、適用対象が違えば変わっていいわけで、
あるただ一つの言語だけが素晴らしいとか言ってんのは見てらんない。
395デフォルトの名無しさん:2006/06/23(金) 04:20:15
型が無いとfromEnumとかreturnみたいなのが書けなくね?
396デフォルトの名無しさん:2006/06/23(金) 04:20:54
toEnumだた。
397デフォルトの名無しさん:2006/06/23(金) 04:54:35
LispにしろSmalltalkにしろSelfにしろRubyにしろ、間違いなく
タイプセーフなわけで、こいつらを捕まえて型がないと言うのは
大間違いだぞ。CやC++に比べると、はるかにしっかりと型付け
されている。
398デフォルトの名無しさん:2006/06/23(金) 05:54:14
ヒント:静的型と動的型
399デフォルトの名無しさん:2006/06/23(金) 06:11:42
>あるただ一つの言語だけが素晴らしいとか言ってんのは見てらんない。
ここに張り付いてる動的型付け言語の信奉者がまさにそれなんだが。
400デフォルトの名無しさん:2006/06/23(金) 06:14:47
だからこのスレでHaskell以外の話題を引っ張るなと
401デフォルトの名無しさん:2006/06/23(金) 06:20:04
Haskellも短いプログラムを書くのに適している気がするんだが。
簡潔な構文と高階関数のおかげで幾らでも短く書ける。
おまけに型安全だから安心。

スクリプト言語のプログラムも関数型の機能を取り入れて、更に簡潔になる傾向にあるが、
これらには静的型付けもないし型推論もない。

短いプログラムを、何も考えずにさっと書けるのがスクリプト言語。
短いプログラムも、熟練すれば型安全にさっと書けるのが関数型言語。
確かに学習コストは少し高め。
402401:2006/06/23(金) 06:23:40
あ、スクリプト言語じゃなくて動的型付け言語か。
403デフォルトの名無しさん:2006/06/23(金) 09:25:03
>>401
動的型言語が熟練を必要とせず、静的型言語が必要とする理由はあるのか?
ただ、慣れの問題では?
404デフォルトの名無しさん:2006/06/23(金) 10:20:40
熟練≒慣れ

ただ(静的型付けの)関数型言語が動的型付けの言語より学習コストが高い、というのは当たってると思う。
そうじゃなかったらもっとOCamlやHaskellの利用者が増えているだろう。
世の中、動的言語で提供される柔軟性が必要な分野ばかりではないから。

ただ、今流行ってるようなwebプログラミングにはいわゆる「柔軟性」が必要な部分があるのかもしれない。
405デフォルトの名無しさん:2006/06/23(金) 11:09:43
>>393
入門Haskellのほうは読まなくてよい。あれは・・特殊です。
406デフォルトの名無しさん:2006/06/23(金) 12:10:43
>>393

関数型言語になじみがなければ、「ふつう」
>>71-72

Lispなどを少し知ってれば、「入門」
>>289

でも、どっちにしろモナドはわからん
>>302

という事らしいw
407デフォルトの名無しさん:2006/06/23(金) 14:22:22
ふつうは2日で通読できた。
入門はさめがめの章でつまづいて、しばらく放置。
ただ、どちらも読みやすいよ。
その前に Craft of なんたらを読み始めてたけど、
数学の知識のない俺には例題の敷居が高すぎた。
408デフォルトの名無しさん:2006/06/23(金) 16:04:35
分からないのはノマドらしいが…
409デフォルトの名無しさん:2006/06/23(金) 19:06:06
Lispは関数型言語界のC/C++ですね
410デフォルトの名無しさん:2006/06/23(金) 20:28:54
関数型言語の本とかサイトって数学の例ばっかりなのが萎えるんだよね。
お前らそんなに素数とフィボナッチ数列が好きかと。
411デフォルトの名無しさん:2006/06/23(金) 20:29:56
まあ好きだけどな
412デフォルトの名無しさん:2006/06/23(金) 20:31:27
そんな事言っても好きなんだからしょうがないだろ!
413デフォルトの名無しさん:2006/06/23(金) 20:47:50
>>410
分かりやすい例を挙げてるだけでしょ。
414デフォルトの名無しさん:2006/06/23(金) 23:37:36
「ふつう」読了。深みはなかったような気がするけど、Haskellの概要が
わかったのがよかった。

monadと(オブジェクト指向の)メッセージチェーンと似ているのは意外で面白いな。
415デフォルトの名無しさん:2006/06/24(土) 00:51:32
継続とかアクターとか同じ穴の狢だぜ。
416デフォルトの名無しさん:2006/06/24(土) 02:07:33
Visual Haskell インストールしようとしたら最後にエラー出てキャンセルされる…
俺のPCが98だからか?
417デフォルトの名無しさん:2006/06/24(土) 02:08:47
ghciで走らせるのって遅い?
418デフォルトの名無しさん: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とどう関係するのか、結局分かりません
でした。
419デフォルトの名無しさん:2006/06/24(土) 18:28:53
>>418
ヒント: リストもモナド
420418:2006/06/24(土) 18:46:15
>>419
すみません、私はモナドを理解できていないのです。

質問が分かりにくいのかも知れませんので、補足します。
<- は return の逆演算に似ていて、リストモナドなら[a] を a に
戻す働きがあります。
x <- [1]なら、[1]を1に戻し、x を 1 に束縛するのだと思いますが、
x <- [1..10]だと、xに何が起こるのでしょう?
まさか1〜10が同時に束縛されるはずはないし。
421デフォルトの名無しさん:2006/06/24(土) 18:56:04
>>が多すぎると言われたので全角で失礼。

do { 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は無関係。
422デフォルトの名無しさん:2006/06/24(土) 19:05:23
>>420
>x <- [1..10]だと、xに何が起こるのでしょう?
直感的には、次のような感じ。

・まずx=1として後続の計算が行い、この結果をv1とする。この例ではv1 = [1]
・次にx=2として後続の計算を行い、この結果をv2とする。この例ではv2 = []
・以下同様にv3..v10を計算し、すべてを++で結合する。

この操作はconcatMapに他ならない。厳密な定義は>>421参照。
423418:2006/06/24(土) 19:07:11
うわっ、難しい。
ありがとうございます。ちょっと考えてみます。
424421:2006/06/24(土) 19:14:55
>= [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 [()] 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 [])

二回>>=を>>と書いていたのと、括弧の閉じ忘れ。
混乱させてすまん。
425デフォルトの名無しさん:2006/06/24(土) 22:10:41
IUP(Portable User Interface)という軽量のGUIライブラリをGHCから利用したいなと思って、
c2hs(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/
426デフォルトの名無しさん:2006/06/24(土) 22:22:13
別人ですが、似たような疑問を持っていたので面白く読めました。
Listの >>= は 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
規則にあるこれだとは思うのですが・・
ユニット型がなにか特別な意味を持つのですか?
427426:2006/06/24(土) 22:25:11
書いて気づいた。
(return x) >>= f == f x
こっちの方ですね。
>>=がmapなんだから、[]を吐けば以後の計算を殺して[]が返せるのか。
428デフォルトの名無しさん:2006/06/25(日) 05:44:33
>>425
動かしてないけど、少なくともHaskellのコールバックを呼ぶ可能性のある関数はunsafeで呼んじゃいけないと思う。
429デフォルトの名無しさん:2006/06/25(日) 08:22:20
IupMainLoopへのcallフックのunsafeを外したら動いた。
430425:2006/06/25(日) 08:45:27
>>428-429

ありがとうございます。確かにunsafeを外したら動きました。

きちんと理解せずにunsafeを付けていました。
単に副作用のある関数を呼ぶときにunsafeを付けるのだと思ってました。
431デフォルトの名無しさん:2006/06/25(日) 16:27:15
ghcでコンパイルしたバイナリってDLLとかに依存せず動く?
432デフォルトの名無しさん:2006/06/25(日) 19:43:17
動きません
433デフォルトの名無しさん:2006/06/25(日) 21:48:57
配布時に何がいるの?
434デフォルトの名無しさん:2006/06/25(日) 21:52:25
恐怖と絶望
435デフォルトの名無しさん:2006/06/25(日) 21:54:04
windows以外だとlibgmpに依存。
これ以外ではシステムの標準的なdllにしか依存しないと思う。
436425:2006/06/26(月) 13:35:36
IUPが一応動くようになったんでIUPのラッパー部分だけ切り分けてライブラリにしてしまおうと思ったのですが、
ghc -cで生成された.oファイルたちをarでまとめて
IUPの必要なライブラリとともにld -r -whole-archiveでghci用の.oファイルを作ったのですが、
ghciで実行しようとするとunknown symbol `_CoInitializeEx'が出てしまい動かせませんでした。
なので、前回実行ファイルを作るときにリンクしてたole32とかのライブラリを追加してみたら
今度はUnknown PEi386 section name `.idata$4'となって駄目でした。
どうしたらいいんでしょう?
437デフォルトの名無しさん:2006/06/26(月) 15:47:48
入門Haskellの最後の最後の練習問題(Base64のデコード)だけがどうしても解けません。
mixi内で色々教えてもらったのですが。ぶっちゃけ何がわからんかすらわからなくなってしまいました。
もう諦めモードで検索する気も起きないです。

答え教えてください。
438437:2006/06/26(月) 15:50:24
ごめん。ありえないことに書いたとたんメール来て答えわかった。
すまそ。
439デフォルトの名無しさん:2006/06/26(月) 15:55:52
あっそ
440デフォルトの名無しさん:2006/06/26(月) 17:59:29
>>438
良かったね。二度とくんな
441デフォルトの名無しさん:2006/06/27(火) 22:44:57
ココに書けとは言わないから
答えをどッかに見えるところに
還元すれ
442デフォルトの名無しさん:2006/06/27(火) 23:18:43
>>441
mixi内のHaskellコミュ。
443デフォルトの名無しさん:2006/06/28(水) 14:20:48
型構築子でメモリがないときは例外があがりますか?
444デフォルトの名無しさん:2006/06/28(水) 15:14:14
>>443
GHCだとメモリ不足は問答無用で強制終了。

ところで、「型構築子でメモリがないとき」ってなんだ?
データ構築子の間違いか?
445デフォルトの名無しさん:2006/06/28(水) 20:01:00
>>444
メモリ不足が勝手に死んでたら、Haskell ではまともなアプリは書けないな。
致命的な言語設計だな。
446デフォルトの名無しさん:2006/06/28(水) 20:35:17
WindowsやLinuxでしか使わんなら、おかしな処理をしていない限りメモリ不足にはならないんじゃね?
447デフォルトの名無しさん:2006/06/28(水) 23:34:15
言語設計の問題ではありません :)
448デフォルトの名無しさん:2006/06/28(水) 23:41:06
JavaではきちんとOutOfMemoryが言語仕様として定義されてるけどね。
449デフォルトの名無しさん:2006/06/28(水) 23:45:17
そもそもそんな実用バリバリの言語と比較されてもね。
450デフォルトの名無しさん:2006/06/29(木) 00:06:19
要は言語設計者の好みだな
451デフォルトの名無しさん:2006/06/29(木) 00:14:55
VMごと丸々扱えるJavaと一緒にされてもね。
452デフォルトの名無しさん:2006/06/29(木) 00:50:55
>>447
各種実装の問題だな
453デフォルトの名無しさん:2006/06/29(木) 03:10:15
Javaにトラウマがある奴が少なくないなw
そんなレベルの奴らじゃあこれも上達せずに放り投げるのだろうな。
454デフォルトの名無しさん:2006/06/29(木) 06:43:33
Javaは初心者用の言語なのに・・・何言ってんだろ。ドカタ仕事多いし。
455デフォルトの名無しさん:2006/06/29(木) 18:32:56
>>452
JavaではきちんとOutOfMemoryが言語仕様として定義されてるけどね。
456デフォルトの名無しさん:2006/06/29(木) 18:42:00
そもそもそんな実用バリバリの言語と比較されてもね。
457デフォルトの名無しさん:2006/06/29(木) 19:35:55
要は言語設計者の好みだな
458デフォルトの名無しさん:2006/06/29(木) 20:14:31
VMごと丸々扱えるJavaと一緒にされてもね。
459デフォルトの名無しさん:2006/06/29(木) 20:53:57
各種実装の問題だな
460デフォルトの名無しさん:2006/06/29(木) 20:59:25
Javaにトラウマがある奴が少なくないなw
そんなレベルの奴らじゃあこれも上達せずに放り投げるのだろうな。
461デフォルトの名無しさん:2006/06/29(木) 21:47:34
>>455
それ言語仕様って言うの?
462デフォルトの名無しさん:2006/06/29(木) 22:04:08
Javaは初心者用の言語なのに・・・何言ってんだろ。ドカタ仕事多いし。
463デフォルトの名無しさん:2006/06/29(木) 22:11:10
>>459
JavaではきちんとOutOfMemoryが言語仕様として定義されてるけどね。
464デフォルトの名無しさん:2006/06/29(木) 23:14:21
>>445
じゃあ、getLine なんか使ってるプログラムに長い行を入力すると落ちるのか。
実験してみようとしたけど、落ちる前にスラッシングでハードディスクが
心配になり小心ゆえに実験を継続できない。
なにはともあれ、しぶといことは分かった。
465デフォルトの名無しさん:2006/06/30(金) 00:08:28
>>448-463
しょうがないなぁ。突っ込んでやるよ。


再 帰 か よ !!
466デフォルトの名無しさん:2006/07/01(土) 00:10:21
467デフォルトの名無しさん:2006/07/01(土) 00:12:34
こちとら慈善事業で、とか言われた
468デフォルトの名無しさん:2006/07/01(土) 00:15:44
はすケロだた。
jpgのうしろに .htmlをつけて
ダウンロード をクリックすれ。
469デフォルトの名無しさん:2006/07/01(土) 01:08:34
>>468
萌フォルダとgagフォルダのどっちに入れるか正直悩んだぞ
470デフォルトの名無しさん:2006/07/02(日) 09:42:31
人間が肉食動物に喰われてる写真とか、平気?
目が完全に逝っちゃってますが・・・。
http://up.mugitya.com/img/Lv.1_up42411.jpg
471デフォルトの名無しさん:2006/07/02(日) 12:29:54
 lVV,- 、  , - 、
 l ( ● 'ー' ● )
 ! /  -―- 、 ヽ
 | l '⌒l   l⌒' .l
 ヘ 〃, { ̄} ,〃
   /   ̄ ̄  ヽ
472デフォルトの名無しさん:2006/07/02(日) 18:52:57
>>470
馬鹿野郎!
すれ違いもいい加減にしやがれ

#でもnukoフォルダに入れた。うきゃー
473デフォルトの名無しさん:2006/07/03(月) 00:41:50
>>471
うは。
さすが2ch
AAになるとは思わなかった
474425:2006/07/03(月) 12:36:15
またコールバック関連で問題が発生しました。
Cのヘッダではコールバック関数の型は
typedef struct Ihandle_ Ihandle;
typedef int (*Icallback)(Ihandle*);
と定義されているので FunPtr (Ptr () -> IO CInt) のような型に読み替えられるわけですが、
実際に登録されるコールバック関数はIhandle*以外にも引数を取るようなものだらけだったりします。

この場合、コールバック関数の型ごとにラッパーを用意してやるしかないのでしょうか?
475425:2006/07/03(月) 14:51:05
よく考えたらString<->CStringの変換とかもあったりするから個別に書いてやらないと駄目ですね。orz
476デフォルトの名無しさん: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()の違いは、関数呼び出しが一段余計に行われ
ていることだけのような気がします。

こういう場合、クロージャであることには重要性はないのでしょうか?もし重
要性があるならその理由を、重要性がないなら、どういう場合にクロージャが
重要なのか、さわりだけでもお教えいただけたら幸いです。
477デフォルトの名無しさん:2006/07/06(木) 13:52:14
>>476
その場合は2が定数だからadd2をクロージャ無しで書けるけど、
実行時に決まる値を使いたい場合はそうはいかない。
478476:2006/07/06(木) 14:48:14
>>477
ありがとうございます。
何か学術的な答えを予想していたので、ちょっとびっくりしました。
例えば、クロージャがないとYコンビネータが書けない、とか、言語仕様で
○○を実現するために必要、とか。

すると、値が実行時に決まる場合のみ、クロージャには意味があるのでしょうか?
定義時に決まる場合、クロージャである必要はないのでしょうか?
479デフォルトの名無しさん:2006/07/06(木) 18:33:13
そもそもJavaScriptってクロージャないの?
ありそうな気がするが……。
480デフォルトの名無しさん:2006/07/06(木) 19:04:37
Javascriptにはクロージャあるよ。
481デフォルトの名無しさん:2006/07/06(木) 19:27:20
>>476
俺もそれの必要性が理解出来てない一人。
add2 y = add 2 y
で良い気がする。
しかも
div x y = x / y
half x = div x 2
と同じことが出来ないと思うし。
482デフォルトの名無しさん:2006/07/06(木) 19:39:25
>>481
add_x y = add x y
483デフォルトの名無しさん:2006/07/06(木) 19:52:20
>>482
なんとなく分かったような。
その場合、yを束縛した関数が帰ってくる?
逆にxだけ縛る方法ってあるの?
484デフォルトの名無しさん:2006/07/06(木) 19:53:04
>>481
>>476が問うているのはクロージャの必要性。
お前が言っているのはカリー化の必要性。

カリー化はクロージャと違って無くてもそれほど記述力が失われる訳じゃないだろ。
Haskellにカリー化があるのは、便利なのと、型システムや文法が単純化されるからだと思う。
485484:2006/07/06(木) 19:54:25
ごめん、読み違えた。
忘れてくれ。
486デフォルトの名無しさん:2006/07/06(木) 19:59:33
>>482
あ、もしかしてadd_y xで良い?
487デフォルトの名無しさん:2006/07/06(木) 20:00:33
>>483
違う。xだけ束縛している。
例えば、リストの全ての要素にnを加算するなら、
addAll n list = map (add n) list
と書ける。このとき、addの第一引数はnに固定されている。

yだけ束縛したいなら、
add_y x = add x y
または、無名関数を使って
\x -> add x y
で良い。
488デフォルトの名無しさん:2006/07/06(木) 21:09:05
逆じゃないか?
489487:2006/07/07(金) 06:29:39
>>488
俺に言ってるのか?
逆ってどこが?
490デフォルトの名無しさん:2006/07/07(金) 09:26:14
>>476
「重要」って言葉を選んでいるのはどうしてなの?
「何でそんな仕組みが必要なの?」への答えは、
「〜は重要である」でなければいけないの?

実は>>476の文章とは裏腹に、
「絶対に必要な理由」を求めようとしている気がする。
>>478にそれが透けて見える。
491486:2006/07/07(金) 11:36:07
add_y xとか引数の名前変えても無駄だった。
方法は見つけたけど、引数の順番を変えた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))
492486:2006/07/07(金) 11:38:45
↑の場合、halfはyを2で束縛したdiviと言って良い?
493デフォルトの名無しさん:2006/07/07(金) 12:08:48
>>491
まず、何をしたいのかはっきりさせてくれ。
単に二で割る関数を書きたいなら、
half x = divi x 2
で良いし、2に限らず一般のmで割りたいなら
divm m = f
  where
    f x = divi x m
とすれば良い(カリー化を使えばもっと簡単になる)。
部分適用だけを使ってhalfを定義したいというなら、それは無理。
494デフォルトの名無しさん:2006/07/07(金) 12:18:54
>>491
half=flip (/) 2
495デフォルトの名無しさん:2006/07/07(金) 12:20:38
おまえら発言を省略しすぎ。
もっとくどく書け。
496486:2006/07/07(金) 12:40:57
いや、>>481-487の流れがあるから、
わざわざ言わなくても良いと思ったんだけど。
別に割る関数が欲しいんじゃなくて、
途中又は最後の引数に対してカリー化したいという話。

diviが複雑な関数だったら、ということ。

で、無理ですか。ちょっと残念だけどサンクス。
497デフォルトの名無しさん:2006/07/07(金) 12:54:46
ごめんなさい、例が悪かった。あれじゃ
half 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))


498476:2006/07/07(金) 12:56:29
>>490
> 実は>>476の文章とは裏腹に、
> 「絶対に必要な理由」を求めようとしている気がする。

うわあ、大正解です。
例えば、モナドもクロージャで実装されていると聞いたことがありまして(う
ろ覚え)、クロージャがHaskellにとって本質的に必要なのではないかと予想
していたのです。

>>476は、それを考えるきっかけではありましたが、本当に知りたいこととは
少しずれています。
499486:2006/07/07(金) 13:05:58
余計おかしくなってしまったのでorz
>>487の例で書きます。

--こんな感じで書きたい。n(割る数)を固定する
diviAll n list = map (divi ? n) list
500デフォルトの名無しさん:2006/07/07(金) 13:16:44
>>499
そのままでは無理だけど、
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
というスタイルが書きやすいかな。
501デフォルトの名無しさん:2006/07/07(金) 13:21:44
>>500
> diviAll n list = map (`divi` n) list

今回はdivi = (/)なわけだから、
diviAll n list = map (/ n) list
でOK。

実際、(/ 2) 4 = 2.0だし。
502486:2006/07/07(金) 13:46:05
そういえば演算子も2引数の関数なんでしたね。
こういう使い方は知らなかったんで、勉強になった。

-- 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引数の場合は、これが一番スマートですね

503デフォルトの名無しさん:2006/07/07(金) 14:30:47
>>502
3番目だけ違ってる。
(/) 2 10 = 2 / 10
504デフォルトの名無しさん:2006/07/09(日) 23:49:13
なにもしないmainを書くいちばん簡潔な方法はどんなものでしょうか?
空文字列をputStrなどはナシで。
505デフォルトの名無しさん:2006/07/09(日) 23:55:39
>>504
main = return ()
506504:2006/07/10(月) 00:03:24
>>505
できました。ありがとうございます。

ところで、main = IO () では駄目なんでしょうか?
Not in scope: data constructor `IO' だそうです。
507デフォルトの名無しさん:2006/07/10(月) 00:24:08
IOは型構築子であって、データ構築子ではないからね。
508504:2006/07/10(月) 01:04:53
ありがとうございます >507
IO型のデータ構築子について知るには、どこを見ればよいでしょう??

509デフォルトの名無しさん:2006/07/10(月) 01:21:35
せめてテンプレのサイトぐらい読んでから質問しろと
510デフォルトの名無しさん:2006/07/10(月) 04:22:18
>>508
IO aは抽象型であって、データ構築子は公開されていない。
代わりにデータ構築用の関数(return, (>>=), putChar, putStr, ...)が
公開されているから、それを使う。
511504:2006/07/10(月) 06:37:28
ありがとうございます >510
IO型のデータ構築用の関数について知るには、どこを見ればよいでしょう??
512デフォルトの名無しさん:2006/07/10(月) 07:45:34
>IO型のデータ構築用の関数について知るには、どこを見ればよいでしょう??
一覧が欲しいってこと?IO動作を返す関数なんていくらでも書けるし、
Cの関数を自由にforeign importできるから完全な一覧はありえないけど、
Haskell98の範囲なら、Prelude, Monad, IO, Directory, Systemあたりのライブラリを
調べればいいんじゃないだろうか。
これらのライブラリの仕様はHaskell Reportに載ってる。
513デフォルトの名無しさん:2006/07/10(月) 08:17:43
>512は世界一優しい男
514デフォルトの名無しさん:2006/07/10(月) 08:18:48
べ、別にあんたのためにレスしたんじゃないんですからねっ!
515あかさ:2006/07/10(月) 08:55:59
cかぁ. . .
516デフォルトの名無しさん:2006/07/13(木) 15:02:18
可変個の引数ってとれないの?
ということはprintf的なものも無理?
517デフォルトの名無しさん:2006/07/13(木) 15:17:18
リストを取ったら?
518517:2006/07/13(木) 15:19:05
あ、それだと同じ型の値しか取れないか。
脊椎反射レススマソ。
519デフォルトの名無しさん:2006/07/13(木) 15:23:06
>>516
基本的には無理。ただし型クラスを駆使して実現できる場合もある。(Text.Printf参照)
他にも、Template Haskellでコンパイル時にフォーマット引数を解釈したり、
C++みたいに二項演算子で妥協することもできる。
520デフォルトの名無しさん:2006/07/13(木) 20:27:03
521デフォルトの名無しさん:2006/07/14(金) 04:51:14
本家メーリングリストにときどきoleg氏が投下しているような
型クラスのコードを読めるようになりたいんだけど、このあたりの挙動について
参考になる文書か何かweb上にある?
522デフォルトの名無しさん:2006/07/14(金) 13:49:50
ghcで
add = (+) の型が
Integer -> Integer -> Integer
となるのですが、 (+)の型が、
(Num a) => a -> a -> a
なのにどうしてでしょうか。
523デフォルトの名無しさん:2006/07/14(金) 13:53:19
そういう特別な規則がある。
単相性限定
http://www.sampou.org/haskell/tutorial-j/pitfalls.html#sect12.3
524デフォルトの名無しさん:2006/07/14(金) 14:49:13
なお、コマンドラインオプション -fno-monomorphism-restriction を付けるか
η展開形 add x y = (+) x y で定義すると add :: (Num a) => a -> a -> a になるよ。
525516:2006/07/14(金) 21:07:10
>>519
http://www.haskell.org/ghc/docs/latest/html/libraries/base/Text-Printf.html
これか、ありがとう
引数を左から巻き取っていくわけか すごい
C++の<<ならできそうと思っていたが、これも同じような仕組みでできるんだな
526デフォルトの名無しさん:2006/07/15(土) 13:56:27
今年も始まりました。
9th Annual ICFP Programming Contest
http://icfpcontest.org/
じゃあ、よろしく。
527デフォルトの名無しさん:2006/07/17(月) 05:27:30
オフサイドラインw
528デフォルトの名無しさん:2006/07/19(水) 23:56:05
一気に寂れたなw
本が発売された前後だけかw
529デフォルトの名無しさん:2006/07/20(木) 10:07:46
すみませんが、質問です。タプルの使い方が良く分かりません。

タプルは、LISPの多値に対応するものだと思うのですが、ある関数の戻り値が
タプルの場合、それを受け取れる関数は、引数がタプルである必要があります
(よね?)。多引数の関数に汎用的に与えることはできません。2つ組みのタ
プルの場合だけは、curryとuncurryがありますが。

ということで、多値の代用としてのタプルの使い方の定石のようなものがあっ
たら、教えていただきたいのです。

ちなみにPythonにもタプルがありますが、こちらは、関数に複数の引数を与え
る代わりに、タプルを与えることができます。* という演算子があって、
a = (1, 2, 3)
(lambda x y z: x + y + z)(*a) => 6
という書き方ができます。
再代入のできる手続き型言語とは、だいぶ事情は違うのでしょうが。
530529:2006/07/20(木) 10:09:55
訂正
(lambda x, y, z: x + y + z)(*a) => 6
引数のカンマが抜けていました。まあPythonの話ですが。
531デフォルトの名無しさん:2006/07/20(木) 11:13:24
タプルはリストやLispのconsセルとは全く違うものです。
任意のnに対してn-タプルを受け取る関数、といったものは定義できません。
どうしてもそういうのが欲しいのならTemplateで「n-タプルのi番目の要素を取ってくる」
みたいなのをコンパイル時に生成するとか、タプルでなくともHeterogeneousなリストが
使いたいだけならType Classを駆使するとか、方法はなくはない。

ときに、実装内部はともかく、Haskellに「多引数の関数」は存在しないので誤解なきよう。
532529: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になっている。」
という言葉が目に留まりました。

ちょっと考えたのですが、ある組み合わせのタプルを返す関数を書くなら、同
じ組み合わせのタプルを受け取る関数も書くのが普通、という理解でよいでしょ
うか?
533デフォルトの名無しさん:2006/07/20(木) 14:48:59
>>532
>ちょっと考えたのですが、ある組み合わせのタプルを返す関数を書くなら、
>同じ組み合わせのタプルを受け取る関数も書くのが普通、という理解でよいでしょうか?

受け取る関数がないならタプルを返す関数はそもそも必要とされないと思う。
もし受け取る関数がないのに必要とされるならばそれは副作用がメインで、
おまけでタプルが返ってくるような場合なんではなかろうか。
534デフォルトの名無しさん:2006/07/20(木) 15:06:25
>>529
タプルがそれ自身で意味を持つ場合、引数もタプルで取ることがある。例えば、
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)みたいに書けるようにするなどすれば良いと思う。

>再代入のできる手続き型言語とは、だいぶ事情は違うのでしょうが。
どちらかというと型システムとか構文糖に対する態度とかの問題じゃないだろうか。
535デフォルトの名無しさん:2006/07/20(木) 15:17:17
>>533
>受け取る関数がないならタプルを返す関数はそもそも必要とされないと思う。
そんなことはないだろ。例えばsplitAtの結果のタプルをそのまま別の関数に渡すことは滅多にないと思うが。
536デフォルトの名無しさん:2006/07/20(木) 15:25:20
>>535
splitAtの結果をfstとかsndとかパターンマッチで分解するでしょ。
この場合fstやsndとかパターンマッチがタプルを受け取る関数ですよ。
fstもsndもタプルのパターンマッチも使わない状況でタプルを返されたとしたら、
それは基本的に必要のないタプルなんだと思うけど。
537デフォルトの名無しさん:2006/07/20(木) 15:40:26
>>536
そういうことか。分かった。

しかし、>>529の文脈
>、ある関数の戻り値が
>タプルの場合、それを受け取れる関数は、引数がタプルである必要があります
>(よね?)。
からして、たぶん>>532が言いたいのは、
「ある組合せのタプルを返す関数があったとして、その関数の結果を引数として受け取る関数を書くとき、
その関数を(カリー化された形ではなく)タプルをそのまま受け取るように書くのが普通だ、という理解で良いか?」
だと思う。
538デフォルトの名無しさん:2006/07/20(木) 16:41:51
uncurryテンプレート書いてみた。

uncurryT :: 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)
539529:2006/07/22(土) 11:05:19
すみません、多忙に付きご返事ができませんでした。皆さんのレスはとても勉
強になりました。ありがとうございます。

標準のHaskellではまだタプルを扱う標準的な方法は無いようなので、私はと
りあえず、必要に応じてuncurry3, uncurry4, ... を作って使うことにします。

>>537 私の意図については、おっしゃるとおりです。私の拙い言葉を補ってい
ただき、大変恐縮です。

>>538 すばらしい!これでuncurryをn個作らなくても良くなるのですね。まだ
私には理解できませんが。
540デフォルトの名無しさん:2006/07/22(土) 11:36:59
バッカスのFP懐かしす
541デフォルトの名無しさん:2006/07/22(土) 17:08:11
Mastering Algorithms with Haskell
まだー
542デフォルトの名無しさん:2006/07/23(日) 03:08:13
letとガードを同時に使うことはできないのでしょうか?
関数の内容は無意味ですが、例えば
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
ならいけましたが、見栄えが悪いです。
543デフォルトの名無しさん:2006/07/23(日) 03:21:11
>>542
where使えばすっきりする。

f x
 | x == 1 = y
 | otherwise = 0
 where
  y = x + 1
544デフォルトの名無しさん:2006/07/23(日) 23:49:52
ありがとうございました
545デフォルトの名無しさん:2006/07/25(火) 17:00:40
HugsでC++なFFIってできる?
546デフォルトの名無しさん:2006/07/25(火) 17:11:49
extern "C" すれば
547デフォルトの名無しさん:2006/07/26(水) 22:21:50
ふつうのHaskellに出てきた、Parsecにハマり中。
最初はよくわからないから、とにかくParserが返す型に注意して、
do 構文も多用しておっかなびっくりコーディングしてたけど、
だんだん慣れてくると、解析したい構文が簡潔明瞭にコードで表現できる
ようになってくる。
これマスターすれば、正規表現がいらなくなりそう。
(今はまだ、正規表現のほうが早く書けるけど)
548デフォルトの名無しさん:2006/07/26(水) 22:42:30
ParsecはLL(1)なので、正規表現以上の解析ができるよ。
549デフォルトの名無しさん:2006/07/26(水) 23:20:06
表現力では勝るけど、簡潔さにおいては劣るだろ。
550デフォルトの名無しさん:2006/07/26(水) 23:43:58
で?
551デフォルトの名無しさん:2006/07/27(木) 00:04:48
ParsecはLL(1)なので、正規表現以上の解析ができるよ。
552デフォルトの名無しさん:2006/07/27(木) 00:05:33
表現力では勝るけど、簡潔さにおいては劣るだろ。
553デフォルトの名無しさん:2006/07/27(木) 00:13:50
ふつうのHaskellに出てきた、Parsecにハマり中。
最初はよくわからないから、とにかくParserが返す型に注意して、
do 構文も多用しておっかなびっくりコーディングしてたけど、
だんだん慣れてくると、解析したい構文が簡潔明瞭にコードで表現できる
ようになってくる。
これマスターすれば、正規表現がいらなくなりそう。
(今はまだ、正規表現のほうが早く書けるけど)
554デフォルトの名無しさん:2006/07/27(木) 00:19:35
ParsecはLL(1)なので、正規表現以上の解析ができるよ。
555デフォルトの名無しさん:2006/07/27(木) 00:31:33
表現力では勝るけど、簡潔さにおいては劣るだろ。
556デフォルトの名無しさん:2006/07/27(木) 01:25:28
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。


C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
557デフォルトの名無しさん:2006/07/27(木) 05:12:18
ParsecはLL(1)なので、正規表現以上の解析ができるよ。
558デフォルトの名無しさん:2006/07/27(木) 05:26:56
try演算子があるからLL(∞)だよ。
559デフォルトの名無しさん:2006/07/27(木) 10:38:51
これからのトレンドはpackrat parsingだよ。
560デフォルトの名無しさん:2006/07/27(木) 15:12:49
メモリ沢山消費しちゃいます(><;)。>packrat parsing
561デフォルトの名無しさん:2006/07/27(木) 23:31:24
構わん。好きなだけ使いたまえ。
562デフォルトの名無しさん:2006/07/28(金) 00:26:15
オバQは絶版ですが何か? > packrat
563デフォルトの名無しさん:2006/07/28(金) 02:14:57
>>555
コンパイラが文法と型チェックしてくれるのが
うれしい。
564デフォルトの名無しさん:2006/07/28(金) 05:11:05
>>563
もちろんそうだが、Parsecが正規表現のように簡潔な記法でない以上、
正規表現が要らなくなることはないと言いたかった。
しかし、コンパイル時にパーサの文字列表現を解釈してParsecパーサに変換することも
Template Haskellを使えばできるんだろうな、たぶん。
565デフォルトの名無しさん:2006/07/28(金) 09:57:14
C++/Boostにはsregexってのがあるな。s=static
566デフォルトの名無しさん:2006/07/31(月) 09:07:40
正規表現≠文脈自由文法
567デフォルトの名無しさん:2006/07/31(月) 18:10:26
新しい話題は?
568デフォルトの名無しさん:2006/07/31(月) 19:14:46
multiprocessor版のstableなghcがなかなかでない(work用sourceはあるけど)のは何故?
未だに正式リリースを出せないくらい難しいの?
569デフォルトの名無しさん:2006/08/04(金) 20:25:14
cygwin上でghc 6.5をコンパイルできた人はいますか?
570425:2006/08/04(金) 21:13:52
軽量GUIライブラリのIUP(Portable User Interface)をHaskell(ghc/ghci)で利用するためのラッパーを書きました。
まだまだ作りかけですけど、ウィンドウを開いたりボタンを付けたりとかはできます。

http://park7.wakwak.com/~blackbox/
571デフォルトの名無しさん:2006/08/04(金) 23:10:18
EmEditorのHaskell用構文ファイル作ったけど誰かいる?
572デフォルトの名無しさん:2006/08/04(金) 23:25:53
>565-571
お前ら……少しは会話しろよw
573デフォルトの名無しさん:2006/08/05(土) 02:16:34
>>571
欲しいです
574デフォルトの名無しさん:2006/08/05(土) 06:12:17
>>571
いるいる!
575デフォルトの名無しさん:2006/08/05(土) 16:46:24
ViViのHaskell用構文ファイル作ったけど誰かいる?
576デフォルトの名無しさん:2006/08/05(土) 18:52:30
EmEditor と ViVi の構文ファイルってインデントと色付けしてくれるん?
577デフォルトの名無しさん:2006/08/05(土) 21:01:08
eclipseのHaskell用構文ファイル作ったけど誰かいる?
578デフォルトの名無しさん:2006/08/05(土) 21:09:25
俺も作ったよ、それ。2年も前に。
579571:2006/08/05(土) 21:15:00
EmEditorのHaskell用構文ファイル

http://aploda.org/dl.php?mode=pass&file_id=0000005126.zip

Preludeで定義されているものは一通り強調表示するはずです。
気に入らないところは適当に直して使ってください。
580デフォルトの名無しさん:2006/08/05(土) 22:17:01
サンクス
581デフォルトの名無しさん:2006/08/05(土) 22:18:10
>577
EclipseFP と比べてどっちが良い?
582デフォルトの名無しさん:2006/08/05(土) 23:12:09
なんだ色付くだけか・・・
583デフォルトの名無しさん:2006/08/06(日) 02:30:07
ttp://href.spiritloose.net/

引きやすくてなかなかよい
584デフォルトの名無しさん:2006/08/06(日) 04:12:44
>>579
もろた
585デフォルトの名無しさん:2006/08/06(日) 23:32:59
>>579
わろた
586デフォルトの名無しさん:2006/08/14(月) 01:43:08
perlのsplitみたいな事をhaskellでやりたいんですけど、
自分で関数を定義するしか無いんでしょうか?
なんか、すごく遅くなりそうなんですが・・・
587デフォルトの名無しさん:2006/08/14(月) 02:26:57
split       :: Char -> String -> [String] 
split _ ""  =  [] 
split c s   =  let (l, s') = break (== c) s 
                 in  l : case s' of 
                           []      -> [] 
                           (_:s'') -> split c s'' 
というコードを拾って自己解決しました。
588デフォルトの名無しさん:2006/08/14(月) 09:50:06
Text.Regex.splitRegex :: Regex -> String -> [String]

使用例
Prelude> Text.Regex.splitRegex (Text.Regex.mkRegex " +") "I am a pen!!"
["I","am","a","pen!!"]

なんてのはhoogleをsplitで検索するだけですぐ出てくるのにあ
589デフォルトの名無しさん:2006/08/14(月) 10:00:12
ツンデレめ
590デフォルトの名無しさん:2006/08/14(月) 11:34:31
あ、そっちの方が便利そうですね。どうもありがとうございまう。
haskell用のgoogle(?)があるんですね。知りませんでした。
591デフォルトの名無しさん:2006/08/19(土) 05:06:26
話題は?
592デフォルトの名無しさん:2006/08/19(土) 06:26:08
諸君議論したまえよ
593デフォルトの名無しさん:2006/08/19(土) 06:27:50
皆さん、結局HASKELLの未来はどのように展開されていくとお考えなのでしょうか。
現場レベルで使われるようになるでしょうか?
正直私はそこが知りたい。
594デフォルトの名無しさん:2006/08/19(土) 06:50:24
もっともっと最適化されて枯れてこないと難しいのでわ?
595デフォルトの名無しさん:2006/08/19(土) 07:33:03
本家のHaskell vs OOPという記事は、
ハスケルにはOOPは必要ないということを言っていますか?
O'Haskellという試みもあったようですが、
既にすたれているようですが、それはやっぱり
HaskellとOOPが馴染まないという事でしょうか?
596デフォルトの名無しさん:2006/08/19(土) 08:02:35
オブジェクトって状態を持つから純粋関数型とはうまく折り合いつかないんじゃない
597デフォルトの名無しさん:2006/08/19(土) 09:23:17
HaskellとOOPってそんなになじまないか?
確かに実装の継承やらダウンキャストやらを実現しようとすると大変だけど
「状態をカプセル化し、同一性がある」型は比較的簡単に書ける(標準のHandleが一例)。
存在型を使えば実行時多相も実現できる。
598デフォルトの名無しさん:2006/08/19(土) 09:30:25
>>596
例えばIOモナドの中で生きるデータはいくらでも状態を持てるんだが。
純粋な関数型ってのは、入出力をする関数にそうでない関数とは
別の型を付けるってだけであって、表現力が変わるわけではないんじゃね?
599デフォルトの名無しさん:2006/08/19(土) 16:10:27
>>595
http://www.haskell.org/haskellwiki/Why_Haskell_matters#Haskell_vs_OOP
これ?「できるけど切り口が違う」って書いてるな
カプセル化:クラスを定義して必要な関数だけエクスポート
多態性:タイプクラスがJavaでいうinterface
継承:一つの型が複数の親を持つことはできるが孫クラスは不可

個人的にはJavaと用語が被ってるのが覚えにくい原因だと思う
600デフォルトの名無しさん:2006/08/20(日) 02:56:32
関数のグルーピングが出来ないって書いてありますよね?
601デフォルトの名無しさん:2006/08/20(日) 11:48:16
情報学板
http://science4.2ch.net/informatics/

名前ちょっと変な気もするけど、一応計算機科学の板が出来たみたい
情シス板ってもともと学問カテゴリなんだから
会社・職業のところにITの板新設してドカタを追い出すのが正統だよな
603デフォルトの名無しさん:2006/08/20(日) 13:42:31
>>602
infosysとinfomaticsは違う板だぞ?
わかってるが、学問カテゴリの板に会社スレが立つ情シスが異常
605デフォルトの名無しさん:2006/08/20(日) 14:23:08
>>600
1. オブジェクト単位でのグループ分けはできない
2. モジュール単位でのグループ分けができる
3. オブジェクト単位でのグループ分けができないのはまったく大した問題ではない。

と言っている。
個人的には、メソッド名がクラススコープなのは便利なので
これは言い過ぎだと思うが。
606デフォルトの名無しさん:2006/08/25(金) 02:07:22
Haskellプログラマのレベル10ってありますか?

Schemeプログラマのレベル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
607デフォルトの名無しさん:2006/08/25(金) 10:00:46
ghcで

instance (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)

は出来ないのかな?仕様を見る限り出来そうな気がするんだけど、なんか間違ってる?
608デフォルトの名無しさん:2006/08/25(金) 10:29:47
>>607
http://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)。
609デフォルトの名無しさん:2006/08/25(金) 10:52:43
>>608
そういうことだったか、ありがとう
610デフォルトの名無しさん:2006/08/30(水) 03:48:46
LL Ring に行けなかったんだけど関数型の話面白かった?
611デフォルトの名無しさん:2006/09/02(土) 16:28:05
Simon Peyton-Jones・Tim Harrisのインタビュー
ttp://channel9.msdn.com/showpost.aspx?postid=231495
612デフォルトの名無しさん:2006/09/03(日) 09:33:41
なんでおまえらそんな物知りなの?
一日中Haskellしてんの?
613デフォルトの名無しさん:2006/09/03(日) 10:07:57
>>612
それは思った。
しかもこの手の言語いじってる奴って大抵メジャーな言語も網羅してるし。
614デフォルトの名無しさん:2006/09/03(日) 12:17:21
もうちょっと最適化が進まないとねぇ…
遅すぎるわ
615デフォルトの名無しさん:2006/09/03(日) 17:15:10
>>614が非効率なコードを書いてるだけの予感
616デフォルトの名無しさん:2006/09/03(日) 17:33:36
で、おまえら一日中Haskellしてんの?
617615:2006/09/03(日) 17:45:25
俺は引きこもってずっとコードを書いてたこともあったけど、
そうじゃない偉い人がいっぱいいる気がする。
618デフォルトの名無しさん:2006/09/03(日) 17:46:34
本物のハッカーはハックをしない
619デフォルトの名無しさん:2006/09/03(日) 18:15:30
本物のハッカーはエロゲをする
620デフォルトの名無しさん:2006/09/03(日) 18:28:25
エロゲをしないハッカーは偽者である。
621デフォルトの名無しさん:2006/09/03(日) 18:58:05
本物のハッカーの家にはフィーナ姫がホームステ(ry
622デフォルトの名無しさん:2006/09/03(日) 19:05:55
>>620
偽なり
623デフォルトの名無しさん:2006/09/05(火) 18:06:51
諸君議論したまえ
624デフォルトの名無しさん:2006/09/05(火) 20:44:42
WinHugsで複数行(5行くらい)のプログラムをファイルに保存せずに実行したいんですが、できますか?
625デフォルトの名無しさん:2006/09/05(火) 22:21:45
普段、個人的な作業をこなすのに、haskellつかってる人いますか。
どんなことに使ってますか。
626デフォルトの名無しさん:2006/09/05(火) 22:24:24
対話環境で電卓
627デフォルトの名無しさん:2006/09/05(火) 22:43:54
正規表現置換だとややこしくなりそうなのをparsec使って処理してみたりとか
628デフォルトの名無しさん:2006/09/05(火) 23:32:45
ハスケルによるコンパイラ作成入門
って本を誰か出版してくれ
629デフォルトの名無しさん:2006/09/05(火) 23:48:27
Hakell で文字処理プログラムであるコンパイラって遅そうだな.
630デフォルトの名無しさん:2006/09/05(火) 23:50:05
コンパイラのボトルネックはそんなところじゃないだろう
631デフォルトの名無しさん:2006/09/06(水) 00:43:22
632デフォルトの名無しさん:2006/09/06(水) 06:56:20
>>631
first class continuationは?
633デフォルトの名無しさん:2006/09/07(木) 07:55:30
Visual Haskellインスコできなかた
634デフォルトの名無しさん:2006/09/07(木) 08:16:24
>>628
コンパイラ技法を勉強するだけなら
別に Haskell じゃなくても、
使う言語はなんでもいいんじゃない。疑似言語でも。
Haskell で Haskell コンパイラの話か?
635デフォルトの名無しさん:2006/09/07(木) 13:23:58
コンパイラ技法の方は知っててHaskellを知らない人のためじゃないか?
そっちの方が人口多そうだ。
636デフォルトの名無しさん:2006/09/07(木) 19:49:32
いわゆるポリモーフィズムみたいなコトをしたいんだけど、

class 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に通用しなくてまいった
637デフォルトの名無しさん:2006/09/07(木) 20:21:21
>>636

たぶん、
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を持っているということが保証される
という感じか。
638デフォルトの名無しさん:2006/09/07(木) 20:56:57
>>637
そうか、じゃあ[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文を書かざるを得なかった時代に逆行してる…
なんとかならんものかな?
639デフォルトの名無しさん:2006/09/07(木) 21:00:56
まちがい
call Cat -> "meow" じゃなかった
call Cat = "meow" だ
640デフォルトの名無しさん:2006/09/07(木) 22:22:24
{-# OPTIONS -fglasgow-exts #-}
module 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) だけで動いてくれれば良いんだけど、型が曖昧だからダメって言われるんだよな。
641デフォルトの名無しさん:2006/09/07(木) 22:26:58
たぶんそういうプログラミングスタイルを取るのが問題なんだと思うが、どう
したらいいのかは具体例に沿って考えないとよくわからん。型の切取り方がう
まくないんだと思うが。


ちなみに、 OCaml では polymorphic variant といって、「拡張可能な data」
みたいなのが簡単に作れる。 Haskell でも HList を使うと polymorphic
variant ができるという話。
ただどっちにしても、型エラーが発生したときは死にそうになる。
642デフォルトの名無しさん:2006/09/07(木) 22:56:22
そもそもクラスの機能の意図が微妙に違うから、多分それができてもどこか別で障害があると思う
Monadius見たら
weapon = missile | shot | laser ...
update missile = ...
update laser = ...

orz
Haskellで綺麗な設計でゲーム作れるんだろうか?
643デフォルトの名無しさん:2006/09/07(木) 23:40:27
>>636
リストに複数の型を押し込めたいのであれば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
644デフォルトの名無しさん:2006/09/07(木) 23:53:18
ついでに
main = mapM_ (putStrLn . (\(AH x f) -> f x))) animals
ですね。
645デフォルトの名無しさん:2006/09/08(金) 00:06:11
>>643
data 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
646デフォルトの名無しさん:2006/09/08(金) 00:06:40
諸君、やっと議論を再会してくれたね。
647デフォルトの名無しさん:2006/09/08(金) 00:24:35
フィーナ姫が月に帰っちゃったから暇になった
648636と638:2006/09/08(金) 01:45:07
>>637-645
凄い、Existentially quantified typesで完全に解決した!感動した!
OCamlやConcurrent Cleanみたいな他の関数型言語を学んでみるのも、
Haskellを使いこなす助けになるみたいだね。そのうちかじってみよう
ついでにmapM_も知ったし、みんなありがと
649デフォルトの名無しさん:2006/09/08(金) 09:23:36
存在量化(existential quantification)を使わない方法。

data 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

クラス階層(哺乳類と動物の関係とか)が必要ないなら、こっちが扱いやすいと思う。
650デフォルトの名無しさん:2006/09/08(金) 22:10:34
>>649
プロトタイプ信者乙
651デフォルトの名無しさん:2006/09/08(金) 23:09:24
>>649
実はそれも考えてたんだけど、dogとsparrowが別の構造を持つと困る。
たとえば、Sparrowは空を飛べるから「飛行高度」みたいなフィールドが必要になったとき、
Animalに追加すると飛べないdogにも追加されてしまって無駄になる。
それが必要なければ649がきっと一番シンプルだよね
652デフォルトの名無しさん:2006/09/09(土) 02:17:20
久しぶりこのスレが有益な情報に染まっている
653デフォルトの名無しさん:2006/09/09(土) 04:10:09
それはない
654デフォルトの名無しさん:2006/09/09(土) 09:13:35
>>651
>>649のAnimalはインタフェースを表現する型であって、
個々の動物の構造を反映するものじゃない。
「飛行高度」のフィールドをAnimalインタフェースを介してのみ
使う(飛行高度によって鳴き声が異なる、とか)なら
sparrow :: Height -> Animal
を用意するだけで十分だし、専用のインタフェースから使いたいなら、
data Sparrow = {- 専用インタフェース -}
sparrowAsAnimal :: Sparrow -> Animal
で良く、いずれにしてもAnimalの変更は必要ない。
ただし、後者の場合は、>>649に書いたように
型クラスを使ったほうが便利かもしれないけど。
655デフォルトの名無しさん:2006/09/10(日) 00:13:09
>コレだとまるでC言語で巨大なswitch文を書かざるを得なかった時代に逆行してる…
一長一短
656デフォルトの名無しさん:2006/09/10(日) 01:14:14
オブジェクトがimmutableで、遅延評価されるから>>654みたいなのでOKなんだよね。
ダウンキャストしたいとかなると大変なんだけど。
657デフォルトの名無しさん:2006/09/10(日) 02:05:38
>>654
本当だ。existential quantificationなしでもうまくいった。
代数的データ型をC++/Javaのクラスみたいなものだと思うのが、俺の勘違いの素みたい。
慎重に書いてけばダウンキャスト(?)も必要なさそうだ。
あぁ、感動のあまりもう手元のコードの大半をexistential quantificationで書き換えてしまった。
もっと落ち着いて、それぞれの方法を検討してみることにするよ。
658デフォルトの名無しさん:2006/09/10(日) 15:35:17
ふつうのHaskellを読み出したアホの子に教えてやってください。
emacsのhakell-modeをインストールして

main = do cs <- getContents
putStr cs

と打って2行目でタブを押すとputStr csの先頭がgetContentsの真下にインデントされるんですが、
正しくはcsの真下ですよね?
手動インデントが激しくメンドクサイのですがなんとかならんでしょうか?
659デフォルトの名無しさん:2006/09/10(日) 15:58:10
>>658
main = do {
cs <-getContents;
putStr cs
}
とすればいいじゃん。
660デフォルトの名無しさん:2006/09/10(日) 16:18:43
>>658
何回か押せば?
661デフォルトの名無しさん:2006/09/10(日) 18:20:19
>>660
Emacsのタブインデントはそういうことじゃない。
662デフォルトの名無しさん:2006/09/10(日) 19:31:46
>>661
python-mode.elやhaskell-mode.elは
タブを押す回数によってインデントのレベルが変る

>>658の場合
getContents のあと改行してタブを押すと getContents までインデントされる
もう一度タブを押すと cs と同じレベル
次は main が補完される
次は一番外
もう一度押すと getContents までインデントされて以下ループ


使ったことないのに何言ってるの??
663デフォルトの名無しさん:2006/09/10(日) 19:58:32
(゚Д゚)ガーン
知らなかった。ありがとう。
664デフォルトの名無しさん:2006/09/10(日) 20:27:26
eclipseのhaskellプラグインないの?
665デフォルトの名無しさん:2006/09/10(日) 21:04:01
666デフォルトの名無しさん:2006/09/10(日) 21:34:42
ありがと
667デフォルトの名無しさん:2006/09/10(日) 22:53:49
>>658,662
この場合、 turn-on-haskell-indent を
実行することに気付いてないんじゃない?

M-x turn-on-haskell-indent か、hookに入れとく。

# ちなみに、turn-on-haskell-simple-indentっていう、段が変わるだけのもある。
668デフォルトの名無しさん:2006/09/10(日) 23:43:08
haskell-mode.elの頭にちゃんと書いてある

;; (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)
669デフォルトの名無しさん:2006/09/12(火) 04:55:12
何が書いてあるのかさっぱりわからない
オレには無理みたいだ
670デフォルトの名無しさん:2006/09/12(火) 05:04:43
EmacsはEmacsHaksellを搭載すべし
671デフォルトの名無しさん:2006/09/12(火) 08:49:41
>>670
なにそのキッチンシンク第二弾
672デフォルトの名無しさん:2006/09/14(木) 22:49:23
Typeableという型クラスがあって、cast :: a->Maybe b というメソッドがある。
これを使えばダウンキャストができる…わけではない。主型はひとつ。
673デフォルトの名無しさん:2006/09/14(木) 22:51:38
であってる?
674デフォルトの名無しさん: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
675sage:2006/09/15(金) 12:29:37
674 って、main を実行するとどう表示されるの? てもとに ghc がなくてわからん。解説きぼんぬ。
676デフォルトの名無しさん:2006/09/15(金) 13:00:37
>>675
"foobar"と出た
concatがString要求してるからfromShowableがShowable->Maybe Stringになるらしい
catMaybesでStringにならなかったやつは消える
結局元々Stringだったのが残る
677デフォルトの名無しさん:2006/09/16(土) 00:58:10
>>676
細かいがStringを要求しているのはputStrLnね
678デフォルトの名無しさん:2006/09/17(日) 15:33:35
data NumberOrString = Number Int | String String

cmp :: (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' ...
と出てきてコンパイルできません。このような関数を定義するにはどうしたらいいんでしょうか?
679デフォルトの名無しさん:2006/09/17(日) 16:21:59
>>678
たぶん、やりたいことと型が合っていない。
その型だと、型変数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の全称量化のされかたが違うことが分かる。
680デフォルトの名無しさん:2006/09/17(日) 17:17:24
お前ら本当は俺って難しそうな言語をやってるんだぜって感じで人に自慢したいだけでHaskellやってんじゃね?
681デフォルトの名無しさん:2006/09/17(日) 18:37:00
>>680
なんか動機とははそれでも良いじゃないと思うオレ
格好からはいるのが悪とは思ってないしモチベーションになればいいかなと

上の会話が理解出来るくらいのレベルになりたいなぁ
たぶん Haskell の理解度と言うよりプログラマとしてある程度のレベルに達してないとダメだろうなぁ
もっと頑張らないと
682デフォルトの名無しさん:2006/09/17(日) 20:07:29
まあHaskellの型の表現力が弱いから、無駄に複雑になってる気もするけどね。

forall a in { Int, String }. ...

と書けるdecidableな型systemがあれば何の問題もなかった。
683デフォルトの名無しさん:2006/09/18(月) 10:20:58
ハスケルなんか糞
684デフォルトの名無しさん:2006/09/18(月) 10:25:06
>>680
だけじゃないけど、正直それもあるw
メジャーなパラダイムや言語は押えておきたいというのが主な理由。
仕事で使うことは無さそうだけど、考え方の幅は広がるだろうから。
685デフォルトの名無しさん:2006/09/18(月) 10:35:16
>>680
おれの場合きちんと大学とかで計算機科学やってないから、
コンプレックスがあるんだよね。Haskell やるより計算機科学の
教科書マジメに読んだほうが早いかもしれないけど、
新しい概念を追いつづけるのは楽しいし格好良いと信じてる。

686デフォルトの名無しさん:2006/09/18(月) 18:00:07
Haskell やるより
計算機科学を学んだほうがいい。
子どものときは大人のアドバイスは聞かないが。
687デフォルトの名無しさん:2006/09/18(月) 20:52:16
>>686
その大人のアドバイスは子供の性質を考慮していないオナニーアドバイスだからだよ。
要するに好奇心旺盛な子供には、Haskellを通じてどうやって計算機科学を教えるかを考えるべきだ。
688デフォルトの名無しさん:2006/09/18(月) 20:57:36
(<|>)

なんかエロい構文
689デフォルトの名無しさん:2006/09/18(月) 21:01:25
好奇心旺盛な子供だったら、
Haskellの勉強を片手間にしつつ
計算機科学の勉強を勝手にHaskellと
関連付けながらしっかりこなせる。

難しいのは、好奇心が半端な子供へのアドバイスだ。

で、それとは別の話で、計算機科学の勉強したいだけなら、
どっかで教科書指定されてるような大きい本を買ってきて
一通り読んで、基本情報処理技術者試験でもうければいいよ。
どうせ基礎教養のようなもんだから、一通り触っておけば十分だろ。
その基礎を完璧に固めるのは結構苦労するけど。
690デフォルトの名無しさん:2006/09/18(月) 21:41:19
おれの場合好奇心は少年並にあるぜ
仕事ばっかで時間がないけど…
SICP みたいな質のたかーいじっくり楽しめるハスケル本希望。
691デフォルトの名無しさん:2006/09/18(月) 22:04:25
まぁそこまで頭良くないからとっかかりとして一つだけでも良いじゃないと思う
人それぞれ何じゃないかなぁ
それ以上言っちゃうと言葉遊びになっちゃうよ
692デフォルトの名無しさん:2006/09/18(月) 22:09:59
> 仕事ばっかで時間がないけど…
これは忘れてた。
暇人じゃないとなると量をこなす必要のある勉強はなかなか難しいよな。
693デフォルトの名無しさん:2006/09/18(月) 22:20:17
>>692
毎日時間決めてやれば問題ない。
俺とかおまえみたいに2chにきてる様じゃ駄目だろうけどな。orz
694デフォルトの名無しさん:2006/09/18(月) 23:51:20
>>693
でも2ch以外にHaskellの情報源なんて無くね?
695デフォルトの名無しさん:2006/09/19(火) 00:19:08
>>694
情報処理学会誌にたまに載る
696デフォルトの名無しさん:2006/09/23(土) 13:12:05
データ(構造)に、ある性質を保証するってどうやるの?
たとえば、必ず昇順になってるリストとか。

普通?の言語だと、操作もコンストラクタも自在だから、
性質を保つ操作だけ提供して、コンストラクタは空か最初にソートすればいい。

でもHaskellだと、データ構築子使って、
性質に違反した値をリテラルみたいに書けちゃうのを禁止できなくない?
697デフォルトの名無しさん:2006/09/23(土) 13:21:51
>>696
ADTじゃだめなの?
698デフォルトの名無しさん:2006/09/23(土) 15:22:41
なるほど。
モジュールで、データ構築子を隠して関数の利用を強制できるのか。
サンクス。
699デフォルトの名無しさん:2006/09/24(日) 21:32:26
haskell入門買ったばっかの素人(一応lispは知ってる)だけど、
haskell ってパーサーの構築に似てるとオモタ。
perl の RecDescent にそっくり。
700デフォルトの名無しさん:2006/09/25(月) 12:09:15
WinHugs-Sep2006が出てた。
アンインストーラがまともに動かんけど。
701デフォルトの名無しさん:2006/09/25(月) 20:01:30
ghc 6.5はまだか
702デフォルトの名無しさん:2006/09/25(月) 20:47:52
ghc の freebsd amd64 対応はまだか
703デフォルトの名無しさん:2006/09/25(月) 21:37:29
ghcのmulti processor対応版のbinaryはまだか
704デフォルトの名無しさん:2006/09/29(金) 12:29:03
>>697
自分でコントロールできる型はいいけど、
クラスのインスタンスが、単に必要なメソッドを提供するだけじゃなくて、
クラスが求める制約を満たす、って出来ないのかな。

モナド則を満たさないでMonadインスタンス作ったらコンパイルエラーとか。

プログラム停止性問題とか絡むのかな?
705デフォルトの名無しさん:2006/09/29(金) 19:13:37
haskel、関数名がキャメルノーテーションなのどうにかしてくれ
どうせソースの見た目が奇妙なんだから関数名も奇妙にしてほしい
706デフォルトの名無しさん:2006/09/29(金) 20:01:22
具体的に何がイヤでどう変えると良いのか一事例でもいいんで教えてくれ。
707デフォルトの名無しさん:2006/09/29(金) 20:35:03
>>705
同感。
下線区切りかハイフン区切りか、せめて全部小文字にして、
CやPerlみたいに短い名前を使ってほしい。

>>706
例えばopenFileはopen_fileかopenfileかfopenにして欲しい。
708デフォルトの名無しさん:2006/09/29(金) 20:41:38
ええー
俺はopenFileが一番好き
709デフォルトの名無しさん:2006/09/29(金) 20:48:39
camelWordの方が読みやすいけどなあ
710デフォルトの名無しさん:2006/09/29(金) 21:03:55
>707
関数名も奇妙に、っていうのはそれでいうとどれ? fopen みたいなのを想定
してたのかな。
おれは openFile の方がいいよ。

CamelCase か下線区切りか、みたいなのはどっちでもいいんだが、短い名前で
省略するよりは冗長な方がずっといい。
711デフォルトの名無しさん:2006/09/29(金) 21:13:30
漏れは APL みたいに記号になっちゃってるのが好き。
712707:2006/09/29(金) 21:16:40
>>710
>関数名も奇妙に、っていうのはそれでいうとどれ?

>>705は俺じゃないから分からん。
713デフォルトの名無しさん:2006/09/29(金) 21:34:05
>>704
例えば↓みたいなのがモナド則を満たすかどうかをチェックできないと駄目なわけだよね。

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は一応満たすんだけどまじめに評価すると止まらない。
714705:2006/09/29(金) 22:41:39
例えばfoldとかzipWithとか使用頻度高いのに普通すぎ、かつ短いのに分かりにくい名前だと思う
fold は->((/)) とか激しい記号にしてほしい
715デフォルトの名無しさん:2006/09/29(金) 22:43:08
高階関数はschemeなんかと同じほうがわかりやすい
716デフォルトの名無しさん:2006/09/29(金) 22:54:17
むぜえええええええええええええええええ!!!!
717デフォルトの名無しさん:2006/09/29(金) 23:16:58
fold とか zip がわかりづらいという感性がわからん
714の記号は何を意味していてどこがわかりやすいのかな。
718デフォルトの名無しさん:2006/09/29(金) 23:34:32
foldは(| a, h |)のようなdistfix operatorだったら良かった。
719デフォルトの名無しさん:2006/09/30(土) 02:03:36
>>714
親切丁寧なライブラリがあった方が嬉しい。
720デフォルトの名無しさん:2006/09/30(土) 03:03:41
>>716
標準語でOK
721デフォルトの名無しさん:2006/09/30(土) 14:19:24
>>714とか見ると、>>680も宜なるかな、と思わざるを得ない。

ところで、みんなは、日本語どうしてるの?
722デフォルトの名無しさん:2006/09/30(土) 14:26:18
UTF-8を10進リテラルで埋め込んでる。
723デフォルトの名無しさん:2006/09/30(土) 14:46:40
UCS2じゃないの?
つうか、コードの中じゃなくて、IOだよIO。
724デフォルトの名無しさん:2006/09/30(土) 15:08:56
>>721
EUCでソースを保存してiconvで変換
725デフォルトの名無しさん:2006/09/30(土) 15:14:27
>>723
使いたい文字コードをCharひとつに1バイトずつ埋め込んでおけば
とりあえずIOは通る。汚いけど。
俺の場合はたまたまその文字コードがUTF-8だっただけ。
726ニュース速報+:2006/09/30(土) 15:17:35

ニュース速報+ 板
http://news19.2ch.net/newsplus/

【社会】ICFPの国際プログラミング・コンテストで日本のチーム「kuma-」が2位に
http://news19.2ch.net/test/read.cgi/newsplus/1159369025/
727デフォルトの名無しさん:2006/09/30(土) 15:32:30
いや、ソースの話じゃなくて、getContentとか、hPutStrとかだよ。
Charが16bitのくせに、こいつら1バイト単位じゃない?
これでどうやって日本語ファイルを扱えるようにするかって事。

初心者だから間違ってたらスマン。
728デフォルトの名無しさん:2006/09/30(土) 16:01:00
>>727
Charは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ビット。
729デフォルトの名無しさん:2006/09/30(土) 16:03:51
>ソースの話じゃなくて、getContentとか、hPutStrとかだよ。
そんなこと一言も聞いてないが
730デフォルトの名無しさん:2006/09/30(土) 16:35:13
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/haskell/haskell-jp/403

にある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)
>
731デフォルトの名無しさん:2006/09/30(土) 16:36:29
続き

173c181,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
>
732デフォルトの名無しさん:2006/09/30(土) 16:51:07
単純に1バイトずつしか読まない・書かないんだから、それを逆手にとって、
単なるバイト列としてエンコード・デコード関数を用意すればOKって事だな。

って、>>730 がそれか。超サンクス!

しかし、こんなの処理系が標準で備えるべきモノじゃないか?
なんで未だにこんな基本的な機能もないんだ?

>Charは21ビット。
リアルUnicode(を想定)してるのか。そんな贅沢してるんなら、ちゃんと符号化もやれよw
733デフォルトの名無しさん:2006/09/30(土) 17:40:26
Hugsはロケールのエンコーディングで書かれた文字列を読み込むとUnicodeに自動変換される。

まあ結局GHCと合せるためにhSetBinaryModeでTrueを指定するんだけど。XMLとか扱うときはロケール意外のエンコーディングも使いたいし。


あと、話は変わるけど、HaXMLはISO-2022-JPに対応していない(2バイト文字が'<'などを含むため)。一旦Unicodeとかに変換しないと
734デフォルトの名無しさん:2006/09/30(土) 18:03:27
日本語なんて使わなければすべて解決
735デフォルトの名無しさん:2006/09/30(土) 18:41:42
ghcなんて使わなければすべて解決
736デフォルトの名無しさん:2006/10/01(日) 05:17:15
 take 0 _ = []
 take 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がどうなるのか…。
737デフォルトの名無しさん:2006/10/01(日) 06:41:48
なりません。

myTake 0 _ = []
myTake n (x:xs) = x:myTake (n-1) xs

>myTake 10 [1,2]
Excertion (略) : Non-exhaustive patterns in function myTake
738736:2006/10/01(日) 07:04:02
いや、マジでなるんですけど…。

D:\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>
739デフォルトの名無しさん:2006/10/01(日) 08:12:24
>>738
> 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
740デフォルトの名無しさん:2006/10/01(日) 10:24:44
mytakeがmistakeに見えた・・・
741デフォルトの名無しさん:2006/10/01(日) 11:23:17
可変長配列みたいなことがやってみたいと思ってこんなコードを書いたんですが、
やっぱ無理ですた。

createList a b = createList (a:b)
createList a = a:[]

main = print ((createList 1 2 3 4) :: [Int])

なんかいい方法ないですかね?
742デフォルトの名無しさん:2006/10/01(日) 12:28:21
>>741
可変長引数のこと?
それならHaskellでは基本的に書けない。
743デフォルトの名無しさん:2006/10/01(日) 15:15:36
基本的にってことは、例外的に可変個引数の関数を書く方法はあるってことでしょうか?
744デフォルトの名無しさん:2006/10/01(日) 15:25:43
リストとか Maybe とかで擬似的に可変長引数みたいなものを実現するということだろう。


ところでその createList というのは、どういう型をもつのか考えたことあるのかな。
また、createList 1 というのが [1] になるべきか (\b -> 1:b) になるべきか、
というのはどう決定されるべきだと考えてるのかな。
745741:2006/10/01(日) 15:52:56
>>744
> createList 1 というのが [1] になるべきか (\b -> 1:b) になるべきか、

もちろん[1]になることを期待しました。
mainの方で[Int]としたのはうまいこと推論してくれるかな?と。
746デフォルトの名無しさん:2006/10/01(日) 16:49:30
>>743
ある。例えばGHCのText.Printf.printf。

http://darcs.haskell.org/packages/base/Text/Printf.hs
747デフォルトの名無しさん:2006/10/01(日) 18:41:09
>>742
> 可変長引数のこと?
そうです。単なる書き間違いです。

>>746
ヘタれな私にはムズいです。
じっくり取り組んでみます。
ありがとうございました。
748デフォルトの名無しさん:2006/10/01(日) 18:57:08
日本人は低能知能なのには呆れますね。
私達中華人民はあなたたちの掲示板を拝見して笑ってみてますよ。ではありがとうございました。
749デフォルトの名無しさん:2006/10/01(日) 19:34:54
>>743

ttp://d.hatena.ne.jp/yts/20050102
の下の方にも例がある。
createListはこれを参考にして作れそう。
750デフォルトの名無しさん:2006/10/01(日) 19:41:54
>>749
なるほど!引数の数によって型も変えちゃうようなイメージやね。
これならできそう。がんばってみる。
751デフォルトの名無しさん:2006/10/01(日) 20:25:10
>>749 の例に
instance 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]
752デフォルトの名無しさん:2006/10/01(日) 20:42:33
http://okmij.org/ftp/Haskell/vararg-fn.lhs
にも可変長引数の実装例があって、buildってのがまんまcreateListみたい。
753デフォルトの名無しさん:2006/10/01(日) 21:52:18
>>751
> createList :: VAFun Int [Int] x => x
この型の意味がわからん。
ふつけるを読み返しては見たんだが…
xがVAFun か Int か [Int] って意味でいいのか?

> instance VAFun a [Int] [Int] where
こっちはますますわからん。
[Int]をふたつ渡すとVAFunになるような型ってことかな?
754デフォルトの名無しさん:2006/10/01(日) 21:56:17
>>749
そのサイトにあるこの表現、

class VAFun a r f | f -> r where

この縦棒(←記号名を忘れた)は「または」の意味でいいんだよな?
ふつけると入門Haskellを読み返したがそういう表現は無かったので、
念のため確認。
755デフォルトの名無しさん:2006/10/01(日) 22:13:17
>>754
まだ詳しくは読んでないけど、hugsとghcの拡張機能だと思う。
756デフォルトの名無しさん:2006/10/01(日) 22:21:58
>>753
VAFunは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
757デフォルトの名無しさん:2006/10/01(日) 22:57:27
>>755
ghcを使ってるんだけど、エラーで
Use -fglasgow-exts to allow multi-parameter classes
って出たのでどうやらそのとおり拡張らしい。

>>756
> 「| f -> r」の部分は、「ただし、fが決まればrはただ一つ決まる」という意味。

ただ一つ決まるというのはただ一つの型に決まるということですよね?
URIまで示してもらって悪いんですが、英語に明るくない私にはそこまで読み取れないので。
758デフォルトの名無しさん: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を具体的に指定するすべががなく、この型は使いものにならない。
759デフォルトの名無しさん:2006/10/05(木) 00:12:37
このスレでいいのかわからないけど、
Meadowでhaskel-modeでC-c C-lとかC-c C-rとかで帰ってこなくなることないですか?
ghc.exeがずっとCPU占有状態。ghc.exeが二つあることもあるような。
760デフォルトの名無しさん:2006/10/05(木) 00:14:22
>>759
無限ループになってるってことない?
761デフォルトの名無しさん:2006/10/05(木) 01:03:43
ありがとうございます。
でも、バッファの内容は、実行(評価?)を含まず、
定義だけなので実行が無限ループはしてないと思います。
(初心者で判ってないので変な事言ってたらすみません)
762あげ:2006/10/05(木) 20:30:46
あげ
763デフォルトの名無しさん:2006/10/07(土) 14:11:23
遅延評価って具体的にどういう順で評価されるんですか?
普通に前から結合順位が高いもの順?それを必要な分だけ進める感じ?
IOの>>や>>=をどういう風に組み立てればいいのかよく解らないので。
764デフォルトの名無しさん:2006/10/07(土) 14:19:12
>>763
結合と評価を混同するな
765デフォルトの名無しさん:2006/10/07(土) 14:46:21
ついでに IO 動作の実行順序と評価の順序をごっちゃにしてはいけないよ。
766デフォルトの名無しさん:2006/10/07(土) 15:52:47
>>763
評価の順序は、外から順。
f (g (h x))という式なら、まずfが呼ばれる。
1 + 3 * 2という式なら、これは(+) 1 ((*) 3 2)のことだから、まず(+)が呼ばれる。
ただし、結果が同じである限り、処理系は別の順序で評価するかもしれない。

>>や>>=を使ったときのIOの実行順序は、左から右。
これは評価順序とは関係なく、>>=の仕様がそうなっているというだけ。
767デフォルトの名無しさん:2006/10/07(土) 16:45:40
つまり、
評価順は基本的に外からだけど不定、IOの>>や>>=は評価順に関係なく左から右
ということ?

>>や>>=も単なる関数だと思うんだけど、評価と関係なく左からってなんで出来るの?
IOだけ評価とは別の機構で順番が決まるの?
768デフォルトの名無しさん:2006/10/07(土) 16:57:52
評価と実行は別物
769デフォルトの名無しさん:2006/10/07(土) 17:15:29
言語上の進行と切り離されたキューがあって、
>>=や>>の評価毎に、実行すべきモノがたまって行く、
ってイメージだったんだけど、全然違う?

構文解析後に、評価とは別に、そこに表れてる>>や>>=を左から順序が決まる、ということ?
式には直接表れていないけど、変数に含まれてる>>や>>=の順番は?
それって、変数を評価してみないと判らないと思うんですが。
770デフォルトの名無しさん:2006/10/07(土) 17:20:43
>>767
IO a型の値(動作と呼ぶ)は単なるデータで、それ自体が何かをする訳ではない。
例えば、getLine :: IO Stringは「標準入力から一行読むこと」を表すデータに過ぎないので、
getLineを評価しても何も起こらない。(これは、1 + 1を評価しても何も起こらない、というのと同じ)
同様に、putStrLn "Hello"を評価しても、「標準出力にHelloと表示すること」というデータが返ってくるだけで、
実際にHelloが出力される訳ではない。
ではどうやって実際に動作を実行するかというと、mainを実行したい値に束縛すれば良い。
Haskell処理系は、mainの値(mainの型はIO aなので、これは動作)を実際に実行する。
これ以外に動作を実行する方法はない。

(>>)は、二つの動作を組み合わせて一つの動作にする関数。
具体的には、
a >> b
は、
「aを実行し、次にbを実行すること」
を表す動作になる。(>>)はあくまで動作というデータ間の演算であり、
実際に動作を実行する訳ではないことに注意して欲しい。
ここで、aとbを評価する順序は未規定だが、
どうせ評価しても何も起こらないので、大した問題ではない。
771デフォルトの名無しさん:2006/10/07(土) 18:10:43
なるほど、上で「左から右」って書いてある意味は、「>>=や>>の左辺→右辺」という意味ですね。

実行すべきモノのキューというより連結可能なリストが、IOモナド毎にあって、
最終的に>>や>>=による合成で出来たIOモナドのタスクリストが実行される。

評価順の不定があっても、出来るIOモナド(の実行足す栗須と)は同じだから問題ない、
というところでしょうか。
772デフォルトの名無しさん:2006/10/07(土) 19:27:44
>>771
そんな感じかな。
f _ a=a
main=f (putStrLn "hello") (putStrLn "world")

とか

main=seq (putStrLn "hello") (putStrLn "world")

とかやってもhelloは出力されないし。

>>770
ただ(>>)と(>>=)の動作はIOモナド限定ね。
773デフォルトの名無しさん:2006/10/08(日) 06:16:31
ありがとうございます。でもやっぱり判らない…。

mySequence [] = return []
mySequence (x:xs) = x >>= (\h -> mySequence xs >>= (\t -> return (h : t)))
と定義して、
mySequence [putChar 'a', putChar 'b', putChar 'c']
は、abcと出力しました。

でも、>>=がふたつあります。

前の>>=はxの文字の1文字出力、後の>>=はxsの文字列出力を作るので、
それぞれの文字は、文字としてと、連結途中の文字列として、の複数回出力される気がするのですが。
774デフォルトの名無しさん:2006/10/08(日) 08:25:07
>>773
>前の>>=はxの文字の1文字出力、後の>>=はxsの文字列出力を作るので、
前の>>=について、左辺はxの一文字出力で、
右辺はxsの文字列出力だから、結果は(x:xs)の文字列出力になる。
前の>>=の結果がmySequenceの結果だから、mySequenceの結果も(x:xs)の文字列出力。
775デフォルトの名無しさん:2006/10/08(日) 08:34:45
>>773
mySequence [putChar 'a', putChar 'b', putChar 'c'] を定義に従って展開していくと、
最終的にはこんな感じのになる。
putChar 'a' >>= (\ha -> putChar 'b' >>= (\hb -> putChar 'c' >>= (\hc -> return (ha:hb:hc:[]))))
776デフォルトの名無しさん:2006/10/08(日) 10:51:09
System.Win32のリファレンスってwebにある?
777デフォルトの名無しさん:2006/10/08(日) 11:08:45
>773
x は「1文字出力の動作」だけど、 h は動作じゃなくて動作結果。でその動作
結果の値を受け取って return しているが、これは「値を返すという動作」な
ので出力動作はされない。
x という動作は1回しか実行されていないから問題なし。
778デフォルトの名無しさん:2006/10/08(日) 20:54:03
ありがとうございます。
putChar '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"が出力されるような展開がありました。

これらの出力実行はどうなってしまったのでしょうか。展開と評価は別?
展開ってなんでしょう? 評価と同様に、実際に>>=の定義によってなされるものですよね?
779デフォルトの名無しさん:2006/10/08(日) 21:02:42
あ、考えたら、やっぱりこれは展開というより等価だから評価ですよね?
mySequence (putChar 'c':[])
= putChar 'c' >>= (\hc -> (return []) >>= (\tc -> return ('c' : tc)))
= putChar 'c' >>= (\hc -> return ('c':[]))

これは手でやったんですが、
モナド則の(return a) >>=f = f aを念頭に置いてこう変換しました。
モナド則って処理系に入ってるものじゃなくて、>>=の定義が満たしているだけのモノですよね?
つまり、この変換は、>>=を評価することでしか処理系ではなしえないと思うのですが。
780デフォルトの名無しさん:2006/10/08(日) 21:24:09
>>778
>return (ha:hb:hc:[]) は、「"abc"を出力する動作」で、これが返り値。でも、その返り値は使われてない。
違う。return (ha:hb:hc:[])は、「なにもしない動作」で、(ha:hb:hc:[])が返り値。
一般にreturnは何もしない動作を表すw。
781デフォルトの名無しさん:2006/10/08(日) 21:46:52
>>778-779
展開がおかしい。

まず、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[(),(),()]と表示される。
782デフォルトの名無しさん:2006/10/08(日) 23:27:31
>>780
なるほど。IOのreturnを勘違いしていたんですね。
return (ha:hb:hc:[])は、[ha,hb,hc]に「なにもしない動作」がくっついたもの、ですね?

>>781
モナド則は、>>=の定義が従っているだけですよね?
つまりモナド則を使った展開では>>=が評価されてるんですよね?
そのとき、「左辺処理=[]を何もしない」の後に「右辺処理=(h:t)を何もしない」がされる事になる。

でいいんでしょうか。

putChar 'c'の値自体は、カス()に「'c'出力処理」が付いたものであって、
'c'に「出力処理」が付いたものではないんですね。とんでもない勘違いをしていましたね…。
だから、>>=の右辺に渡されるのはカス()だけ、と。

やっとたどり着いた気がします。ありがとうございました。
783デフォルトの名無しさん:2006/10/09(月) 15:19:44
http://www.haskell.org/pipermail/haskell/2004-April/013962.html
http://sourceforge.net/projects/jvm-bridge/
これ使ってる人いる?もう開発・メンテされてないのかな?完成してて拡張不要って事?
784デフォルトの名無しさん:2006/10/12(木) 09:26:11
785デフォルトの名無しさん:2006/10/12(木) 09:33:47
俺まとめ。

SMPサポート: スレッドの並列実行と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
786デフォルトの名無しさん:2006/10/12(木) 09:45:51
正直Haskell興味あるんだけどほかのプログラムと連携できないと意味ないのでHaskell.NET激しくきぼん・・・
787デフォルトの名無しさん:2006/10/12(木) 13:08:54
実行スピードがいまいちなのってコンパイラの最適化が甘いせいだよね?まさか言語仕様のせい?
788デフォルトの名無しさん:2006/10/12(木) 13:16:03
乙。
>UTF-8ソースファイル

ソースだけかよ…。orz
789デフォルトの名無しさん:2006/10/12(木) 13:35:23
あのモノリシックなIOライブラリにコード変換を入れる気はおきないんだろう。
むしろ新しいIOライブラリ(Streamsとか)の整備待ちのような気もする。
790デフォルトの名無しさん:2006/10/12(木) 13:37:50
表にはまだリンクがないけど、6.6のWindows版があったので動かしてみた。
ttp://www.haskell.org/ghc/dist/6.6/ghc-6-6.msi

UTF-8で
main = putStrLn "こんにちわ世界"
とか書いたら一応文句言わずに読み込むんだが、実行すると化けまくり。
791デフォルトの名無しさん:2006/10/12(木) 14:44:02
ghciでの、tab補間がうれしい。
792デフォルトの名無しさん:2006/10/12(木) 17:03:10
>>790
それじゃもっとひどいじゃねぇか。
中途半端イヤ!
793デフォルトの名無しさん:2006/10/12(木) 17:21:23
>790
hPutChar が各文字を castCharToCChar していて、コードポイントが 0xff を
越える文字はその時点で丸められるという話だな。

ただ、 putStr でこれに対応してしまうと、今度はバイナリデータが扱えなく
なるので、現状の方がまだマシ。
ただ文字列→UTF-8文字列の変換が標準で欲しいのは確か。
794デフォルトの名無しさん:2006/10/12(木) 17:51:25
>ただ、 putStr でこれに対応してしまうと、今度はバイナリデータが扱えなく
putStrはHandleがバイナリモードかどうか知ってるんだから、その点は問題ないと思う。
むしろ、ロケールにかかわらずUTF-8で出力されるとしたらそっちが問題だろう。
795デフォルトの名無しさん:2006/10/12(木) 18:31:26
>794
バイナリモードは Windows で改行コードを扱えるようにするだけのモードと
いう認識なんだがそこまでやるかなぁ。

で、文字コードやロケールなどを考慮に入れると、現状の枠組みでは弱すぎる
と思う。無理にあれこれいじるよりはむしろ Streams のような(ssc の方が近
いか)仕組みを採用する方向に持っていった方がいいんじゃないかな。
796デフォルトの名無しさん:2006/10/12(木) 21:46:36
バイナリデータとUTF-8が扱えればとりあえず十分だと思う。
UTF-8で出力出来れば、別のプログラム(文字コード変換とか)をパイプで繋げば良いし。
797デフォルトの名無しさん:2006/10/12(木) 22:01:32
バイナリに関してはByteStringを使えば良いんじゃないかと思う。
798デフォルトの名無しさん:2006/10/12(木) 23:06:03
>>787
どの言語のなんてコンパイラとどういう比較をして
どのくらいいまいちだったの?
比較するのに使ったソースと比較結果とかをだしてちょ
799デフォルトの名無しさん:2006/10/12(木) 23:56:29
Hugsはバイナリモードじゃない場合ロケールのエンコーディングからUnicodeに変換しようとするね。
800デフォルトの名無しさん:2006/10/13(金) 00:35:41
>>798
Haskellはモナドと浮動小数演算が遅い
これは常識
801デフォルトの名無しさん:2006/10/13(金) 00:38:22
モナドが遅い?
802デフォルトの名無しさん:2006/10/13(金) 00:57:38
文字列操作も遅かった。
803デフォルトの名無しさん:2006/10/13(金) 11:20:20
ghcの起動も遅い
804デフォルトの名無しさん: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が両方の引数について正格であると
正しく判断しているので、無駄な遅延が原因ではない。

モナドが遅いってのは意味が分からん。どのモナド?
805デフォルトの名無しさん:2006/10/13(金) 13:06:51
ファイルの読み書きとかIOUArrayとかだろ
806デフォルトの名無しさん:2006/10/13(金) 15:24:28
ghcのコンパイルが遅い
807デフォルトの名無しさん:2006/10/13(金) 15:31:35
>>806
最適化切れ。
808デフォルトの名無しさん:2006/10/13(金) 15:32:34
ああ、ghc「の」コンパイルか。
809デフォルトの名無しさん:2006/10/13(金) 16:44:28
たしかにghcソースからいれると一時間以上かかる
810デフォルトの名無しさん:2006/10/13(金) 17:00:00
一時間くらいで終わるとは、ずいぶん良いマシン使ってるなあ
811デフォルトの名無しさん:2006/10/13(金) 17:58:20
Athlon64 4800+
812デフォルトの名無しさん:2006/10/13(金) 18:46:57
ghcはsourceが巨大な上、build過程も複雑極まりない。
windows上でbuildするのは不可能に近い。

そろそろ整理し直した方がいいんじゃないか?
813デフォルトの名無しさん:2006/10/13(金) 19:02:46
まあ確かにややこしいけれど、整理するだけでそんなにわかりやすくなるよう
なものなのかな? そこのところがよくわからないな。どう整理したらいいと
思う?

あと、 building manual には、 Windows に関するわりと詳細な記述があるよ
うに思うけど、それでも不可能に近いものなの?
814デフォルトの名無しさん:2006/10/13(金) 22:35:11
>>812
そうなの?ふつうにコマンド一発で出来たと思うが。

そんなことよりクロスコンパイラを作れないことが問題だ。
815デフォルトの名無しさん:2006/10/14(土) 07:54:27
確かにwindowsでコンパイルできた、という人は聞いたことないな。
俺も挫折した。
816デフォルトの名無しさん:2006/10/14(土) 08:39:27
試しにmingw+msys上でconfigure; makeしてみたんだけど、
libHSbase.aを作るところで一度に渡すファイル数が多すぎるか何かでこけた。
一旦渡すべきファイルのリストをファイルに書き出して
ar q libHSbase.a @ファイルリスト としてやれば作れたんだけど、
その後もlibHSbase_p.a作るところで同じ理由でこけて、
なんかやる気がなくなった。
817デフォルトの名無しさん:2006/10/15(日) 00:47:42
GHCのエンコーディングサポートの件だけど、
もともとソースについてしか挙がってねぇじゃん。

http://hackage.haskell.org/trac/ghc/ticket/397
http://hackage.haskell.org/trac/ghc/search?q=encoding+Char&ticket=on

おまえら頭良いんだから、英語でバグレポート挙げろよ!
ちゃんとIO系で対応してくれって。
818デフォルトの名無しさん:2006/10/15(日) 18:27:18
で、GHC6.6にアップデートした方がいい?
819デフォルトの名無しさん:2006/10/15(日) 21:38:13
>>818
詳しくみてないがエラストテネスのふるいが3割速くなった
820デフォルトの名無しさん:2006/10/15(日) 21:57:12
>>819
凄いな。
ついでにエラトステネスのふるいも計測してみて
821デフォルトの名無しさん:2006/10/16(月) 08:07:28
main = print $ f [2..] !! 7000 where
f (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
822デフォルトの名無しさん:2006/10/16(月) 08:30:36
逆だね
823デフォルトの名無しさん:2006/10/16(月) 12:37:30
整数演算は元から速いから、あまり意味ないかも
824デフォルトの名無しさん:2006/10/16(月) 13:13:51
不必要な評価をさらになくせたから速くなったの?
825デフォルトの名無しさん:2006/10/16(月) 18:47:27
gccが速くなった結果かも
826デフォルトの名無しさん:2006/10/16(月) 23:38:22
Haskell勉強中の者です。こんなコードを書いて、

f :: (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'

827デフォルトの名無しさん:2006/10/16(月) 23:52:14
>>826
そのままコピペするとインデントが無くなるので書き込むときには注意。

↑これってテンプレに入れといた方がよくね?
まぁその程度で意味不明になるほどのコードは今のところそうそう出てきてないけど。
828826:2006/10/16(月) 23:54:01
>>827
スミマセン。3行目から5行目まで、行頭にTAB一つ入ってるということで
お願いします。
829デフォルトの名無しさん:2006/10/16(月) 23:55:28
>>826
アホなミスだば。
g = k
830826:2006/10/17(火) 00:03:50
>>829
え?それのどこがミスなんでしょうか。
正しい例を教えていただければ助かります。
831デフォルトの名無しさん:2006/10/17(火) 00:18:00
829は放置で。
832デフォルトの名無しさん:2006/10/17(火) 03:13:07
Num ⊃ Int 。

だから、
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
だと、うまくいくでしょ。
833デフォルトの名無しさん:2006/10/17(火) 03:14:58
Num ⊃ Int ⊃ 10 と書いた方がいいかな。
ってまあ、俺の方が初心者だと思うので、嘘言ってたらゴメン。
834デフォルトの名無しさん:2006/10/17(火) 08:38:48
>>826
Haskell98では、クラス宣言の場合をのぞいて型変数のスコープは一つの型式の中だけ。
これは既知の欠陥で、回避するための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
835デフォルトの名無しさん:2006/10/17(火) 23:17:04
>834
いけました!ありがとうございます。
836デフォルトの名無しさん:2006/10/17(火) 23:44:27
Int 投げんなよ。
837デフォルトの名無しさん:2006/10/18(水) 23:49:48
内部でロケール依存の変換をするIOライブラリを書いてみた。
やっつけだけど、良かったらどうぞ。
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と互換性がないので注意。
838デフォルトの名無しさん:2006/10/19(木) 11:27:41
>>837

WinXP, GHC 6.6で試してみました。
GHCiで837のコードを動かしてみたら見事に化けました。
GHCiはコードページを28591に変えちゃうんで
cmd.exeでラスタフォントを使ってる場合は化けて当然なわけですが、
一旦フォントをTrueTypeFontに変更してGHCiを起動、:! chcp 65001で
UTF-8のコードページに変えると、
sHELLO WORLD
O WORLD
という表示になりました。
まぁ、CP932(Shift JIS)に変更してやればきちんと表示されましたけど。

ちなみに、ファイルにリダイレクトさせると、コードページが何であってもShift JISで出力されてました。
839デフォルトの名無しさん:2006/10/19(木) 19:37:15
>>838
テストありがとうございます。
その挙動は、プログラムがコンソールのコードページ(chcpで設定できる)ではなく
システムのコードページ(「地域と言語のオプション」で設定できる)を参照することによるものです。
これは不便なので、コンソール入出力についてはコンソールのコードページを使うように修正しました。
最新版はここに置いておきます。
http://yogimo.sakura.ne.jp/ssc/index_ja.html
840デフォルトの名無しさん:2006/10/19(木) 22:26:50
Stateのサンプルコードがわからんです。

tick :: 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は数値なんだろうけど、
どうしてそうなるのかわからないです。
841デフォルトの名無しさん:2006/10/19(木) 22:39:43
>>840
do式で使われる<-は左辺を右辺に束縛する訳じゃない。
do
  n <- get
  put (n + 1)
は、
get >>= (\n -> put (n + 1))
の略記。
842デフォルトの名無しさん:2006/10/19(木) 22:45:10
>840
get に限らず 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')
となり、うまく行っているのがわかると思う。
843840:2006/10/19(木) 23:25:39
>>841,>>842
>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型の値だけが左辺に渡されるのでしょう??
それと「平常時」ってのが気になるんですが、平常じゃない場合もある・・・?
844デフォルトの名無しさん:2006/10/19(木) 23:49:36

どうも
Java歴数ヶ月のデザインパターンも把握してないunkoです

Haskellが世界最強プログラミングコンテスト(?)みたいので
いつも1位だって聞いてここきました

で、偉大なハッカーはPerlとかLispなんかを愛用してるみたいですが
その点Haskellはどうですか?

2chの住民的な意見を期待してる

845デフォルトの名無しさん:2006/10/19(木) 23:55:47
>は右辺のモナドの印(上の例でいればIO)が外れてただの値になり、
型の話とデータの話を混同してないか。
型について言えば、<-の左辺の型は、右辺の型からモナドを外したものになる、と言うのは正しい。
getContentsならIO Stringに対してIOを外したStringだし、
getならState s sに対してState sを外したsだ。
データについて言うと、右辺から左辺を取り出している訳ではまったくない。
getContentsは標準入力を読むという動作、getは単なる関数をラップしたものであって、
そこにStringやs型の値を内包している訳ではない。
846デフォルトの名無しさん:2006/10/20(金) 00:43:12
>>844
Haskellが活躍してたのは去年まで。
今年は見る影も無い。

問題の特質を見抜いて、適切な道具を選ぶのが偉大なハッカー。
特定のツールに固執するのは間違い。
847デフォルトの名無しさん:2006/10/20(金) 01:03:50
>>846
あれ?
今年はGoogleの社員チームが1位になったんだよね?
その中にHaskell使ってる人いなかった?
848デフォルトの名無しさん:2006/10/20(金) 02:21:55
>>847
今回のコンテスト・・・というか、ゲームの内容見た?

今回の内容じゃあ言語の優劣は出ないよ。
Haskell使ってる人が居ても、ただそれに慣れてるってだけさ。
849デフォルトの名無しさん:2006/10/20(金) 03:21:58
>843
「平常時」から外れるのは実際に状態を操作する系の処理、ようするに get、
put、modifyなどのことを想定して書いた。

あとは 845 の言うとおりかなぁ。

型について言うと、 instance Monad IO だから、 IO String から IO がはず
れて String になる。
同じように、 State では instance Monad (State s) だから、 State Int Int
に対しては State Int がはずれて Int が出てくるわけだ。
850838:2006/10/20(金) 03:34:58
>> 839

Win2K, GHC6.6でssc-0.0.10を試してみました。
cp65001で837のコードを動かしたら、
諸行無常のHELLO WORLD
LO WORLD
という表示になりました。
なんでLO WORLDがくっつくんだろう。

あと、リダイレクトさせた場合はやっぱりShift JISになるみたいです。
851デフォルトの名無しさん:2006/10/20(金) 10:57:26
>>850
>という表示になりました。
これはWin32 APIのWriteFileが実際に出力したバイト数よりも小さい値を戻すのが原因です。
OSの問題なわけですが、どうしても必要なら対策を考えます。

>あと、リダイレクトさせた場合はやっぱりShift JISになるみたいです。
これは意図した動作です。標準入出力がリダイレクトされた場合、コンソール入出力ではないので、
システムのコードページにしたがってコード変換します。
852デフォルトの名無しさん:2006/10/20(金) 11:10:02
>>851
>これはWin32 APIのWriteFileが実際に出力したバイト数よりも小さい値を戻すのが原因です。

こんなすごいバグがあるんだ。10年以上 Windows でプログラム書いてるけど
経験したことも聞いたこともありませんでした。

UTF-8で"諸行無常のHELLO WORLD"をコンソールに WriteFile すれば再現可能ですか?
853デフォルトの名無しさん:2006/10/20(金) 11:25:21
>>852
私の環境(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));
}

すれ違い御容赦。
854デフォルトの名無しさん:2006/10/20(金) 11:26:05
UTF-8で 日本語 と表示されるようなプログラム
main = putStrLn "\230\151\165\230\156\172\232\170\158"
をTrueTypeFontで表示しているcmd.exe上でコードページ65001のもとで
実行するとpermission deniedになるんですが、
それもこれに関連したバグなんでしょうか?
855デフォルトの名無しさん:2006/10/20(金) 11:48:17
>>853
実行してみると、妙な記号と 8/8 writtenと表示されました。
コンソールのプロパティを調べると、フォントが「ラスタ フォント」になっている。
他にもう1つだけ選択可能な Lucida Console フォントに変更してみると、4/8 writtenとなって
再現しマスタ。

というか漏れのPCだと、そもそもCP65001 で日本語フォント使えないっぽいw
856デフォルトの名無しさん:2006/10/20(金) 12:06:30
>>855
chcp 65001する前にフォントをMSゴシックに変えればOK
857デフォルトの名無しさん:2006/10/21(土) 02:01:44

興味もったからこれからインストールしてハローワールドくらいやってみようと思う
ちなみにJava歴5ヶ月のプログラマ初心者です

なにか注意点ある?
心構えとか
858デフォルトの名無しさん:2006/10/21(土) 02:02:16
age
859デフォルトの名無しさん:2006/10/21(土) 02:06:23
Javaより簡単ですよ。たぶん。
860デフォルトの名無しさん:2006/10/21(土) 03:46:51
型エラーは慣れの問題です
861デフォルトの名無しさん:2006/10/21(土) 11:19:02
doがdoじゃないこと
returnがreturnじゃないこと
862デフォルトの名無しさん:2006/10/21(土) 15:24:46
Monadを難しく考えるな、感じるんだ
863デフォルトの名無しさん:2006/10/21(土) 18:55:06
Stateモナドの説明とか見たけどここの人って難しいことを難しくしか説明できないのね
864デフォルトの名無しさん:2006/10/21(土) 18:58:09
>>863
どのあたりが難しかった?
865デフォルトの名無しさん:2006/10/21(土) 19:11:23
>>847
1位と3位がgoogleチームで1位のチームはC++とHaskell、2Dが使用言語だね

>>848
VM作成なんてHaskellとかのお家芸みたいなものじゃないかと
866デフォルトの名無しさん:2006/10/21(土) 19:16:35
初心者の俺にわかるように、いかにハスケルがVM作成に向いてるかという
"かんたんな"説明してくれ
867デフォルトの名無しさん:2006/10/21(土) 19:21:47
アホは相手にしないという斬新なスタイルを採用
868デフォルトの名無しさん:2006/10/21(土) 19:22:03
>>865
>VM作成なんてHaskellとかのお家芸みたいなものじゃないかと
冗談じゃない。よほどチューニングに慣れたHaskell使いじゃないと
まともな速度で動くVMを短時間では作れないだろう。

Haskell有利な点があったとすれば、パズルを解くような補助プログラムを
書きやすいということだと思う。
869デフォルトの名無しさん:2006/10/21(土) 19:27:38
>>867
具体例も挙げれないんじゃおまえもアホに含まれる
870デフォルトの名無しさん:2006/10/21(土) 19:35:56
今回の問題は速度なんて関係ないでしょ
ttp://itpro.nikkeibp.co.jp/article/NEWS/20060927/249198/
871デフォルトの名無しさん:2006/10/21(土) 19:57:42
vm はどうか知らないが言語の仮実装には向いているかもな
Perl6 の Haskell での実装である Pugs は恐ろしく短期間で出来上がったらしいし
872デフォルトの名無しさん:2006/10/21(土) 20:03:56
visual haskell便利やなぁ。
873デフォルトの名無しさん:2006/10/21(土) 20:13:23
http://d.hatena.ne.jp/tanakh/20060806#p1
によると、VMの仕様が簡単で、一方その上で動くソフトが重いので、低水準言語向きだったとか。
874デフォルトの名無しさん:2006/10/21(土) 20:13:25
なんすかそれ
875デフォルトの名無しさん:2006/10/21(土) 20:47:54
型情報バリバリ使ってバリバリ補完とか、
ツールチップでリファレンス表示とか、
書いてるそばからエラー指摘&補正案提示とか、
そういう開発環境出て来ないんかなぁ。
876デフォルトの名無しさん:2006/10/21(土) 21:22:12
>>870
関係ありまくりだって。

たとえば black の 1000 点を受理させるとか、
adventure でオートパイロット走らせるとかするには
それなりにスピードがでないと困る。
877デフォルトの名無しさん:2006/10/21(土) 21:40:45
BASICコードのコンパイルに半日掛けましたが何か?
878デフォルトの名無しさん:2006/10/22(日) 00:27:15
>>865
2Dってどういう言語?
879デフォルトの名無しさん:2006/10/22(日) 00:37:32
>>878
ゲーム内で出てくる変態言語の一つ。

いくつかの基本素子を二次元平面上に配置・配線することで
プログラムを(ASCII Artで)表現することができる。
自分の中で自分に結線することができたりするなど、
細かい部分で関数型言語の香りが感じられる言語。

ゲーム内にはこの言語のインタプリタが入っており、
ペアノ算術やリストの反転、レイトレをイメージした漸化式を解く
プログラムなどを作成することになる。
880( ´_ゝ`)フーン:2006/10/22(日) 02:53:54
( ´_ゝ`)フーン
881デフォルトの名無しさん:2006/10/22(日) 03:59:00
>>879
参加者の方ですか?
882デフォルトの名無しさん:2006/10/22(日) 14:30:47
大文字でも小文字でもないから、という間抜けな理由で
漢字や仮名を識別子に使えないのはどうなんだろう。
883デフォルトの名無しさん:2006/10/22(日) 15:22:41
いや、Haskell作ってるの日本人じゃないから
884デフォルトの名無しさん:2006/10/22(日) 15:36:44
いや、それは分かってるが。
ギリシャ文字やキリル文字や、さらには全角空白まで認められてる言語仕様なのに、
漢字や仮名が使えないのは片手落ちっぽいな、と思っただけ。
885デフォルトの名無しさん:2006/10/22(日) 17:38:09
はぁ?
886デフォルトの名無しさん:2006/10/22(日) 20:09:06
インストールの仕方がわかんねーーーー
おしえろおまえら
887デフォルトの名無しさん:2006/10/22(日) 20:11:11
環境と、何をインストールしようとしているのか書け。
888デフォルトの名無しさん:2006/10/22(日) 20:21:44
Windows XP sp2
Hugs
889デフォルトの名無しさん:2006/10/22(日) 20:24:16
890デフォルトの名無しさん:2006/10/22(日) 21:12:06
そんなURLは最初から知ってるんだよ。。。

WinHugs-Sep2006.exe(14MB)だけインストールすれば使えんの?
だとすれば hugs98とSep2006.tar.gz(5.3MB) ってなに?

あと、MinGWとかいらないの?
(↑これがなんなのかよく知らないが)

891デフォルトの名無しさん:2006/10/22(日) 21:13:54
>>890
読め
892デフォルトの名無しさん:2006/10/22(日) 21:16:23
>WinHugs-Sep2006.exe(14MB)だけインストールすれば使えんの?
うん。

>だとすれば hugs98とSep2006.tar.gz(5.3MB) ってなに?
ソースコード

>あと、MinGWとかいらないの?
いらない。
893デフォルトの名無しさん:2006/10/22(日) 21:20:09
WinGHCi みたいなのがあるといいんだがな。
WinHugsをいじって作れるかどうか、ちょっとソース調べてみるか。
894デフォルトの名無しさん:2006/10/22(日) 21:55:34
module 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

これを実行しようとしたら
ERROR file:.\Qsort.hs:5 - Syntax error in input (unexpected `=')

なにが悪いんですか
895デフォルトの名無しさん:2006/10/22(日) 21:56:49
>>894
インデントがおかしい。
afterのカラム位置をbeforeと揃えるべし。
896デフォルトの名無しさん:2006/10/22(日) 22:07:33
インデントを直してみたら
Undefined variable "s"
とかでて、適当にスペースを直したら
Undefined variable "a"
になった

その変数は定義されてませんとかいうけど
そんな変数作ってません><
897デフォルトの名無しさん:2006/10/22(日) 22:21:32
俺のところでは通るんだが。

module 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

これをコピペしてもだめ?
898デフォルトの名無しさん:2006/10/22(日) 22:25:29
あーできてた
Qsort> qsort (<) [8,3,5,2,7,1,9]
っていうように引数?を指定してないだけだった

勝手が違うから全然わかりましぇん
899デフォルトの名無しさん:2006/10/22(日) 23:20:33
微妙にわかってきた
いまのところの感想だと、数学の公式勉強するための言語って感じ

ところで今までは.hsファイルを直接開いて(WinHugsに関連づけて)やってたんだけど
直接WinHugsを起動したときに
hugs>
から始まるけど、どうやってファイルを指定すればいいの?
900デフォルトの名無しさん:2006/10/23(月) 01:14:44
もう少し工夫してこんなのは?
qsortBy _ []=[]
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をまとめてみた。
901デフォルトの名無しさん:2006/10/23(月) 07:39:46
>>899
:load
902デフォルトの名無しさん:2006/10/23(月) 21:00:21
>>901
そこまでアホじゃない・・・
パス名の指定はどうすんの?
まさか全ドライブから自動検索なんてしないよね?
903デフォルトの名無しさん:2006/10/23(月) 21:35:30
904デフォルトの名無しさん:2006/10/23(月) 23:14:16
コマンドで人と会話するな!
日本語を使えよ
905デフォルトの名無しさん:2006/10/23(月) 23:34:29
ホントこのスレばかばっか
偏差値しかなさそうだな
906デフォルトの名無しさん:2006/10/23(月) 23:35:57
>>902
絶対パスでも、カレントディレクトリからの相対パスでも良い。
907初心者A:2006/10/24(火) 21:47:47

ねーねー
大学もでてない以前に高校で物理すら習ってない俺には
クイックソートすら何かいてるんだが意味不明なんだが

だれか記号の意味おしえて
908デフォルトの名無しさん:2006/10/24(火) 21:53:53
>>907
Haskellや類似の言語を一つも知らないなら意味が分からないのは当然。
入門書でも読んでみたらどうよ。
909デフォルトの名無しさん:2006/10/24(火) 22:01:16
このスレでおしえてよー
どうせレス伸びないんだし

http://pc8.2ch.net/test/read.cgi/tech/1128011645/
なんならこっちでもいいし
910デフォルトの名無しさん:2006/10/25(水) 02:12:04
うせろ
911デフォルトの名無しさん:2006/10/27(金) 18:38:07
ttp://shootout.alioth.debian.org/gp4/benchmark.php?test=all&lang=all
Concurrent Clean の方が高速で実用性がありそうだな
言語仕様ほぼ変わらないし
912デフォルトの名無しさん:2006/10/27(金) 20:52:47
高速とか実用性はともかく言語仕様ほぼ変わらないっていうのはどういうレベルの話なんだ?
913デフォルトの名無しさん:2006/10/27(金) 22:50:30
みため
914デフォルトの名無しさん:2006/10/27(金) 23:03:00
そのふたつの言語仕様がほぼ変わらないなら、C#とJavaはほとんどいっしょってことになるだろうなぁ
915デフォルトの名無しさん:2006/10/27(金) 23:04:33
>>914
C#とJavaはほとんどいっしょ
916デフォルトの名無しさん:2006/10/27(金) 23:50:43
>>912
副作用に対するアプローチが違うだけじゃん
917デフォルトの名無しさん:2006/10/28(土) 00:10:44
>>916
すごくデカいちがいじゃん
918デフォルトの名無しさん:2006/10/28(土) 00:23:23
仕様見るのめんどくさいんだけど、IOモナドってあるの?
919デフォルトの名無しさん:2006/10/28(土) 01:41:10
IOモナドよりも高速なものが実装されてる
920デフォルトの名無しさん:2006/10/28(土) 01:49:02
高速なものよりも、使いやすくて一貫性があるものの方がいいな。
条件満たしてる?
921デフォルトの名無しさん:2006/10/28(土) 11:30:09
いやほかにも意味論的に少し違うところがあるんだが……。

入出力だったら
http://www.geocities.jp/lethevert/softwares/clean/gettingStarted20.html
とか見て自分で判断しろ。
922デフォルトの名無しさん:2006/10/28(土) 11:37:42
補足。
さきにこっち読む方がいいかも。一意性型とかの説明。
http://www.geocities.jp/lethevert/softwares/clean/gettingStarted19.html

意味論の違いのほかにも、表記の違いはけっこうある。 Clean は関数の型を
a -> b -> c じゃなくて a b -> c って書くみたいだし。型クラスの制約の書
き方も違うし、型クラスの粒度はとても細かいし。
923デフォルトの名無しさん:2006/10/28(土) 16:40:09
どれもたいした違いじゃないだろ
924デフォルトの名無しさん:2006/10/28(土) 17:25:10
たいした違いかどうかは人による。
初代とSEEDを同じガンダム扱いされたら、お前だって嫌だろ?
925デフォルトの名無しさん:2006/10/28(土) 17:48:02
そこまでの違いはねーよwww

遅延評価や参照透明性などの基本的な考え、型の概念などもほぼそのまま使える
コンセプトとしてかなり同根のものだろ
記述も基本的なところ以外はほとんど差もなし
Haskell 使えるヤツなら脳コストも少なく楽に移行できるだろう
Monad も言語で保証されて居るものではないのでその概念を持っていくことは普通に出来る
で、IDE で環境を配布して C++ 並みに高速と来れば使わない手はない

まぁまだ環境が整っていないってのはあるがw
あれだ、人が増えればそれなりに環境も整うからおまいらもっと使ってやってくださいお願いします
926デフォルトの名無しさん:2006/10/28(土) 21:06:32
>>925
lethevert乙
927デフォルトの名無しさん:2006/10/29(日) 19:11:47
GHCで、ある関数をn回実行する時間を計測する、便利な方法はありますか?
928デフォルトの名無しさん:2006/10/29(日) 19:35:37
Prelude> -- product [1..10000]を十回求めてみる
Prelude> :set +s
Prelude> foldr seq () $ map (\_ -> product [1..10000]) [1..10]
()
(7.23 secs, 878865620 bytes)

GHCiだとこんな感じか。
929デフォルトの名無しさん:2006/10/29(日) 19:47:04
なるほど。どうもです。
ghcでコンパイルした場合と似たような速度になるんですかね。ひとまずやってみます。
930デフォルトの名無しさん:2006/10/29(日) 23:07:21
Fedoraのextraに含まれているghcでは、ghc -prof はできないのだなぁ。
残念。

Failed to load interface for `Prelude' とか言われてしまう。
931デフォルトの名無しさん:2006/10/29(日) 23:31:19
ghc642-prof: Profiling libraries for GHC
http://fedoraproject.org/extras/6/i386/repodata/repoview/ghc642-prof-0-6.4.2-4.fc6.html
ってのがあるみたいだが。
932デフォルトの名無しさん:2006/10/29(日) 23:37:46
>>931
できそうです。
ありがとうございました。
933デフォルトの名無しさん:2006/11/01(水) 00:30:32
函手ってなんですか?
934デフォルトの名無しさん:2006/11/01(水) 00:35:59
Maclane嫁
935デフォルトの名無しさん:2006/11/01(水) 00:36:40
マックレーンて難しすぎない?俺わかんねー
936デフォルトの名無しさん:2006/11/01(水) 10:07:07
マックレーン読みながらHaskellやっているやつなんているわけねぇだろ。
937デフォルトの名無しさん:2006/11/02(木) 08:17:33
>>936
俺の研究室ではわりと普通の光景だが?
938デフォルトの名無しさん:2006/11/02(木) 08:24:56
数学屋は脳みそ普通じゃないから(尊敬の意)
939デフォルトの名無しさん:2006/11/02(木) 09:31:37
その割には圏論的なHaskellとやらの解説が少ない気がするんだけれど・・・。
どっか簡単に導入ってサイト作っている人いないのかね。
これだけ圏論だHaskellだって騒いでいたのに正直なんの関連性があるのかよくわからん。
940デフォルトの名無しさん:2006/11/02(木) 09:38:43
>>937
っていうかすでにConceptual Mathematicsじゃないのね・・・。
941デフォルトの名無しさん:2006/11/02(木) 10:38:09
>>939
圏論関係ありません
942デフォルトの名無しさん:2006/11/02(木) 12:04:41
>>939
言語の各機能について圏論的に説明したって面白いことはあまり無いと思う。

この分野で圏論が強いのは、関数型言語が圏論的に綺麗な構造を
しているのでプログラムの性質がしらべやすくなっている、ってだけ。

たとえばリストでは map は f: A → B を函手で写したもの、
fold, unfold は代数の始対象, 終対象から一意に定まる射、
などと特徴付けられ、いろんな性質が直ちにわかったりする。
943デフォルトの名無しさん:2006/11/02(木) 16:19:47
> プログラムの性質がしらべやすくなっている、ってだけ。
というよりも、圏論的なのは処理系実装上の問題であって、圏論云々は一般プログラマが気にすべき話じゃないよね。
944デフォルトの名無しさん:2006/11/02(木) 17:31:30
>>943
俺の考えでは、そもそも素晴らしい関数型言語の世界があって
現実の言語処理系はそれをどれだけ綺麗に書けるか、という感じ。

だから、書きやすさを度外視すれば C++ で圏論に基づくプログラム
を書くこともできて、実際 Google の MapReduce はそうなっている。

Google の中の人が一般プログラマかはあやしいと思うけど、
気にすべき話じゃないってのは何か違うなあと思う。
945デフォルトの名無しさん:2006/11/02(木) 17:38:32
すみません、質問させてください。
関数の途中で結果を出力させたいのですが、
↓このようなことはできますか?

「print p」の型はIO ()ですが、それを
さっと気軽に埋め込めるといいんですが・・

fun1 :: Int -> Int
fun1 n =
 let p = n * 3 in
  print p
  p + 1
946デフォルトの名無しさん:2006/11/02(木) 17:42:56
Debug.Trace.trace か unsafePerformIO を使え
947デフォルトの名無しさん:2006/11/02(木) 20:24:41
>>942
>>fold, unfold は代数の始対象, 終対象から一意に定まる射、
詳しく。代数の始対象、終対象ってなに?
アイディアだけでもっていうかアイディアだけくれ。
というか圏論と代数のつながりがイマイチわからん、普遍射とかはわかるんだけれど。

準同型射で類別したもの=代数
くらいの認識です。
948デフォルトの名無しさん:2006/11/02(木) 20:25:51
ちなみにね。
949デフォルトの名無しさん:2006/11/02(木) 21:39:28
圏論とほんとに相性がいいのはtotalな関数型言語。
Haskellにはどうしても_|_がつきまとうのですっきりいかない。
coproductの扱いとか。
950942: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) がそうなる。
951942: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 が出てくるし、もっと複雑な
データ構造の上でも同様に議論できたりする。
952947:2006/11/02(木) 21:59:27
thx!!!!!!
ちょっと理解するまでに時間かかるけどとりあえずカキコ
明日あたり質問するかも。


にしても函手のそういう使い方は知らんかった。
単なる「カテゴリ間のモルフィズム」程度の認識しかなかったけどそういう風に論理展開できるのね。

っていうか圏論の基礎にそんなこと載ってたっけ?

まぁ、圏、函手、普遍射、随伴、自然変換、モナドの部分くらいしか読んでいないんだけどね・・・。

953デフォルトの名無しさん:2006/11/02(木) 22:02:13
だからおまいらbottomを無視するなって…これだから数学者は(ry
954デフォルトの名無しさん:2006/11/02(木) 22:04:22
なんかすごいなー。
955デフォルトの名無しさん:2006/11/02(木) 22:05:42
>>953
諦めろ。数学者のアタマに停止しない計算は存在しない。
956947:2006/11/02(木) 22:10:10
すまん、早速質問というか確認。

>I は恒等函手、+ は直和、×は直積。

直積Xって積圏作る函手でしょ。
直和+ってアーベリアンな積圏作る函手ってこと?
957947:2006/11/02(木) 22:23:20
あっ。F-algebraってそういう意味か。
そんなの知らないよ。orz
F-algebraは既知じゃないです。orz
958942:2006/11/02(木) 22:30:53
>>956
分離和 (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
何らかの自然っぽい構造を持ったものはだいたい代数と言ってしまうので
ミスリーディングではあるんだけどね。
959947:2006/11/02(木) 22:43:48
>>958
>>分離和 (separated sum) といったほうが良かったかも。
初耳です。orz
そして圏論の基礎にも載っていない。

958さんは何の本を読んでいるのですか?

自分は圏論の基礎以外持ってないっす。
960デフォルトの名無しさん:2006/11/02(木) 22:47:08
Haskellは学術雑誌とかで活発に議論されてるんだろうなあ。英文で。
自分は和書でも読むのが遅いのに英文だと輪をかけて遅くなるし…
少しは慣れないと。
961947:2006/11/02(木) 22:48:58
×958さんは何の本を読んでいるのですか?
○942さんは何の本を読んでいるのですか?
962デフォルトの名無しさん: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 みたいな)
963デフォルトの名無しさん:2006/11/04(土) 03:44:44
>>962
ない。
964デフォルトの名無しさん:2006/11/04(土) 03:57:18
こういうのを見るたびに、Template Haskellがもっと使い易い構文だったらと思うよ。
こういうちょっとしたマクロの需要は確かにあるはすだけど、
いちいち$(testConstr [| Hoge |])なんて書いてたら冗長過ぎて略記法にならない。
965デフォルトの名無しさん:2006/11/04(土) 04:00:52
>>962
isHoge (Hoge _) = True
isHoge _ = False

って書くのが普通じゃないの
966962:2006/11/04(土) 10:51:50
>>963
ないっすか。(´・ω・`)

>>964
テンプレートハスケル?
なんか藪から蛇が!?

>>965
まあ、元の書き方よりは大分短いのでこれで
よしとすべきですかね
967デフォルトの名無しさん:2006/11/04(土) 11:03:29
こうするとListを入れなくてすむよ
findHoge = head (filter isHoge hoge)
  where
  isHoge (Hoge _) = True
  isHoge _ = False
データ構造がそのままならパターンマッチしか無いけど
変えていいならこう
data HogeFuga = Hoge | Fuga
hogeList = [(Fuga, ""), (Hoge, "aaa"), (Fuga, "bbb")]
findHoge = lookup Hoge hogeList
968デフォルトの名無しさん: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"]
969デフォルトの名無しさん:2006/11/04(土) 20:17:15
>>959
「圏論の基礎」の原題を三回読んで,改めて本を探すべし.
ちなみに僕には Barr-Wells の本が判りやすかった.

>>958
> 何らかの自然っぽい構造を持ったものはだいたい代数と言ってしまうので
> ミスリーディングではあるんだけどね。
数学の側の感覚でいうと,作用(素)のつくる代数というものに相当するんじゃないかと思う.
970942:2006/11/04(土) 21:48:06
>>959
分離和は集合の圏での普通の意味の直和と一致するから
問題ないけどね。MacLane p.80 あたり参照。

俺が読んだ本は多すぎて紹介しきれんけど、プログラミングを
圏論的に解説したものとしては
http://db.cs.utwente.nl/Publications/PaperStore/db-utwente-404F4540.pdf
ってのが読みやすかった。好みが分かれそうだけど。

>>958
普通、作用素の代数といったら作用素環を指すのでアレだけど、
さすがに位相空間とか前順序まで作用素と呼ぶのは広すぎる気が。
971942:2006/11/04(土) 21:49:02
>>958>>969 の間違い。
972962:2006/11/04(土) 22:39:54
>>967
実は自分が扱ってるのは標準ライブラリのGetOptの返値なんで
さすがに自分で仕様は変えられないです。
http://www.haskell.org/ghc/docs/6.4.2/html/libraries/Cabal/Distribution-GetOpt.html
まあオプションの種類が一杯あるときは
データ変換しておく価値もあるかも?

>>968
おお、一番求めてるモノに近いっす。
でも標準じゃないのね。orz
973デフォルトの名無しさん:2006/11/05(日) 11:30:09
cで書かれた画像処理のライブラリーがいっぱいあるので
統合しようという話がある

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なの?
974デフォルトの名無しさん:2006/11/05(日) 12:31:09
>より抽象化された記述からcを吐き出す言語があると聞いて
これは間違っていないけど、たぶん誤解している。
Haskellは、抽象化された記述をもとにコンパイル時計算をして
最適なコードを出力するような方向性の言語ではない。
むしろ、抽象化の解決は実行時に行われることが多い。
GHCには強力な最適化器があるので、これをなだめすかして
効率的なコードを吐かせることも不可能じゃないが。

>データ構造の指定みたいなのできるの?
意味が分からん。生のバイト列を扱えるかどうかという疑問なら、扱える。

>計算速度はcのプログラムと比べて我慢できるLvなの?
何を、どのように、どれくらいまじめに書くかによる。

Computer Language Shootout BenchmarksでのHaskellとCの比較。
http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&lang=ghc&lang2=gcc
975947:2006/11/05(日) 23:42:06
>>969
>「圏論の基礎」の原題を三回読んで,改めて本を探すべし.
>ちなみに僕には Barr-Wells の本が判りやすかった.

ども!ありがとうございます。
3回ですか。正直、圏論敵考えを展開するための土台部分が弱いので後半部分はきついです。普通の代数をもう少しやり直してみます。(たぶんそちらのほうが早道なので)
そのあとにBar-Wellsを見てみます。(できたら)

>>970
>分離和は集合の圏での普通の意味の直和と一致するから
>問題ないけどね。MacLane p.80 あたり参照。

ここら辺完璧すっ飛ばしてました。読んでみます。

>俺が読んだ本は多すぎて紹介しきれんけど、プログラミングを
>圏論的に解説したものとしては
>http://db.cs.utwente.nl/Publications/PaperStore/db-utwente-404F4540.pdf
ってのが読みやすかった。好みが分かれそうだけど。

ぱっとみですがこれ結構いいかも。薄いし全部印刷して一回読んで見ます。
ありがとうございます。

> 何らかの自然っぽい構造を持ったものはだいたい代数と言ってしまうので
> ミスリーディングではあるんだけどね。

環構造持っていれば代数。という感じじゃないんですかね。


わかってきたらまた質問するかもです。
そのときはよろしくお願いします。
976デフォルトの名無しさん:2006/11/05(日) 23:57:50
>>975
三回読めってのは中身ではなく原題のことだろう。
「Categories for the Working Mathematician」
なので、基本的にあの本は数学屋向け。プログラム屋には向かない。
977947:2006/11/06(月) 00:24:18
>>976
そういう意味か。確かに検索したら
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だ。

でもあの本はあの本で含蓄があっていいよ。
なんていうか射で表現される世界というものが見えてきて面白い。
考えが確かにシンプルにできる。実用性はあんまりないが。
978デフォルトの名無しさん:2006/11/06(月) 00:34:01
関数言語を勉強するために必要な本と環境はみんなどうやって始めましたか?
何分馬鹿PGなもので関数言語はLispちょっとわかるぐらいの馬鹿です。
979デフォルトの名無しさん:2006/11/06(月) 01:15:16
>>978
WEBだけー
980デフォルトの名無しさん:2006/11/06(月) 01:20:36
>>979
まじっすかできればその時参照したページなどを
次スレで追加していただけないでしょうか?
981デフォルトの名無しさん:2006/11/06(月) 02:04:27
なんでこんなにスレのびた?
982デフォルトの名無しさん:2006/11/06(月) 02:29:07
>>980
shiroさんのPractical Schemeの記事でも読んだら?
HaskellでなくSchemeで
しかも純粋な純粋な関数型の世界とはちょっと違うけど勉強になるよ
あとはnobsunさんのsampou.orgか
Haskellだけど記事が少ない
983デフォルトの名無しさん:2006/11/06(月) 02:41:34
オセロとかのゲームを作ってみれば?
簡単に作れて、工夫することで言語仕様の理解が深まる教材だと思う。
984デフォルトの名無しさん:2006/11/06(月) 02:48:54
>>983
それスレ立ててレクチャーしてくれよ

【Haskell】1がオセロゲーム教えるスレ
このスレは1が延々と、Haskell言語を使いオセロゲームの作り方について
詳しく丁寧に説明していくスレです。
Haskellの言語仕様の理解を深めるのに最適な教材です
985デフォルトの名無しさん:2006/11/06(月) 04:07:59
>>984
逆だろw
【Haskell】1がオセロゲームを作るスレ
986デフォルトの名無しさん:2006/11/06(月) 11:29:56
オセロって言っても、要は探索効率や学習効率の問題なんだけどね。
いくらでも工夫の余地はある。
987デフォルトの名無しさん:2006/11/06(月) 20:51:59
急にスレが止まった
めんどくさがらずに教えろゴラァ!
988デフォルトの名無しさん:2006/11/06(月) 20:54:37
>>987
作ってみ。
989デフォルトの名無しさん:2006/11/06(月) 20:55:09
まずは次スレを立てるこった
990デフォルトの名無しさん:2006/11/07(火) 01:49:15
一ヶ月でHaskellを鍛えたい
って考えたときどの資料みればいいの?
991デフォルトの名無しさん:2006/11/07(火) 02:23:06
Yet Another Haskell Tutorial なんてどうよ
日本語サイト
http://www.sampou.org/cgi-bin/haskell.cgi
http://shidot.dyndns.org/hs/

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

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

・2chの仕様により、行頭の半角スペースは表示されません。
 コードをインデントしたいときは、代わりに&amp;nbsp;または全角スペースを使うことができます。
9932: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/
994デフォルトの名無しさん:2006/11/07(火) 18:39:55
>>3は変更無し。
995デフォルトの名無しさん:2006/11/07(火) 21:26:29
立ててきた

関数型プログラミング言語Haskell Part6
http://pc8.2ch.net/test/read.cgi/tech/1162902266/
996デフォルトの名無しさん:2006/11/07(火) 22:46:03

せんとりがっせんいくぞごらぁー(AA略
997デフォルトの名無しさん:2006/11/07(火) 22:49:47

あらいぐまハスケル
あらいぐまハスケル
あらいぐまハスケル
998デフォルトの名無しさん:2006/11/07(火) 22:51:04
  ∧,,∧
 (;`・ω・)  。・゚・⌒) 今夜はハスケルです。オセロゲーム作るよ!!
 /   o━ヽニニフ))
 しー-J


        アッ! 。・゚・
  ∧,,∧ て     。・゚・。・゚・
 (; ´゚ω゚)て   //
 /   o━ヽニニフ
 しー-J    彡


    ∧,,∧    ショボーン
   ( ´・ω・)
  c(,_U_U      ・゚・。・ ゚・。・゚・ 。・゚・
     ━ヽニニフ

                 よしバレてない
           クルッ ∧,,∧  
             ミ(・ω・´ )つ サッサ
             c( U・ ゚U。彡・ 。・゚・ 
     ━ヽニニフ

                             
     ∧,,∧   。・。゚・。 ゚・。゚・ モナド〜
    ( ´・ω・)つ\・゚・ 。・゚・・/
999デフォルトの名無しさん:2006/11/07(火) 22:52:50
   ハ、ハ、スー ケル ♪
      \ハスケッ、ススン、ハ、ケルッ/
       ♪ ('A`) ♪
        _ ノ  )>_ キュッキュ♪
      /.◎。/◎。/|
      | ̄ ̄ ̄ ̄ ̄|
1000デフォルトの名無しさん:2006/11/07(火) 22:54:22
               ┌┐                                ●●●
    人          ││                              ●\  ●\
   ノ二\  ナ ゝゝ   V                 ●●●        ●\     ●\
     /   / 乙 つ  O               ●\   ●\      ●\       ●\
                  ●●●        ●\     ●\    ●\       ●\
                 ●\   ●\      ●\      ●\    ●\        ●\
       ●●\     ●\     ●\    ●\       ●\   ●\        ●\
        ●\    ●\      ●\    ●\       ●\    ●\       ●\
        ●\    ●\      ●\    ●\      ●\    ●\     ●\
       ●\    ●\       ●\    ●\      ●\      ●\    ●\
       ●\    ●\      ●\    ●\     ●\        ●●● \
      ●\     ●\      ●\      ●\   ●\           \\\
      ●\     ●\     ●\        ●●● \
     ●\      ●\   ●\           \\\
     ●\        ●●● \                              ┌┐ ┌┐
    ●\          \\\      ┣━┳┃┃      ┃          ││ ││
   ●●●\                      ┃   ┃┃┃ ┣┓ ━╋ ━╋  V   V
   \\\\                     ┛     ━┛ ┃   ┏┫ ┏┫  O  O

     /■\    )      (´⌒(´
  ⊂(゚Д゚⊂⌒`つ≡≡≡(´⌒;;;≡≡≡
      ズザーーーーーッ
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。