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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
haskell.org
http://www.haskell.org/

日本語サイト
http://www.sampou.org/cgi-bin/haskell.cgi
http://www.shido.info/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/
Part6 http://pc11.2ch.net/test/read.cgi/tech/1162902266/
Part7 http://pc11.2ch.net/test/read.cgi/tech/1174211797/
Part8 http://pc11.2ch.net/test/read.cgi/tech/1193743693/
・2chの仕様により、行頭の半角スペースは表示されません。
 コードをインデントしたいときは、代わりに または全角スペースを使うことができます。
2デフォルトの名無しさん:2008/05/17(土) 16:42:18
関連書籍
・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/
3デフォルトの名無しさん:2008/05/17(土) 16:42:39
関連スレ
・関数型言語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 5
 http://pc11.2ch.net/test/read.cgi/tech/1186292994/
・Lisp Scheme Part21
 http://pc11.2ch.net/test/read.cgi/tech/1207300697/
・【入門】CommonLispその4【質問よろず】
 http://pc11.2ch.net/test/read.cgi/tech/1201402366/
・Emacs Lisp 3
 http://pc11.2ch.net/test/read.cgi/tech/1191875993/
4デフォルトの名無しさん:2008/05/17(土) 16:43:00
・日本語の扱いについて

Haskell98によると、Charは一つのUnicode文字を表す(6.1.2)。
これに従って、比較的新しいHugsやGHC(6.4系を含む)ではCharは32ビット整数になっている。
ただし、どちらも入出力に際しての変換が完全でない。具体的には、
・ソースコード中の文字列リテラル
・System.IOライブラリでの入出力
が問題になる。

1. GHC6.4.2以前
ソースコード・入出力ともLatin-1を仮定する。Latin-1ではバイト値と
コードポイントが一致するので、入力時には外部エンコードの各バイトがそのままCharに
入り、出力時にはCharの下位8ビットのみが出力されるような実装になっている。
このため、あるエンコーディング(Latin-1とは限らない)の入力をgetLineで受け取り、
それをそのままputStrで表示すれば、入力時とおなじエンコードにおいて正しく表示される。
これを利用して、[Char]を、本来のコードポイントの列としてではなく、特定のエンコードの下での
バイト列として使うことができる。ただし文字列リテラルについては、GHCはLatin-1として
不正な文字を受け付けないので、EUC-JPのような例外を除くと、単純にリテラルを使うことはできない。

2. GHC6.6
ソースコードにはUTF-8、入出力にはLatin-1を仮定する。このため、EUC-JPでリテラルを直に
書くことはできない。

(続く)
5デフォルトの名無しさん:2008/05/17(土) 16:43:20
(続き)

3.最近のHugs(非WindowsかつCのwchar_tがUnicodeの環境、というかLinux)
ソースコード・入出力ともロケールのエンコードを利用する。

4.最近のHugs(Windows)
ソースコード・入出力ともLatin-1を仮定する。ただし文字列リテラルにShift-JISを使ってもエラーにならない。

5.最近のHugs(それ以外)
未調査。

・結局どうするか。
規格どおりにCharにUnicodeを入れるか、Charを単なるバイトとして扱うかの二択。

i. CharをUnicodeとして扱う
(3)以外の場合入出力で変換が必要。(2)または(3)以外の場合文字列リテラルでは
明示的なエスケープ(たとえば"\22234")が必要。

ii. Charをバイトとして扱う
(3)ではファイルをバイナリモードで開くなどの対策が必要。(1)でEUC-JPを使う場合と(4)
を除き文字列リテラルでは明示的なエスケープ(たとえば"\143\153")が必要。
lengthやisAlphaのような関数、およびwin32パッケージの関数(win32API)が正しく動作しない。
6デフォルトの名無しさん:2008/05/17(土) 16:43:41
テンプレはここまで。
前スレが終わってからしばらく建ってなかったので建てました。
行き届かないところがあったらごめんなさい。
7デフォルトの名無しさん:2008/05/17(土) 17:05:58
      _
   , '´ λ ヽ   
    !,.イリノ)))〉   
    リ)^ヮ^ノ|  このスレのマスコットキャラ
   ノ⊂)水!つ     
  ((( く/_l〉 リ  はすけるたん    
   `` し'ノ
8デフォルトの名無しさん:2008/05/17(土) 18:53:58
質問です

Word8からWord32に変換する方法についてなのですが、
Word8からtoInteger・fromInteger関数を経てWord32に変換する以外に、
クレバーな方法はありませんか?
9デフォルトの名無しさん:2008/05/17(土) 18:54:51
10デフォルトの名無しさん:2008/05/17(土) 19:44:18
>>8
n(n-1)個のcastを用意するのが
2n個のcastを用意するよりクレバーだと思いますか?
11デフォルトの名無しさん:2008/05/17(土) 20:00:31
そろそろ、テンプレの GHC 6.6 の日本語の取り扱いについて書き改めて欲しい。
1. ソース中の文字列 hello = "こんにちは" :: String は UTF-8
2. これを ghci で表示することは可能:(ただし、環境変数 LANG を UTF-8 にしておくこと、また、ターミナルも UTF-8 で入出力できるようにしておくこと)
Main> print hello
こんにちは
Main>
3. 入出力 IO は Latin-1 だが、package utf8-string (http://code.haskell.org/utf8-string/) を導入することにより、入出力を UTF-8 にすることができる
4. その他の文字列エンコード(ShiftJIS, JIS, EUC-JP など) は、package iconv (http://hackage.haskell.org/cgi-bin/hackage-scripts/package/iconv) で UTF-8 な文字列にする
とまあ、こういうことで、日本語表示できるわけだ。iconv package は MacOSX と *BSD では cabal を少しいじらなければいけないことに注意しろよ(iconv.cabal のコメントに書いてある)
よろしくたのむ、な。
12sage:2008/05/17(土) 20:05:38
>>8
toEnum . fromEnum でよくね
13デフォルトの名無しさん:2008/05/17(土) 21:23:49
>>11
>1. ソース中の文字列 hello = "こんにちは" :: String は UTF-8
これどういう意味?Stringになってしまえば文字コード関係なくね?

>2. これを ghci で表示することは可能
*Main> print hello
"\12371\12435\12395\12385\12399"
こうなった
14デフォルトの名無しさん:2008/05/17(土) 21:25:11
>>8
fromIntegral :: (Integral a, Num b) => a -> b
fromIntegral = fromInteger . toInteger
という関数がある
15デフォルトの名無しさん:2008/05/17(土) 21:41:45
fromIntegralはGHCだといろいろ特殊化されてて効率もいいしな
16デフォルトの名無しさん:2008/05/18(日) 08:26:56
新スレ乙です。

上げていただいている関連書籍で、

・Introduction to Functional Programming Using Haskell
・Haskell: The Craft of Functional Programming

は読み終えて、

・The Haskell School of Expression: Learning Functional Programming Through Multimedia

を問題解きつつ進めているところですけど、

・The Fun of Programming

次はこちらがいいんでしょうか。それともネット上の新しい記事とかを
見ていくほうがいいですか?

17デフォルトの名無しさん:2008/05/18(日) 09:26:23
>>16
The Haskell Programmer's Guide to the IO Monad ― Don't Panic
http://stefan-klinger.de/files/monadGuide.pdf
は、Haskellのモナドを理解するのにおすすめ。
18デフォルトの名無しさん:2008/05/18(日) 12:25:58
質問です。

100MB程度の音楽データを編集するツールを作ろうと思っているのですが、
音楽データを格納するための型のお勧めは何ですか?
19デフォルトの名無しさん:2008/05/18(日) 12:39:36
音楽データって波形データ?

音楽ツールのことは良く知らないから一般的なことだけ言うと、
Haskellで配列っぽいデータを扱うときに一番空間効率がいいのは非ボックス化配列
(具体的にはUArrayかIOUArrayかSTUArray)で、Cの配列と同じくらいコンパクト
ただし、これは生の配列だから切ったり貼ったりするのには向かない
切り貼りしたいなら、「非ボックス化配列を葉とする木」みたいな構造が必要かも

ところで音楽編集ソフトって全部メモリ上で作業するんだろうか
20デフォルトの名無しさん:2008/05/18(日) 22:20:25
>>17
ありがとうございます。文系なので理解できるか不安ですがw。

一通りの基本構文については馴染んできたと思うので、もう少し
アプリ全体の構成などについての解説文書みたいなものって
ありますでしょうか。

或いは、モナドもその一つだと思うのですが、関数型によるプログラミング
テクニックというんでしょうか、そういったものがもう少しまとまっている
本があると嬉しいんですが。
21デフォルトの名無しさん:2008/05/18(日) 23:25:58
文系出身のやつって知ったかぶり多いよな。
細かいこと考えないのが吉なのか凶なのか。
22デフォルトの名無しさん:2008/05/18(日) 23:34:12
絶対的な真理は無いという事を知ってるからじゃないかな。
23デフォルトの名無しさん:2008/05/18(日) 23:37:22
理系は論理を重視するんだよ。
真理?なにそれ食えるの?
24デフォルトの名無しさん:2008/05/18(日) 23:40:59
例えば
4 :: Int
は絶対的な真理じゃね?
25デフォルトの名無しさん:2008/05/18(日) 23:50:33
論理は文系だろ
26デフォルトの名無しさん:2008/05/19(月) 00:15:42
はい?俺理系なんで良く分かりません。
ささ、次行きましょう
27デフォルトの名無しさん:2008/05/19(月) 00:16:50
>>24
その例のようなことが成り立つ数体系が便利だから、
たまたま人間が採用して「正しい」として使ってるだけとも言える

とはいえ、「数学は人間の存在にかかわらず成立するから
数学はこの世の真理の一つだ」と主張する哲学者もいたような
28デフォルトの名無しさん:2008/05/19(月) 00:19:33
哲学者なんてはったり言うだけのでくの坊だろ 次行くぞ次
29デフォルトの名無しさん:2008/05/19(月) 00:22:38
理系のやつって細かい事考えないんだな。
30デフォルトの名無しさん:2008/05/19(月) 00:27:10
>>27
言葉が足りなかったな

Haskell98における式「4」は、Haskell98における型式「Int」で表される型を持つ

と言えばよかったか
もちろんHaskell98ってのは地球でBC1998年に定義された「あの」Haskell98のことで、
「型」とか「式」とかの術語はHaskell98の仕様に従って解釈するものとしてね
31デフォルトの名無しさん:2008/05/19(月) 00:49:11
真理に「絶対的」なんて付けてるところを見ると
真理の意味が分かってないんだろ
32デフォルトの名無しさん:2008/05/19(月) 00:52:18
真理の意味をお願いします
33デフォルトの名無しさん:2008/05/19(月) 00:53:52
>>32
まことのことわり。
コレは絶対の真理。
34デフォルトの名無しさん:2008/05/19(月) 00:55:36
真理・・・いつもどんな時も変わることのない、正しい物事の筋道。真実の道理。
例:HaskellスレはHaskellを論ずる為に存在している

これでおk?
35デフォルトの名無しさん:2008/05/19(月) 00:55:40
理系の雑談っていつもこんななの?
36デフォルトの名無しさん:2008/05/19(月) 00:59:02
>>33-34
そこから >>31 を導出するのは至難だなw
37デフォルトの名無しさん:2008/05/19(月) 01:04:01
「真理」は既に絶対的なものだから「絶対的な真理」という表現は「絶対的」が重複しているってことだろ
38デフォルトの名無しさん:2008/05/19(月) 01:06:01
>>35
理系に限らず2chの雑談はどこもこんな感じです。
39デフォルトの名無しさん:2008/05/19(月) 01:07:30
今日はいつにもましてバカが多いな
春か?春だからなのか?
40デフォルトの名無しさん:2008/05/19(月) 01:19:01
>>37
修飾語は強調する為にも使うけど、意味内容の重複は許されないという主張?
41デフォルトの名無しさん:2008/05/19(月) 01:25:54
程度の存在しない物に強調もクソもないだろ
42デフォルトの名無しさん:2008/05/19(月) 01:31:46
あ、強調って分かり辛かったか。念押しだと考えてみな。
43デフォルトの名無しさん:2008/05/19(月) 13:06:15
程度の存在しない物に念押しもクソもないだろ
44デフォルトの名無しさん:2008/05/19(月) 13:50:33
まさに自転車置場の議論
45デフォルトの名無しさん:2008/05/19(月) 18:57:28
+++ってどういう意味なんですか?
+とか++とかもあってよくわからないのですが
46デフォルトの名無しさん:2008/05/19(月) 19:25:42
>>30
× haskell4000年の歴史
○ AD
47デフォルトの名無しさん:2008/05/19(月) 19:41:15
>>45
解らないなら使うな以上
48デフォルトの名無しさん:2008/05/19(月) 19:46:25
>>45
(+) は Integralクラスのインスタンス、つまり数の加法。
(++) は リストの結合。[1, 2, 3] ++ [4, 5, 6] は [1,2,3,4,5,6]。
(+++) は Arrowの合成かなにかに使う。Arrowは俺も良くわかんないし、まあ知らんでもプログラムは書けるから気にするな。
49デフォルトの名無しさん:2008/05/19(月) 19:46:29
>>45 型を見てみろ
50デフォルトの名無しさん:2008/05/19(月) 19:49:24
>>48
失敬!(+)はIntegralじゃなくてNumクラスのインスタンスの加法だな。
51デフォルトの名無しさん:2008/05/19(月) 20:03:27
質問です。

「16文字のString型」という定義は型定義の段階でできるのでしょうか?
52デフォルトの名無しさん:2008/05/19(月) 20:11:35
>>48
ありがとうございます
53デフォルトの名無しさん:2008/05/19(月) 20:14:01
>>51
絶対の真理
5420:2008/05/19(月) 22:42:22
「文系」という一言でスレがこんなに伸びるとは思いませんでしたw。
ちなみに自分は理系人間に対しては羨望の眼差しで見ています。

The Fun of Programming って読んだ方いらっしゃいますでしょうか。
55デフォルトの名無しさん:2008/05/19(月) 23:25:55
今日先輩にHaskellできると
彼女ができると聞いたのですが
みなさんは彼女いてますか?
56デフォルトの名無しさん:2008/05/19(月) 23:39:55
>>55
55人ぐらいいるよ。
57デフォルトの名無しさん:2008/05/20(火) 03:13:47
>>16
そんな教科書ばっか読んでなにがしたいの?

>>20
Haskellで書かれたアプリのコード読め。
58デフォルトの名無しさん:2008/05/20(火) 22:55:17
Monagiusは勉強になる。
59デフォルトの名無しさん:2008/05/20(火) 23:03:23
monadiusはもはや古いぞ。
今はもっと洗練されてる。
60デフォルトの名無しさん:2008/05/21(水) 00:08:32
Little Haskeller読んで学習中。日本語版もホスイ
61デフォルトの名無しさん:2008/05/21(水) 01:40:02
>>60
それってリトル隙間の姉妹本?
62デフォルトの名無しさん:2008/05/21(水) 02:51:30
mod_haskell.soまだー?
63デフォルトの名無しさん:2008/05/21(水) 03:51:48
>>62
まってないで作って公開しろ
64デフォルトの名無しさん:2008/05/21(水) 23:00:47
>>59
今って例えばどれ?
65デフォルトの名無しさん:2008/05/22(木) 03:04:27
http://www.geocities.jp/takascience/doc/monadius-kof.pdf
古いというか、力技で作ったって感じ。
>>59はFRPを念頭においてるんだろうけど、
FragのObjectBehaviorなんかが洗練されてるのかは微妙。
66デフォルトの名無しさん:2008/05/22(木) 19:37:06
質問です。

0〜10までの整数を定義した型というのは宣言できますか?
67デフォルトの名無しさん:2008/05/23(金) 01:04:34
>>27
数学基礎論がまるで分からないんだね。
68初心者修業中:2008/05/23(金) 02:23:32
>>66
data Hoge = Hoge0|Hoge1|Hoge2|Hoge3|…|Hoge10

これじゃ駄目?
69デフォルトの名無しさん:2008/05/23(金) 07:10:08
数学できない奴くるな
70デフォルトの名無しさん:2008/05/23(金) 13:34:41
haskell関係の文書(特に論文)を読みたくてhaskell.orgをあさってるんだけど
沢山あるからどれを読もうか迷ってしまう
このスレ的に、コレは読んでおいて損は無い!って奴あったら教えてくらはい
今のとこ読んだのはImperative functional programmingとLazy vs Strictと
Haskell vs. Ada vs. C++ vs. Awk vs. ...
71デフォルトの名無しさん:2008/05/23(金) 13:47:07
Tackling the awkward squad
72デフォルトの名無しさん:2008/05/23(金) 13:49:13
もうここで紹介される論文はすべて読んだんだよなぁ。
2chは時代遅れ情報しか出てこねーな。noobどもしかいねぇ。
73デフォルトの名無しさん:2008/05/23(金) 13:53:08
2chの情報に価値がないと思うなら立ち去ればいいじゃないか!
74デフォルトの名無しさん:2008/05/23(金) 14:18:52
>>71
落として読んでみるよー
他にもあったら是非教えてクレクレ
>>72
玄人さん面白かった論文教えて
75デフォルトの名無しさん:2008/05/23(金) 14:36:10
>>69
そんな事を言う奴が来るな!
数学なんぞできんでもプログラムはできる!!
76デフォルトの名無しさん:2008/05/23(金) 14:49:15
最初のうちはな
手続き型にどっぷり浸かった後で関数型言語を触って嵌ってしまったやつは
やつは皆計算機科学の世界に飛び込み二度と帰ってこなくなっちまうものなのさ

「コード書いてるより数式弄くってるほうが楽しいおwwww」
俺の同僚の最後の言葉さ・・・
77デフォルトの名無しさん:2008/05/23(金) 16:03:56
だからオブジェクト指向が生き残るのですね
78デフォルトの名無しさん:2008/05/23(金) 18:02:35
最近、自作のソースをarrowで設計段階からやり直そうとしているんだけど、
いまいちメリットが無いんだよなぁ。
前のコードの方が短かったし、arrowにしたせいで複雑になってしまうことも多々ある。
arrowのメリットを具体的に教えてくださいよ。
論文読んでみてもarrowのうまみが伝わってこないんだよね。
79デフォルトの名無しさん:2008/05/23(金) 18:31:30
難読化
80デフォルトの名無しさん:2008/05/23(金) 19:12:20
どんなものが分かりやすいかなんて人それぞれだし
arrowを使ったほうが分かりやすいって感じる人も少しはいるでしょうから
そういう人が勝手に使ってればそれでいいんでしょう
8136 ◆K0BqlCB3.k :2008/05/23(金) 19:20:21
arrowを使ったプログラミングでは設計段階で図式化しやすいところにうまみがあるのかな?
8236 ◆K0BqlCB3.k :2008/05/23(金) 19:21:01
ミスってコテハンつけちゃったぜ
83デフォルトの名無しさん:2008/05/23(金) 19:39:51
>>82
warrockに帰れwww
84デフォルトの名無しさん:2008/05/23(金) 19:58:07
>>78
(モナドと比較した場合)arrowの旨みって、モナドではないがarrowである型があるっていう一点じゃないの?
そういう型を扱うときはarrowの枠組みが便利というだけ
8536 ◆K0BqlCB3.k :2008/05/23(金) 20:07:01
っていうかさ、俺は(\x -> (x, x))とかして処理を分けるのをいちいち書くのがめんどくさいときにarrow使うぜ
86デフォルトの名無しさん:2008/05/23(金) 20:12:53
>>85
確かにそれは慣れれば便利かもな
でも、Arrow (->)という特定のインスタンスを使ってるだけなら、
>>78が言ってるようなArrowの旨味とは別の話な気がする
87デフォルトの名無しさん:2008/05/23(金) 23:35:21
>>71
ちょwwBeautiful Codeって本みながら、たまたまスレ覗いたら、
本の中でソレ紹介されてたぞww
88デフォルトの名無しさん:2008/05/24(土) 00:10:42
arrowって今のところ
解析関係かデバッグ関係
形式証明以外使えそうな分野
無い
89デフォルトの名無しさん:2008/05/24(土) 04:49:01
分かってねーな
90デフォルトの名無しさん:2008/05/24(土) 04:59:31
分かってねーなじゃわからないっす。
91デフォルトの名無しさん:2008/05/24(土) 22:25:11
>>76
関数型が好きな理由は、所謂プログラミングの面白さがあるからではないな。
92デフォルトの名無しさん:2008/05/25(日) 00:01:55
do { ... } は「アクションっていう値」という認識でいいの?
93初心者修業中:2008/05/25(日) 00:18:03
>>92
do構文はbind演算子で結合された式を
手続型言語っぽく見せる糖衣構文と認識してますが。
94デフォルトの名無しさん:2008/05/25(日) 01:33:41
>>92
do{...}が値を持つ単なる式であるか、という質問ならそのとおり
>>93が言うようにdo式は構文糖で、bind演算子(>>=)の略記
do式の値が(広い意味で)アクションか、という質問ならそのとおり
具体的には、IOモナドに関するdo式なら値はIOアクション、リストモナドならリスト、という具合
9592:2008/05/25(日) 01:35:15
>>94
そういう意図の質問でした。ありがとう。
96初心者修業中:2008/05/25(日) 02:31:03
>>94

>(広い意味で)アクション
の意味がわかりません。

Maybeも(広い意味で)アクションなのでしょうか?
97デフォルトの名無しさん:2008/05/25(日) 03:08:50
>>96
そういうつもりで書いた
一般的でない用語法だったらすまん
98デフォルトの名無しさん:2008/05/25(日) 03:28:30
Just x : なにもしないでxを返すアクション
Nothing : 計算を即座に終了させるアクション
99デフォルトの名無しさん:2008/05/25(日) 07:33:24
f x: xにfを適用するアクション
1 + 2: 1と2を加えるアクション
100デフォルトの名無しさん:2008/05/25(日) 09:42:48
理系の方々に伺いたいんですけど、Haskellは数学で蓄積された
知識をダイレクトにコード化が可能だと感じますか?

Cなんかだと似ても似つかないものにしないといけませんよね。
数学的なモデルのシュミレーションなんかを記述する際に、
正しく書くのは結構大変じゃないかと思ってしまいます。

そういう点で、Haskellはそのままとは言いませんが書きやすいの
かなぁと。だけど、僕の知人で理系の人たちはC言語使う場合が
多いようです。最大の理由はスピードだそうですが、手間を考えると
早い計算機使ってHaskellで書いた方がいい、という考えの人も
いるんでしょうか。
101デフォルトの名無しさん:2008/05/25(日) 10:41:40
ダイレクト云々よりも
LINPACKが使えるかどうか
それが問題だ
102デフォルトの名無しさん:2008/05/25(日) 10:49:58
>>99
関数とアクションは同じものなの?
103デフォルトの名無しさん:2008/05/25(日) 10:55:25
>>102
別のものだよ
>>99はネタ(か、たちの悪い誤解)だから真に受けんな
104デフォルトの名無しさん:2008/05/25(日) 11:19:31
LINPACKとか言ってるおっさん
氏ねよw
105デフォルトの名無しさん:2008/05/25(日) 11:24:30
>>100
0か1かみたいな考え方は辞めた方がいいかと。
工学の人は合理的、合目的的に考えるから、適材適所でやります。

速い計算機に、さらに速いソフトウェアがあれば、より計算を回せます。
計算機が速いから、ソフトウェアは遅くていいなんてやり方じゃ、
ライバルに負けてしまいます。遊びならそれでもいいけど。
106デフォルトの名無しさん:2008/05/25(日) 11:39:54
107デフォルトの名無しさん:2008/05/25(日) 12:36:24
「アクション」ていうのはIOモナドだけじゃねえの?
Maybeとかでも「アクション」ていうの?
108デフォルトの名無しさん:2008/05/25(日) 12:43:09
少なくともStateとかSTMモナドではアクションって言うよ
109デフォルトの名無しさん:2008/05/25(日) 12:43:17
自分もActionというのはIOだけを指しているのだと思ってました。要するに
関数の外の世界に対して、関数の動きが影響を与えたり、逆の現象が発生
するのがActionであり、IO型であると。

IOがモナドなのは、モナド則に当てはまるから、ってだけではないでしょうか?
110デフォルトの名無しさん:2008/05/25(日) 13:21:38
モナド則に当てはまらないものをモナドと言うわけないでしょ。
111デフォルトの名無しさん:2008/05/25(日) 13:24:07
>>105
そうそう、その時点その時点でのベストを尽くします。そして、過去の仕事に対するリスペクトも忘れません。
112デフォルトの名無しさん:2008/05/25(日) 15:24:57
質問です

たとえば
data Hoge = Hoge { x1 :: Word32, x2 :: Word32, x3 :: Word16, x4 :: Word16}
のようなHogeを[Word8]と相互変換する便利な方法ってないでしょうか?
113デフォルトの名無しさん:2008/05/25(日) 15:29:12
使ったことないけどSerTHとか?
114デフォルトの名無しさん:2008/05/25(日) 15:33:25
>>113
へえ・・・ 何となくおもしろそう
ドキュメントとか読んでみます
115デフォルトの名無しさん:2008/05/25(日) 15:58:20
SerTH見てみましたけれど、どうやら私の用向きとは違うようですね。
116デフォルトの名無しさん:2008/05/25(日) 16:02:02
Template Haskellの方もちょっと見てみます
117デフォルトの名無しさん:2008/05/26(月) 00:05:41
計算理論の基礎
計算機プログラムの構造と解釈

ってどっち買ったらいいの?
なんか最近数学の基礎たりねー
118デフォルトの名無しさん:2008/05/26(月) 00:17:22
ちなみに計算理論の基礎が
つい先日第2版が出たので聞いてみた
私事だけど金がないので優先度が欲しい
119デフォルトの名無しさん:2008/05/26(月) 07:36:44
後者は原著がネット上で無料で読めるから前者
120デフォルトの名無しさん:2008/05/26(月) 09:26:17
というか全然違う傾向のほんのどっちがいいか聞かれても…
しかもHaskellには関係ない
推薦図書スレは別にあるよ
121デフォルトの名無しさん:2008/05/26(月) 14:08:03
12236 ◆K0BqlCB3.k :2008/05/26(月) 15:31:05
全く調べずに聞くが、concurrent arrowなんてのは無いの?
arrow使ってていつも思うんだが、並列処理に向いてなくない?
FPGAとかのHDL記述とかに応用したりしてる人いないの?
123デフォルトの名無しさん:2008/05/26(月) 22:01:15
>>117
若いうちに読んどいた方がいいのは計算理論の基礎 の方だろ。
計算機プログラムの構造と解釈は仕事で必要になってからで十分。
124デフォルトの名無しさん:2008/05/26(月) 22:17:09
>>123
独学でやってしまった奴は
次何すればいいの?
とりあえず今自習でλの数学側の
側面勉強してみているが
何の役に立つかわからん
125デフォルトの名無しさん:2008/05/26(月) 22:24:27
絵を描いて学ぶ・プログラマのためのラムダ計算
http://d.hatena.ne.jp/m-hiyama/20070220/1171956186
126デフォルトの名無しさん:2008/05/26(月) 22:27:23
僕が「ラムダ計算は知っておいたほうがいい」と思う理由は、形式的計算体系としての“純粋ラムダ計算”が理論的に重要だから、というだけではありません。
むしろ、次に述べるようなことがより大きな動機となります。
まず、関数を表現する方法としてのラムダ記法(lambda notation)に慣れて、紙と鉛筆によるインフォーマルなラムダ計算が出来ると、
けっこうそれを使える場面が多いのです。例えば、「JavaScriptによるテンプレート・モナド、すっげー簡単!」の最後で、モナド法則を示すために、
インフォーマルなラムダ計算を使っています。
ある種の計算的実体(例:クロージャ)や計算手法(例:継続ベースの計算)の説明にもラムダ式がよく使われます。
式言語(EL; expression language)に対する処理系(パーザーやエバリュエータ)を作る場合なども、ラムダ計算が良いヒントになるでしょう。
もちろんラムダ計算は、既存の関数型言語を理解する基盤となります。あるいは、新しいプログラミング言語を設計する際にもラムダ計算が規範になるかも知れません。
127デフォルトの名無しさん:2008/05/26(月) 22:45:04
そもそも計算とはいったいなんなんだ?
128デフォルトの名無しさん:2008/05/26(月) 23:36:50
後者関数ってなんだぉ?
129デフォルトの名無しさん:2008/05/27(火) 00:14:01
やっぱ手書きしねーと理解できねーよw
130デフォルトの名無しさん:2008/05/27(火) 07:23:35
data type Nat = O | S Nat
という定義で自然数(0以上の整数)が表現できる。(ペアノの公理を満たす)
このとき S のことを後者関数(successor function)と呼ぶ。
131デフォルトの名無しさん:2008/05/27(火) 11:39:43
ここで
定義に再帰を使っていいんですか?
とか聞くとYコンビネータとか出てきちゃうんだろうか
132デフォルトの名無しさん:2008/05/27(火) 16:49:17
質問です

yampaっていったい何ですか?
ごく簡単に馬鹿でもわかるように概要を説明してください
133デフォルトの名無しさん:2008/05/27(火) 19:16:35
134デフォルトの名無しさん:2008/05/27(火) 20:06:04
>>132
http://ll.jus.or.jp/llw2004/program/Reactive.pdf
5ページ目
Haskell による Arrowised Functional Reactive
Programming という実装
135デフォルトの名無しさん:2008/05/27(火) 22:54:50
Yampaってコンパみたいなもん?
136デフォルトの名無しさん:2008/05/28(水) 07:20:03
>>127N.D.Jones, Computability and Complexity
その他良本情報はこちら
ttp://www.kurims.kyoto-u.ac.jp/~hassei/reading_list.html
137デフォルトの名無しさん:2008/05/31(土) 11:55:19
「The Haskell School of Expression」で使われているコードの
ファイルってどこかに落ちてませんかね。
138デフォルトの名無しさん:2008/05/31(土) 13:59:28
139デフォルトの名無しさん:2008/05/31(土) 14:22:28
>>138
あ、これってグラフィックライブラリだけじゃなくて、本のコードも
入ってるのか。勘違いしてた。ありがとう。
140デフォルトの名無しさん:2008/05/31(土) 20:44:19
comb :: Maybe a -> (a -> Maybe b) -> Maybe b

このときの

Maybe a -> (a -> Maybe b) ここまでが入力だよね?
2項目の引数が関数になっているって解釈でいいんだよね?
141デフォルトの名無しさん:2008/05/31(土) 21:04:28
うん
142デフォルトの名無しさん:2008/05/31(土) 21:41:20
違うだろw

入力 : Maybe a
出力 : (a -> Maybe b) -> Maybe b
143デフォルトの名無しさん:2008/05/31(土) 21:51:45
()でくくるとどうなるのw?
144デフォルトの名無しさん:2008/05/31(土) 21:52:57
>>142
同じことじゃねーか
関数を返す関数と二引数の関数を同一視するのはHaskellでは普通の習慣
145デフォルトの名無しさん:2008/05/31(土) 22:22:38
>>143
a -> Maybe b
っていう関数を引数にとるっていうことだよ
146初心者修業中:2008/05/31(土) 22:30:19
>>140
Maybe a -> (a -> Maybe b) の2つを入力とする事もできるし、
Maybe a だけを入力とする事もできる。

後者の場合は(a -> Maybe b) -> Maybe bの関数が出力となる。
これを部分適用といい、こういった事ができるのが
Haskellの魅力である。

…と認識しています。
147デフォルトの名無しさん:2008/05/31(土) 22:31:41
>>145
えっとねそれじゃあ
Maybe aと関数を引数に取るために
(a -> Maybe b)、この2つを与えてますよね?
関数渡すためにこう記述するしか方法がないから
そのようになっていると理解したてみたのですが
どうやら上の人曰く間違っているようで何が違うのでしょうか

Haskellはグラフ簡約によって1度に1つのTermを解釈していくだけ
なので、最終的な結果は高々1つになるはずだと思っていたのですが
どうやら違うようで混乱してきました。困った、不勉強だ困った
148デフォルトの名無しさん:2008/05/31(土) 22:38:00
>>143
右結合の二項演算子?である「->」の結合順序をデフォルトから変更している。

A -> B -> C -> D
は、「->」が右結合の二項演算子?であるがゆえに、
A -> (B -> (C -> D))
と解釈される。

A -> (B -> C) -> D
は、
A -> ((B -> C) -> D)
と解釈される。
149デフォルトの名無しさん:2008/05/31(土) 22:39:34
>>147
>どうやら上の人曰く間違っているようで
間違ってないよ
150デフォルトの名無しさん:2008/05/31(土) 22:55:51
>>147
> Haskellはグラフ簡約によって1度に1つのTermを解釈していくだけ
> なので、最終的な結果は高々1つになるはずだと思っていたのですが
> どうやら違うようで混乱してきました。困った、不勉強だ困った

型の問題と適用の問題が、頭のなかでうまく区別が付いていないのでは?

適用される関数はA -> (B -> C) -> D型で変化はないけど、

* A型の「値」に適用すると、(B -> C) -> D型の「値」(関数)が帰ってくる。
* A型の「値」と、 (B -> C)型の「値」(関数)の2引数に適用すると、D型の「値」が帰ってくる。

このように考えてはどうか。

これで納得できなければ、やっぱり単純に、
A -> (B -> C) -> D型は、A型の値をとって、(B -> C) -> D型の値を返す関数の「型」
という出発点に戻るべきかな。
151デフォルトの名無しさん:2008/05/31(土) 22:56:33
>>142が突っ込んでるのは

> Maybe a -> (a -> Maybe b) ここまでが入力だよね?

の部分。

> 2項目の引数が関数になっているって解釈でいいんだよね?

こっちは合ってる。
152デフォルトの名無しさん:2008/05/31(土) 23:54:09
カリー化とは何か?を書いた方がいいんではないでしょうか。

↓ではお願いします。
153デフォルトの名無しさん:2008/05/31(土) 23:58:34
この関数適用は出来損ないだ。食べられないよ。
154初心者修業中:2008/06/01(日) 01:08:22
カリー化とは、
複数の引数を持つ関数を
引数一つの関数の組み合せとする事。

…と認識しています。
155デフォルトの名無しさん:2008/06/01(日) 01:08:36
カリー化という言葉を見ると頭の中で
「カリンカカリンカ カリンカマヤ」という歌が繰り返されて止まらなくなる。
156デフォルトの名無しさん:2008/06/01(日) 01:54:38
おれもそうりかいしてる。<154
でも、カリー化ときいてターメリックをぶっかけてるイメージしかないw
157デフォルトの名無しさん:2008/06/01(日) 09:01:04
ガラムマサラとかも入れた方がいいのでは?
158デフォルトの名無しさん:2008/06/01(日) 10:27:15
エバラ化、桃屋化
159デフォルトの名無しさん:2008/06/01(日) 10:28:14
味の素化
160デフォルトの名無しさん:2008/06/01(日) 10:59:26
>>140
  A -> (B -> C)
というふうに切り出してしまったけど、これは本来の
  A → ((B → C) → D)
という結合関係を無視してる(「A -> (B -> C)」という型を扱うみたいに書いている)。
ってのが>>142でしょ。

カリー化の影響として、「複数の引数をとる」
  (A × (B → C)) → D
ことと、「関数を返す」ことの、どちらに主眼があるかが不明瞭になるってのがあると思うね。
161デフォルトの名無しさん:2008/06/01(日) 11:24:29
>>151>>160
その理屈は分かるんだが、カリー化を理解してるのか怪しい初心者に対して
混乱させるようなことを言うのは不親切だと思う
Maybe aと(a -> Maybe b)の二つが引数になっているという理解で正しい、と教えれば十分じゃないか
162デフォルトの名無しさん:2008/06/01(日) 11:29:36
f(a,b,c) = y
f : A×B×C→Y

f a b c = ((f a) b) c = y
(((f a) b) c) : Y
((f a) b) : C→Y
(f a) : B→(C→Y)
f : A→(B→(C→Y))
163デフォルトの名無しさん:2008/06/01(日) 11:48:09
> Maybe a -> (a -> Maybe b) ここまでが入力だよね?

「ここまでが引数リストに対応する部分だよね?」と読むと○
「ここまでが引数の型だよね?」と読むと× ← ちょっと窮屈な解釈かも、みたいな空気
164デフォルトの名無しさん:2008/06/01(日) 15:19:49
> Maybe a -> (a -> Maybe b) -> ここまでが入力だよね?

と書けばおk
165デフォルトの名無しさん:2008/06/01(日) 17:10:16
なるほどw
166デフォルトの名無しさん:2008/06/01(日) 23:06:52
複数引数の邪悪な関数をこらしめるのがカリー化です。
167デフォルトの名無しさん:2008/06/01(日) 23:33:45
それだけならタプルで渡せばいいだけじゃそ
168デフォルトの名無しさん:2008/06/01(日) 23:44:14

=>

これがよくわからん
169デフォルトの名無しさん:2008/06/01(日) 23:47:32
<コ:彡
170デフォルトの名無しさん:2008/06/02(月) 00:31:27
兄者…
171初心者修業中:2008/06/02(月) 01:36:10
>>168
:は、リストの先頭に要素を結合する演算子

=>の左辺(文脈)は、
多相的なデータを静的型チェックするために
コンパイラに与える条件


…と認識しています。
172OCamler:2008/06/03(火) 22:55:07
だれかもうちょっと正しいコメントを付けてやってください。お願いします。

173デフォルトの名無しさん:2008/06/04(水) 01:51:13
[1, 2, 3] ← ふつうの見やすい表記(ただし、本来のデータ構造が見えない)
1 : [2, 3]
1 : 2 : [3]
1 : 2 : 3 : [] ← 本来のデータ構築子 (:)(cons)、[](nil)で書く(ただし、いまいちリストに見えない)
1 : (2 : (3 : [])) ← 右結合性にたよらないで書く
(:) 1 ((:) 2 ((:) 3 [])) ← 演算子としての表記法をやめる(S式マゾ以外には読みにくい)
174初心者修業中:2008/06/04(水) 01:51:20
お願いします m(_ _)m
175デフォルトの名無しさん:2008/06/04(水) 03:18:52
Haskell実用経験皆無の俺が来ましたよ

>>168
4.1 Overview of Types and Classes
> but the type system has been extended with type classes (or just classes)
> that provide a structured way to introduce overloaded functions.

型クラスの存在意義がわかるかどうかだと思う。

整数の足し算と有理数の足し算って、ふつう同じ記号を使うけど、
計算の内容は違う(多重定義、オーバーロードされている)でしょ。
でも、共通の性質を考えたいときもある。
そのとき、ただ「共通の演算記号+を使っているから同類とみなす」では話にならないから、

twice :: a -> a
twice x = x + x -- 2倍したいけど、+の型などがコンパイル時に不明

+を「Numという型クラスの特徴」として整理して、整数や有理数はその特徴を共有している、とみなすと。

twice :: Num a => a -> a -- 「型aはクラスNumに属する(Numのインスタンスである)」という前提をする
twice x = x + x -- と、演算子+の存在と型が保証される

そんな感じ?(ごめん、確認してない)
176デフォルトの名無しさん:2008/06/04(水) 07:01:52
改めて見るとオーバーロードの解釈が破綻してるなw
すまぬ
177デフォルトの名無しさん:2008/06/05(木) 00:09:02
=>
C++のテンプレートの特殊化みたいなものか
演算子は定義されているけど特定の型じゃないと
処理できない場合、特定のの変数を特殊化すること
あるけど
178初心者修業中:2008/06/05(木) 00:54:30
>>177
日本語でお願いしますm(_ _)m
179デフォルトの名無しさん:2008/06/05(木) 08:24:10
Haskellian ももうブランドではなくなりましたね…
メジャーになった証か
180デフォルトの名無しさん:2008/06/05(木) 08:41:12
=> の意味は総称型に制限を与える、じゃだめなのかなぁ。

質問、というより興味本位のアンケート。
あなたが思うhaskellの面白いところってどこですか?
181デフォルトの名無しさん:2008/06/05(木) 09:05:56
アホな質問するスレがあるところ
182デフォルトの名無しさん:2008/06/05(木) 16:59:32
堅い言語なのに簡潔に書けるようになってるところが面白いと思うし、すごく好きだ
記号を多用してたり、インデントを使ってたり
183デフォルトの名無しさん:2008/06/05(木) 18:54:01
「haskell使ってる」と言うと、みんなに尊敬して貰えること
184デフォルトの名無しさん:2008/06/05(木) 19:19:05
>>180
高速化を考え出すと、すごくたいへんなところ。
185デフォルトの名無しさん:2008/06/05(木) 21:02:04
[(x,y) | x + y = 10]
186デフォルトの名無しさん:2008/06/05(木) 21:59:49
>>183
このスレ見てたらそう思えんわな、、、
187デフォルトの名無しさん:2008/06/05(木) 22:55:55
知らない人は知らないし、知ってる人はわかるもんな
しかしいい言語だ
188デフォルトの名無しさん:2008/06/05(木) 23:02:27
汎関数系の言語はC++もそうだが、
かなり野心的な言語設計になるね。
クラス囲い込み度が低いからだろうか。
189デフォルトの名無しさん:2008/06/05(木) 23:56:07
>>185
そんなのできたの!?と思って ghci で試したらできなかった。
ちょっと悲しくなった。
190デフォルトの名無しさん:2008/06/06(金) 00:00:22
インデントがよくわからなくて
エラーでていらつく
なんとかならんのかね?この糞言語
インデント制約糞なら最初からなんか
そういう機能入れろよなぁ

あーあー世界で最悪の糞言語だね
インデントのせいだけで
191デフォルトの名無しさん:2008/06/06(金) 00:12:41
>>190
そういう説もあります。
そうでないという説もあります。
192デフォルトの名無しさん:2008/06/06(金) 00:29:14
インデントがいやなら { } と ; で全部区切ればいいじゃん
一緒だよ
193デフォルトの名無しさん:2008/06/06(金) 00:37:44
traceの使い方qsortのサンプル使って
教えてくれませんか?

qsort _ [] = [] (1)
qsort f (x:xs) = before ++ (x : after) (2)
where before = qsort f (filter (not . (f x)) xs) (3)
after = qsort f (filter (f x) xs) (4)


どこにいれればいいのやらw
194デフォルトの名無しさん:2008/06/06(金) 03:41:00
それを見つけるのにもtraceが役立つのではないか
195初心者修業中:2008/06/06(金) 05:35:07
>>193
私はまだtraceに手を出すつもりはありませんが、
ググってみました。

参考になるでしょうか…?

第15回 Haskellでのデバッグのコツをつかむ
ttp://itpro.nikkeibp.co.jp/article/COLUMN/20071204/288630/?P=2
import Debug.Trace
quicksort[] = []
quicksort(x:xs) =
 trace ("x." ++ show x) $
 trace ("x." ++ show x ++ " > y." ++ show losort) $
 trace ("x." ++ show x ++ " <= y." ++ show hisort) $
 losort ++ [x] ++ hisort
   where
   losort = quicksort [y|y <- xs, y < x]
   hisort = quicksort [y|y <- xs, y >= x]

Main> quicksort [3,2..1]
x.3
x.2
x.1
x.1 > y.[]
x.1 <= y.[]
x.2 > y.[1]
x.2 <= y.[]
x.3 > y.[1,2]
x.3 <= y.[]
[1,2,3]
196デフォルトの名無しさん:2008/06/06(金) 07:41:25
[(x,y) | x <- [1..], y <- [1..], x+y = 10]
197初心者修業中:2008/06/06(金) 08:06:28
>>196
これ、やってみたけど止まりませんね…。

*Main> take 10 [(x,y)|x<-[0..],y<-[0..],(x+y)==10]
[(0,10)

x=0 のままyの無限リストを検索してるから当たり前ですけど…

*Main> take 10 [(x,y)|x<-[0..],y<-[0..]]
[(0,0),(0,1),(0,2),(0,3),(0,4),(0,5),(0,6),(0,7),(0,8),(0,9)]

↓みたいなリストを返す簡単な方法ありますかね…?
[(0,0),(1,0),(0,1),(2,0),(1,1),(0,2).....]

198初心者修業中:2008/06/06(金) 08:42:12
こんなもんかな…

tlist::[(Int,Int)]
tlist = concatMap (\n ->f n) [0..]
 where f = \n->take (n+1) $ iterate (\(x,y) ->(x-1,y+1)) (n,0)

*Main> take 10 tlist
[(0,0),(1,0),(0,1),(2,0),(1,1),(0,2),(3,0),(2,1),(1,2),(0,3)]

*Main> take 10 [(x,y)| (x,y)<-tlist, (x+y)==10]
[(10,0),(9,1),(8,2),(7,3),(6,4),(5,5),(4,6),(3,7),(2,8),(1,9)]
199デフォルトの名無しさん:2008/06/06(金) 08:43:25
つまらない答えだが

[(x,y) | k <- [0..], x <- [0..k], y <- [0..k], x + y == k]
200デフォルトの名無しさん:2008/06/06(金) 08:52:37
つまらないのならこれが一番
[(x, 10-x) | x <- [0..10]]
201デフォルトの名無しさん:2008/06/06(金) 08:54:12
>>199
間違ってるやん!
202デフォルトの名無しさん:2008/06/06(金) 09:51:55
[(a,b) | x <- [0..], y <- [0..x], x + y == 10, (a,b) <- [(x,y), (y,x)]]
こんなんできたっけ
203デフォルトの名無しさん:2008/06/06(金) 09:52:48
なんだ(a,b)って t <- [(x,y), (y,x)]
204デフォルトの名無しさん:2008/06/06(金) 10:16:24
>>190
Pythonに見られるインデントによる制御構造の是非
http://pc11.2ch.net/test/read.cgi/tech/1169473442/l50
205初心者修業中:2008/06/06(金) 14:27:09
>>202-203

なるほど、そういう事もできるのですね。

*Main> take 12 [t | x <- [0..], y <- [0..x], (x+y)==10, t<-[(x,y),(y,x)]]
[(5,5),(5,5),(6,4),(4,6),(7,3),(3,7),(8,2),(2,8),(9,1),(1,9),(10,0),(0,10)]

リストモナドの>>=はconcatMapでしたもんね。
勉強になります。

(5,5),(5,5)がだぶってるのが、おしいですね。
206デフォルトの名無しさん:2008/06/06(金) 15:16:52
GHC 6.8.3 まだー?
207デフォルトの名無しさん:2008/06/06(金) 18:05:51
>>206
作って公開してくれ。
208デフォルトの名無しさん:2008/06/07(土) 00:31:44
無明関数って何がうれしいの?
209デフォルトの名無しさん:2008/06/07(土) 00:52:24
いちいち関数の名前考えなくても良い
名前をつけるまでもない単純な関数を作る時に便利
210デフォルトの名無しさん:2008/06/07(土) 01:08:37
名前を付けることは名前空間を汚染すると言うこと
名前よりも式そのもののほうが理解しやすい場合もある
211デフォルトの名無しさん:2008/06/07(土) 01:24:35
getChar >>= \a -> getChar >>= \b -> putChar b >> putChar a
こういうのに名前つけるのはいやだな
212デフォルトの名無しさん:2008/06/07(土) 02:04:23
>>208
そういう話題は関数型言語スレのほうが向いている。
関数型言語一般について語れるよ。
213デフォルトの名無しさん:2008/06/07(土) 02:12:55
>>208
どんなバックグラウンドをもってる?関数型言語についての経験は?
手続き型の国の人ならば、わかりにくいところやね。
関数を変数でもたすってのは関数型では日常茶飯事なんですわ。
そこに便利さのヒントがアルよ。
214デフォルトの名無しさん:2008/06/07(土) 07:57:49
map (\(a, b) -> a+b) [(1,1), (2, 3) ..]
215デフォルトの名無しさん:2008/06/07(土) 10:56:31
>>213
手続きの国からワープしてきたのですが
関数を変数にするならポインタ渡せばよくないですか?

そうすれば、定義しても渡せますよね?
216デフォルトの名無しさん:2008/06/07(土) 11:20:46
名前があってもなくてもポインタ渡すのです

関数オブジェクトは、メソッドがひとつしかないクラスのインスタンス、に似ています
インスタンスに名前がついているとは限らないのです
217デフォルトの名無しさん:2008/06/07(土) 11:33:06
>>216
よくわからないぉ
もう少し詳しく説明してぉ?
218デフォルトの名無しさん:2008/06/07(土) 11:43:32
無明関数…悟りでも得たいのか?
219デフォルトの名無しさん:2008/06/07(土) 11:46:43
>>218
間違えただけだぉ気にしないで
220デフォルトの名無しさん:2008/06/07(土) 11:47:44
>>218
悟りは得るものではなく開くものです。
221デフォルトの名無しさん:2008/06/07(土) 12:06:14
名前を考えるのが面倒くさい
再利用しない
定義している箇所を探すのが面倒くさい
関数内部の処理が簡潔

のときは無名関数使いたくならないか?
222デフォルトの名無しさん:2008/06/07(土) 12:14:34
つーか、関数本体そのものずばりを一覧できる状態で渡しているのにわざわざ名前をつける必要があるのだろうか
223デフォルトの名無しさん:2008/06/07(土) 12:28:02
カリー化
(new Satori(x)).open(y)
224デフォルトの名無しさん:2008/06/07(土) 12:43:21
無名関数で再帰するにはどうすればいいですか
たとえば、
f n = if n == 1 then 1 else n * f (n-1)
はどのように書けばいいですか?
225デフォルトの名無しさん:2008/06/07(土) 12:46:45
fix (\f n -> if n == 1 then 1 else n * f (n-1))
むみょーん。Haskellian じゃないから fix があるかどうかシラネ
226デフォルトの名無しさん:2008/06/07(土) 12:49:20
型無し言語なら
(\f -> f f) (\f n -> if n == 1 then 1 else n * f f (n-1))
227デフォルトの名無しさん:2008/06/07(土) 12:54:26
あー、でも f って名前つけちゃったな
228デフォルトの名無しさん:2008/06/07(土) 13:11:01
>>225-226
ここはHaskellのスレですよ
229初心者修業中:2008/06/07(土) 13:17:55
>>225
Control.Monad.Fix にありますね。

fix :: (a -> a) -> a
fix f = let x = f x in x
230デフォルトの名無しさん:2008/06/07(土) 13:22:40
>>224
不動点演算のfixを使うようです。

Prelude> Control.Monad.Fix.fix(\f n -> if n == 1 then 1 else n * f (n-1)) 5
120
231デフォルトの名無しさん:2008/06/07(土) 14:00:44
(\y f -> f (y f)) (\y f -> f (y f)) (\y f -> f (y f)) (\y f -> f (y f)) ...
232デフォルトの名無しさん:2008/06/07(土) 14:16:56
>>224
... f ...
where f n = if n == 1 then 1 else n * f (n-1)
局所的な関数定義で代わりになるんじゃないの、というのはダメかな
233デフォルトの名無しさん:2008/06/07(土) 16:01:17
>>232に同意
234デフォルトの名無しさん:2008/06/07(土) 16:19:36
名前が付いてるからダメ
235デフォルトの名無しさん:2008/06/07(土) 16:37:58
... (f where f n = if n == 1 then 1 else n * f (n-1)) ...
こうかー
236デフォルトの名無しさん:2008/06/07(土) 17:21:15
>>235
whereが作るのは式じゃなくて節だから使える場所が決まってる(定義の後とかcase選択肢の後とか)
... (let f n = if n == 1 then 1 else n * f (n-1)) in f) ...
ならおk
237デフォルトの名無しさん:2008/06/07(土) 17:22:54
閉括弧が一個多かった
... (let f n = if n == 1 then 1 else n * f (n-1) in f) ...
238デフォルトの名無しさん:2008/06/09(月) 21:46:25
The Haskell School of Expressionで勉強してます。

この本の解答集のようなもの、ネットには無いでしょうか。

http://www.elbeno.com/haskell_soe_blog/

↑このページは参照してますけど、11章までなので、全部が
まとまったのがあると嬉しいです。
239デフォルトの名無しさん:2008/06/16(月) 14:44:56
ポイントフリースタイルについて質問なんですが、
Haskellでは原理的にどんな関数でもポイントフリースタイルに
変形可能なのでしょうか。
240デフォルトの名無しさん:2008/06/16(月) 15:00:34
うん
241デフォルトの名無しさん:2008/06/16(月) 18:48:23
>>239
Sコンビネータとかもポイントフリーに出来るんだっけか?
242デフォルトの名無しさん:2008/06/16(月) 18:52:01
どの範囲の関数まで使用を認めるかによるな

>>241
Control.Monad.ap :: (Monad m) => m (a -> b) -> m a -> m b
を(->) rモナドについて使えば、Sコンビネータそのもの
243デフォルトの名無しさん:2008/06/17(火) 22:58:00
ポイントフリーのポイントって何?
何が自由なの?
244デフォルトの名無しさん:2008/06/17(火) 23:28:00
ポイント = initial objectからのarrow
ポイントフリースタイル = ポイントを使わない関数定義
245デフォルトの名無しさん:2008/06/18(水) 00:11:23
(Monad m) => m (a -> b) -> m a -> m b

これって未だによくわからないけど
手計算できそうな実例ないですか?
246デフォルトの名無しさん:2008/06/18(水) 00:28:46
あんまり意味ないけど↓こんなのとか?

f :: Monad m => m (a -> b) -> m a -> m b
f mg mx = do { g <- mg; x <- mx; return $ g x }

test1 = f Nothing (Just 1)
test2 = f (Just succ) (Just 2)
test3 = f (Just id) Nothing
test4 = f [] []
test5 = f [id] [5]
test6 = f [id, succ, (* 2)] [6, 9]
247デフォルトの名無しさん:2008/06/18(水) 09:12:38
GHC 6.8.3リリース
248デフォルトの名無しさん:2008/06/18(水) 11:53:17
ナイス
249デフォルトの名無しさん:2008/06/18(水) 14:40:13
>>244
initial object(始対象)じゃなくて terminal object(始対象)だお。

集合の圏で terminal object からの arrow というと一点集合に相当する。
集合の圏では任意の一点集合 x に対して f x = g x ならば f = g
「point(一点集合)を使わずに関数が等しいことを表現できる」=>「ポイントフリー」ということだと思う。
250デフォルトの名無しさん:2008/06/18(水) 18:25:28
>>249
失礼、書き間違えた。
terminal object(終対象)だな。
251249:2008/06/18(水) 18:26:24
× terminal object(始対象)
○ terminal object(終対象)
だった。
252デフォルトの名無しさん:2008/06/20(金) 11:33:25
俺やべぇ
気がついたらポイントフリースタイルで5行も書いてたぜ
これはもはや関数型スパゲッティだな
253デフォルトの名無しさん:2008/06/20(金) 12:48:07
任意のλ式はSKコンビネータで書き換えられるとか言うのを見て
実際に適当なλ式で変換してみたら出てきた式はとても読める
代物ではなかったのを思い出した
254デフォルトの名無しさん:2008/06/20(金) 15:00:42
ありゃ一種の難読化だよな
255デフォルトの名無しさん:2008/06/20(金) 18:06:18
>>253
SKコンビネータも、名前付きにできると若干読みやすそうだけど。
っていうか、それが出来たら、どんな高級言語とも変らんという話になって、逆に面白さがないか。
256デフォルトの名無しさん:2008/06/20(金) 19:22:12
>>255
そこでunlambdaですよ!
257デフォルトの名無しさん:2008/06/21(土) 00:27:42
>>255
つ super combinator
258デフォルトの名無しさん:2008/06/22(日) 17:45:00
以下の関数fをもっと簡単にする方法ありませんか?

f [] = []
f (_:[]) = []
f (x:xs) = (x, head xs) : f xs
259デフォルトの名無しさん:2008/06/22(日) 17:52:53
簡単に、というより再帰を使わずにできませんか?
260デフォルトの名無しさん:2008/06/22(日) 18:05:14
f xs = zip xs (tail xs)
261デフォルトの名無しさん:2008/06/23(月) 18:15:27
f xs = zip xs (drop 1l xs)
262261:2008/06/23(月) 19:03:55
すまん。tail の l を残してしまった。

f xs = zip xs (drop 1 xs)
263デフォルトの名無しさん:2008/06/23(月) 19:21:38
zip [] ⊥ = []
らしいから>>260>>261は等価かな
こういうのを意識しないといけない場面だと非正格性が気持ち悪い
264デフォルトの名無しさん:2008/06/24(火) 00:09:28
>>263
⊥って勃起してるのw?
265デフォルトの名無しさん:2008/06/24(火) 01:03:13
いやむしろ tail で書けて気持ちいいだろ。
266デフォルトの名無しさん:2008/06/24(火) 06:18:25
>>265
でも
zip (tail xs) xs

zip (drop 1 xs) xs
は等価じゃない
つまり、zipでは第一引数が先に評価されるということを覚えていないといけない分、ややこしい
(厳密には評価順の問題じゃなくて「zipは第一引数について正格で第二引数について非正格」ということだけど)
267デフォルトの名無しさん:2008/06/24(火) 07:48:57
>>266 どういうこと?
例えば
f (x1 : x2 : x3 : xs) -> x1 + x3
だったら、引数のリストの最初の要素と3番目の要素について正格ってこと?
268デフォルトの名無しさん:2008/06/24(火) 08:32:09
>>267
そういうつもりで「正格」という言葉を使った
269初心者修業中:2008/06/24(火) 09:53:02
関数結合の(.)って優先順位が高いので、
どうしても括弧が増えて見ぐさい気が…。

こんなのがあったら便利だと思うんですけど、

infixr 1 $.
($.)=(.)

こんな感じ

sigma = tail $. scanl (+) 0

標準ではなさそうなんですが、
やっぱ、問題ありですかね?
270デフォルトの名無しさん:2008/06/24(火) 09:55:22
慣れの問題
271初心者修業中:2008/06/24(火) 10:13:14
ああ、勘違いしてました。
関数の優先順位はどの演算子よりも上ですね。

これで問題ないのか

sigma = tail . scanl (+) 0

>>270
レスありがとうございます。
早く慣れたいです。
まだ、頭で考えないとよくわからない。
(考えてもわからない時ありw)
272デフォルトの名無しさん:2008/06/24(火) 11:35:10
>>266
「厳密には」も何も最初っからそう
273デフォルトの名無しさん:2008/06/24(火) 12:56:24
>>266
> 覚えていないといけない
覚えてなくてもプログラム書くのにはなにも困らない。
等価性とか考えだすと全部正格のほうが楽かもしれんけど。
274デフォルトの名無しさん:2008/06/24(火) 18:49:23
>>273
書くときは良くても読むとき困る
例えば>>260のコードが空リストに対しても正しく動作するかどうか確かめるのに、
いちいちPreludeの仕様を読まないといけない

zipみたいに明確な定義のある関数ならまだいいけど、
例えばhPutStrLn undefined ""の値が
1. ⊥
2. 実行時にエラーになるアクション
3. ()を返すアクション
のどれになるかは仕様では決まっていないはずで、ちょっと厄介
275デフォルトの名無しさん:2008/06/25(水) 15:42:16
>>274
その辺は想像で読めば十分じゃない?

zip xs (tail xs) とあって、
コードを書いたのが信頼できる人なら、
zip は第二引数について非正格なのだろうな、とか。

hPutStr undefined "" も、
hPutStr _ "" = return () と定義されては無いだろうし、
undefined が正しいハンドルじゃないからと
hPutStr が独自にエラーを出すというのも、
先に undefined が評価されるから有り得ないだろう、とか。
hPutStr (error "1") (error "2") にしても error "1" だろう、とか。
276デフォルトの名無しさん:2008/06/25(水) 15:49:33
ム板のやつらはなんでこんなに視野が狭いんだろうといつも思う。
277デフォルトの名無しさん:2008/06/25(水) 17:38:53
3の場合

main「ちょっと undefined に "" 出力してこい」
hPutStrLn「へい」
...数十ns後
hPutStrLn「やってきやした」
main「おまwwww改行どうしたwwwwwwww」

>>276
正直くだらないネタ以外はここではなく他の所に書く。
278デフォルトの名無しさん:2008/06/25(水) 18:27:02
質問です

HaskellでGPGPU関連の話題ってありませんか?
279274:2008/06/25(水) 20:23:02
すまん、hPutStrLnじゃなくてhPutStrじゃないと話が合わないな

>>275
>コードを書いたのが信頼できる人なら、
勉強のためにコードを読んでるならいいけど、
レビューとかデバッグとかしてるならそうはいかないだろ

>hPutStr が独自にエラーを出すというのも、
誤解させたかもしれんが、HugsもGHCも2.の振る舞いをする
実行した時点でundefinedが評価されてエラー発生ね
でも、例えば最適化のために
hPutStr h s = seq h $ ...
みたいな実装になってたら1.だし、
hPutStr h s = mapM_ (hPutChar h) s
みたいな定義が考えられる以上3.もあり得なくはない

結局、非正格がデフォルトなせいで関数の仕様に書かなければいけない事項が多いのが問題
それを不用意にうやむやにすると関数の振る舞いが実装に依存してしまう
それほど頻繁に問題になることではないけど、たまに面倒
280275:2008/06/25(水) 21:28:51
>>279
> レビューとかデバッグとかしてるならそうはいかないだろ
うん。

> hPutStr h s = mapM_ (hPutChar h) s
> みたいな定義が考えられる以上3.もあり得なくはない
なるほど。

> それほど頻繁に問題になることではないけど、たまに面倒
そういうこったね。
281275:2008/06/25(水) 21:32:14
> 誤解させたかもしれんが、HugsもGHCも2.の振る舞いをする
> 実行した時点でundefinedが評価されてエラー発生ね

そういうつもりでしたか。
ちなみにそれだと1.はどういうつもりだったのですか?
282デフォルトの名無しさん:2008/06/25(水) 21:49:44
>>281
hPutStr undefined "" `seq` 0
を評価してエラーが発生すれば1.だよな
実際試したらHugsでもGHCiでもエラーは発生しなかった
283275:2008/06/25(水) 22:26:04
なるほど。というか>>279をちゃんと読んでませんでしたごめんなさい。
284デフォルトの名無しさん:2008/06/26(木) 21:37:05
一通りよく取り上げられる教科書は読んだんですが、Arrowなどの
比較的新しい技法についてわかりやすく書かれた文書はどの辺
でしょうか。
285デフォルトの名無しさん:2008/06/26(木) 23:11:25
本家から辿って論文を読むのがいいと思うよ。
286デフォルトの名無しさん:2008/06/26(木) 23:16:36
Arrow アーーー
287デフォルトの名無しさん:2008/06/26(木) 23:28:26
arrowねぇ・・・イマイチだねぇ・・・
プログラミング的にはこれといってメリットないよ。
288デフォルトの名無しさん:2008/06/27(金) 00:23:45
289デフォルトの名無しさん:2008/06/28(土) 00:05:34
arrowで量子コンピュータのシミュレーションやってます
めっちゃべんりですっっっっs
290デフォルトの名無しさん:2008/06/28(土) 01:15:42
ユニタリ変換の理解が一つの山かも。
291デフォルトの名無しさん:2008/06/28(土) 01:22:40
ユニタリ変換?高校生でも知ってるよ
292デフォルトの名無しさん:2008/06/28(土) 10:42:43
皆さん、エディタは何使って書いてますか?
293デフォルトの名無しさん:2008/06/28(土) 10:48:09
emacsしか選択肢ないんじゃね?
eclipseは糞だし。
294デフォルトの名無しさん:2008/06/28(土) 11:10:10
vim
295デフォルトの名無しさん:2008/06/28(土) 11:45:12
notepad.exe
296デフォルトの名無しさん:2008/06/28(土) 12:32:37
vimやemacsだと使い勝手のいいプラグインあるんでしょうか。

自分もEclipseはちょっと嫌ですねぇ。
297デフォルトの名無しさん:2008/06/28(土) 12:44:03
http://www.haskell.org/libraries/haskell.vim その他いろいろ

$ hugs -Evim
298デフォルトの名無しさん:2008/06/28(土) 16:06:10
Haskellの構文解析ってどういう風な作りになってるん?
結合性宣言があったりするので、
トークン読んだ時点では構文木を作れないような気がするんだけど。

何かの資料とか、HugsやGHCでの実現方法のソースとかあったら教えてくだしあ
299デフォルトの名無しさん:2008/06/28(土) 16:38:24
>>298
GHCはとりあえず全部左結合として解析(parser/Parse.y)して、
後のrenameのパスで結合性宣言をもとに組み立て直してる(rename/RnExpr.lhs)
300デフォルトの名無しさん:2008/06/28(土) 16:57:55
>>292
俺もvimだわ
なんか文法と相性良さげだし
301デフォルトの名無しさん:2008/06/28(土) 17:16:47
>>299
そういう手があったか。いや、全然関係ないパーサを先日作ってたんだが。
パス(1パスコンパイラとか2パスコンパイラとかのパス)にこだわっていては
非富豪的かねぇ。
302デフォルトの名無しさん:2008/06/28(土) 18:10:34
左結合にするってのは、
とりあえずリンクトリストにしといてから、
あとでパーズしなおすって事。
303デフォルトの名無しさん:2008/06/28(土) 18:39:00
>>292 俺はAgda使ってるよ。結構使いやすい。
304デフォルトの名無しさん:2008/06/28(土) 20:10:12
project eulerに接続できねーぞ!!!
どうなってんだ糞
305デフォルトの名無しさん:2008/06/28(土) 20:19:06
質問です

グラフの研究で路線データ(や道路のデータなど)が使いたいのですが、
そういうデータを手に入れるにはどうすればいいですか?
306デフォルトの名無しさん:2008/06/28(土) 21:47:48
>>305
質問です

Haskellと関係ありますか?
307298:2008/06/28(土) 22:27:19
>>299,302
thx、参考になった。
細かく追えてないけど、かなりがんばらないとparseできないってことか。
308デフォルトの名無しさん:2008/06/29(日) 08:23:28
とりあえず左結合って要するにS式だよね。
309デフォルトの名無しさん:2008/07/01(火) 18:44:49
Real World Haskell
http://www.amazon.co.jp/Real-World-Haskell-Bryan-OSullivan/dp/0596514980/

> This easy-to-use, fast-moving tutorial introduces you to functional
> programming with Haskell. Learn how to use Haskell in a variety of
> practical ways, whether it's for short, script-like programs or large
> and demanding applications.
310デフォルトの名無しさん:2008/07/02(水) 02:44:41
中身読めるよ
http://book.realworldhaskell.org/beta/

表紙が決まったんだね。ヘラクレスオオカブト?
311デフォルトの名無しさん:2008/07/02(水) 03:40:51
後の兜本である。
312デフォルトの名無しさん:2008/07/02(水) 22:40:44
オライリーからHaskellの本が出るなんてありえない。
そう思っていた時期が僕にもありました
313デフォルトの名無しさん:2008/07/02(水) 23:40:42
2008/09
ちょおまw

314デフォルトの名無しさん:2008/07/04(金) 04:55:50
>>310
全30章中残りは3章。
20. The foreign function interface
27. Profiling and tuning for performance
30. A concurrent RESTful web application
書きにくそうなのが残った感じw
315デフォルトの名無しさん:2008/07/09(水) 08:14:01
初心者用のスレで関数型の話をすると罵られる。なぜだろう。
316デフォルトの名無しさん:2008/07/09(水) 12:30:55
初心者には関数型が高尚すぎて理解できないからです。
317デフォルトの名無しさん:2008/07/09(水) 22:36:35
しつもんです
らむだけいさんってなんですか?
318デフォルトの名無しさん:2008/07/09(水) 23:38:52
世界遺産の一種です

319デフォルトの名無しさん:2008/07/09(水) 23:44:40
320デフォルトの名無しさん:2008/07/10(木) 05:32:31
全部ひらがなだとぱっと見、人名かなんかかと思った。羅武田圭さんとか。
321デフォルトの名無しさん:2008/07/10(木) 16:58:13
俺がムラタだ
32236 ◆K0BqlCB3.k :2008/07/11(金) 01:58:31
323デフォルトの名無しさん:2008/07/11(金) 09:38:42
まあ遅延評価だから
324デフォルトの名無しさん:2008/07/11(金) 10:04:21
等無駄計算
325デフォルトの名無しさん:2008/07/11(金) 16:03:12
>>322
なにエラソーに言ってんだよ。しょーもない評論家なくせして。
326デフォルトの名無しさん:2008/07/19(土) 00:59:56
名村啓?
327デフォルトの名無しさん:2008/07/20(日) 23:31:18
do記法で

'aとか''aとか出てきますが
どのような意味なのでしょうか
328デフォルトの名無しさん:2008/07/21(月) 01:16:27
>>327
具体的なコード書いてみて
329デフォルトの名無しさん:2008/07/21(月) 15:09:50
>>327
a'とかa''じゃなくて?
ちなみにそれならただの変数名だよ。
330デフォルトの名無しさん:2008/07/21(月) 15:13:03
>>329
見直したらそうでした
許してくださいw
ごめんなさい
331デフォルトの名無しさん:2008/07/21(月) 23:32:45
\_ -> k

この\_ってC++のtemplate <t>みたいなもんですか?
332デフォルトの名無しさん:2008/07/21(月) 23:38:07
全然違います
333デフォルトの名無しさん:2008/07/21(月) 23:43:54
>>332
じゃあ何なのでしょうか?
334デフォルトの名無しさん:2008/07/21(月) 23:55:35
ttp://www.codelogy.org/archives/2008/04/haskell_4.html
ていうかなんか一冊入門書買うことをおすすめする
335デフォルトの名無しさん:2008/07/22(火) 01:00:32
なんか夏まっさかりって感じ?
336デフォルトの名無しさん:2008/07/22(火) 01:40:52
質問の仕方スレもいるな
Haskellでぐぐっていくつか読めばわかるぐらいのことで
これって型でしょ
違います
じゃあなんなんだよ
つ やさしいHaskell入門
337デフォルトの名無しさん:2008/07/26(土) 19:44:30
おい、おまえらの仲間が「初心者のための〜」スレで暴れてるから早く回収してくれ
338デフォルトの名無しさん:2008/07/26(土) 20:22:33
狂犬に噛まれて狂犬が増えるって
怖くね?
339デフォルトの名無しさん:2008/07/27(日) 01:34:24
あれは仲間じゃない
340デフォルトの名無しさん:2008/07/27(日) 02:01:40
そもそもスレタイからして興味ない話だし。
向こうで完結して。
34136 ◆K0BqlCB3.k :2008/07/27(日) 02:23:52
さて、この夏、何かおもしろいことでもしようかな。
342デフォルトの名無しさん:2008/07/27(日) 10:47:30
お前らの中にアホがいます
他のスレを荒らすならここを荒らしますよ?
343デフォルトの名無しさん:2008/07/27(日) 12:10:53
>>342
ほー、やってみてください。本当にできるのですか?
344デフォルトの名無しさん:2008/07/27(日) 13:11:28
夏厨誕生物語

A 「この夏、何かおもしろいことでもしようかな。」
B 「ならスレ荒らししてみれば?」
A 「簡単にできるのですか?」
B 「こうやれば邯鄲」
A 「ネ申キター!d!マジ面白いね。他スレ荒らしてクルーwktk」
345デフォルトの名無しさん:2008/08/06(水) 05:48:39
注目ワード“高階プログラミング”って何だ?
ttp://ascii.jp/elem/000/000/157/157495/
346デフォルトの名無しさん:2008/08/06(水) 06:00:24
>>345
面白かった。サンクス。
347デフォルトの名無しさん:2008/08/06(水) 19:32:59
仕事でHaskellできるなんて羨ましいなぁ。
348デフォルトの名無しさん:2008/08/06(水) 20:30:02
>>345
nobsunだね。
349デフォルトの名無しさん:2008/08/06(水) 20:47:23
ハイカラなシャツ着てる
350デフォルトの名無しさん:2008/08/06(水) 22:06:03
この会社ってホームページ見た感じ普通のSI会社に見えるけど、
山下さんなんかがいるってことは特殊な会社?

Haskellの開発コンサルということだけど、一般企業の業務システム
なんかを対象にしてるのかな。金融系とか合ってそうだけど、
普通の土方システムには豚に真珠かな。
351デフォルトの名無しさん:2008/08/06(水) 22:30:36
>>350
看板役みたいなものだよ。
よくあること。
SRAでも青木淳みたいなのを雇っているけど、青木は普通の仕事はしていないね。
金にならないことを自由にやっているって感じ。
ちなみに、青木の部下はかわいい女の子限定。
352デフォルトの名無しさん:2008/08/07(木) 05:56:03
まあ、天才ならなんでも許されるってことだ。
353デフォルトの名無しさん:2008/08/07(木) 07:30:34
>>351
青木はSRAやめたよ
354デフォルトの名無しさん:2008/08/07(木) 08:39:56
>>345 nobsunのコードは以前からスゲーと思ってたけど、こんな会社のこんな人なんだ。知らなかった。
会社の事業だけ見ると、Haskell関係なさそうだね。Higher Order Programmingってなんだ?造語か?
もっと記事をよく見てみる。
355デフォルトの名無しさん:2008/08/07(木) 08:55:02
>>354
ちょ、おまwww
356デフォルトの名無しさん:2008/08/07(木) 09:12:13
Higher Order Programming: プログラミングを丸投げするためのプログラムを書くこと
357デフォルトの名無しさん:2008/08/07(木) 09:45:57
継続ベースのWebフレームワークってHaskellにもありますでしょうか。
358デフォルトの名無しさん:2008/08/07(木) 12:53:37
>>350
あそこって、gaucheかんけいなひとがおおそうなんだけど。
359デフォルトの名無しさん:2008/08/07(木) 12:58:00
>>358
そりゃそうだ。普通のJaverやC++マが金を取ってこなきゃ、
みんなgaucheとかに走ったら誰が食い扶持を稼ぐんだって。
360デフォルトの名無しさん:2008/08/07(木) 13:19:40
二等兵には二等兵の仕事があるわな。
361デフォルトの名無しさん:2008/08/07(木) 13:46:18
むしろ、パンダと飼育員。
362デフォルトの名無しさん:2008/08/07(木) 13:54:11
俺はまだ士官候補訓練兵だ
363デフォルトの名無しさん:2008/08/07(木) 16:12:52
あの写真を見て
小野伸二を思い出したんだけど。nobsunはやっぱり天才なんですかね。
364デフォルトの名無しさん:2008/08/07(木) 19:03:09
俺は山田ルイ53世を思い出した。すまん>nobsun
ルネッサ〜ンス!
365デフォルトの名無しさん:2008/08/07(木) 19:05:14
あの芸人、この前番組内であからさまにいじめられてたぞ。
最近テレビの前で普通にいじめる先輩芸人が多くないか?
366デフォルトの名無しさん:2008/08/07(木) 19:55:17
そんなことより「Real World Haskell」の発売が10月に延びてる・・・
367デフォルトの名無しさん:2008/08/07(木) 20:41:53
http://book.realworldhaskell.org/beta/

にある最終章、「A concurrent RESTful web application」が読みたいんだけど、
これは本買わないとダメってこと?
368デフォルトの名無しさん:2008/08/07(木) 21:15:32
最近少しずつ読み進めていたんだが
そうか、本になるのか…買おうかな>RealWorldHaskell
369デフォルトの名無しさん:2008/08/07(木) 23:21:20
RealWorldHaskellってHaskellの批判本なのに
なんでみんな買うの?

こんなにHaskellって腐ってます
ゴミですって随所に書かれているのにw
370デフォルトの名無しさん:2008/08/07(木) 23:24:06
買おうかなと言ったのが一人いるだけなわけだが
脳内カウンターが回りまくりですかな
371デフォルトの名無しさん:2008/08/08(金) 00:09:00
ん?批判本なんだ?
372デフォルトの名無しさん:2008/08/08(金) 00:12:48
そう思っている人がいるかどうかは定かではないですが、
そう書き込んだ人間が一名いるようです。
また、買おうかなと書き込むことと買うことは別です。
プログラマたる者、このくらいの論理性は持って欲しいです。
部分と全体を混同するなんて、継承に毒されすぎです。
373デフォルトの名無しさん:2008/08/08(金) 02:02:00
>>372
論理じゃなくて、揚げ足取りっていいませんか?
買おうかなと書き込んだということは、買う意思が比較的強いということでしょう。
0か1かじゃないんですよ。
物事は確率的なのです。
374デフォルトの名無しさん:2008/08/08(金) 02:42:06
>>373
> 買おうかなと書き込んだということは、買う意思が比較的強いということでしょう。

著作権者や出版社勤務者が宣伝のために書いたかも知れませんよ
375デフォルトの名無しさん:2008/08/08(金) 02:42:51
>>374
そういう可能性もある。
確率の問題。
376デフォルトの名無しさん:2008/08/08(金) 02:50:39
>>369
ソース

>>370
君が一人しか見てないだけ
377デフォルトの名無しさん:2008/08/08(金) 03:20:20
>369
>Throughout this book, we're going to show you how Haskell's
alternatives to the features of traditional languages are more
powerful, more flexible, and safer. Haskell is positively crammed
full of cutting edge ideas about how to create great software.
(chap1 power)

と最初のところでかいてるけど、なぜ批判本と?
どこをさしていってるの?
378デフォルトの名無しさん:2008/08/08(金) 03:22:29
なんとなくpractical common lispのhaskell版と言う印象なんだけどな。
オレイリーから関数型言語ぼんが出るのは初めてじゃ内科?
国内ではgauche本があるがね。
379デフォルトの名無しさん:2008/08/08(金) 03:42:03
フランスではocamlの本が出てた
380デフォルトの名無しさん:2008/08/08(金) 11:58:00
washって継続ベースなの?
381デフォルトの名無しさん:2008/08/08(金) 14:34:11
>>379マジだ
ttp://www.amazon.fr/dp/2841771210/
フランスでは流行ってるんだな
382デフォルトの名無しさん:2008/08/08(金) 14:42:46
感覚的には日本のRubyと同じ感じじゃないすかね。
383デフォルトの名無しさん:2008/08/08(金) 16:16:02
>>381
いつの本の話してんだか。
この本の和訳プロジェクトはつぶれたね。
384デフォルトの名無しさん:2008/08/08(金) 19:15:39
>>382
全然違う。Rubyは世界的にPythonを急追している。
385デフォルトの名無しさん:2008/08/08(金) 23:55:14
急追して、、いたけど結局ダメだった、というのが現在のところだよ
俺も1.9がちゃんとしたモノになるまではrubyは使うべきではないと思う。
386デフォルトの名無しさん:2008/08/08(金) 23:59:16
そうか?
そもそも本当に10月に発売できるか分からんぞ。
387デフォルトの名無しさん:2008/08/09(土) 00:21:55
コレすでに3回発売日伸びてる
年内出れば御の字
388デフォルトの名無しさん:2008/08/09(土) 00:33:37
>>385
それがほんとかなぁ。とおもってgoogle trendsでruby,python,perlの検索数を比較させて
みたけど、国によって微妙に違うね。
usaなら、2006ねんごろからperlが凋落しきって、python,rubyとならんで、2006中頃から、
rubyが一歩抜けて、perl,pythonが同等になっていた。

italyは、同じような時期にperlが落ちてきてるけど、pythonがかなり強くって、perlとruby
が同等

japanが、perlの凋落が進んできてるけど、usaやitalyほどではなくて、一番ですね。2番め
がrubyで徐々に増えてる。pythonは完全に横ばい。

chinaはpythonの伸びがかなり強い。そんなにrubyは使われてない。
indiaは日本と傾向が似てるな。
israelはrubyは絶滅ぎみ。
google全体ではrubyが一番強くなってきてるけど、これはusaでのruby人気が支えてる
ような感じだな。europaとchinaではpythonが強く、それ以外の国ではperlが強いかな。
389デフォルトの名無しさん:2008/08/09(土) 04:23:59
>>384
世界的にみても、わかって言語を選んでいる人よりも
バズワード追ってるだけの人のほうが多いからね。
390デフォルトの名無しさん:2008/08/09(土) 06:09:31
Haskellって本当にLLって言っていいのかな。
基本コンパイラだし、インタプリタも軽量とは言い堅いし。。。
391デフォルトの名無しさん:2008/08/09(土) 06:13:31
LLじゃないだろw
392デフォルトの名無しさん:2008/08/09(土) 08:06:03
> 基本コンパイラだし
GHCばかり取り上げられてHugs涙目
393デフォルトの名無しさん:2008/08/09(土) 08:07:11
>>392
そんなあなたをはぐはぐ。w あーっ!ではないよ。
394デフォルトの名無しさん:2008/08/09(土) 08:22:00
初心者なんですが、Haskellが型については静的であることを選択した
理由って何かあるんでしょうか。純粋であることや遅延評価が、静的
型やコンパイル時の最適化を要請するということなんでしょうか?
395デフォルトの名無しさん:2008/08/09(土) 08:27:55
GHCはHaskell解釈系ランキング第一位!

「やっぱりGHCだね」
396デフォルトの名無しさん:2008/08/09(土) 09:06:49
>>394
静的なのは、最適化も大きいだろうけど、
むしろ安全性を狙ってるという要素が大きいんだろう。

遅延評価なのはコンパイル時の最適化にプラスなのかなぁ?
これは理論的に停止できる関数は必ず停止できるっていう、
これまたある種の安全性?が主な目的だと思うけど
( if true (answer foo) (nonStop baa) ) みたいな文を考えよう(Haskellの文法忘れたから適当)。
397デフォルトの名無しさん:2008/08/09(土) 10:14:15
別に"動的型付け-純粋-非正格-インタプリタ型"の関数型言語もあり得るよな
効率はどうなんだろう、"動的型付け-正格"の言語よりさらに遅いことは想像が付くが
398デフォルトの名無しさん:2008/08/09(土) 10:28:23
>>394
Goferがそうだったから。
で、なんでGoferがそうだったのかというと、Mirandaがそうだったから。
399デフォルトの名無しさん:2008/08/09(土) 10:37:45
>>396
遅延評価は最適化にマイナスだよ。少なくともメモリ空間の最適化には全く向かない。
400デフォルトの名無しさん:2008/08/09(土) 10:44:26
遅延評価なんて
今日はやらない
401396:2008/08/09(土) 10:50:37
>>399
そうだよね。
コンパイル技術がすげー発達して高速になれば、話は変わるだろうけど。
(まぁ、コンパイル技術が「すげー発達」すれば、どのコンパイル言語でもマシン語と同じスピードが出るんだから、意味ない話)

あと「理論的に停止できる関数は必ず停止できる」は意味不明だとか、
文じゃなくて式だとか、気づいたけど後の祭り、いわゆるアポステオリorz
402デフォルトの名無しさん:2008/08/09(土) 11:02:51
>>395
Guarded Horn Clauses
403デフォルトの名無しさん:2008/08/09(土) 11:31:02
手続き型言語は、ノイマン型計算機を抽象化することで生まれてきたので、
評価方式としては、式、文の逐次的解釈が当然になる。

関数型言語は、ラムダ式から出て来たから、
その評価形式をどうするかというのが一つのポイントになる。
遅延評価は最左最外簡約の研究から出て来た。

効率がどうのこうのというより、
新しいプログラミングパラダイムを産み出したので、
(例えば無限リスト、無限木の積極的利用)
研究され続けているんだと思う。
404デフォルトの名無しさん:2008/08/09(土) 11:32:55
>>402
GLOBAL HONORED CROWN http://www.noah.co.jp/ghc.php
405デフォルトの名無しさん:2008/08/09(土) 11:37:31
関数型とか意味がない言語だと思うけどねぇ
何ができるってわけでもないし
HaskellでWindowsは作れないしLinuxも作れない
Webサーバも作れないしDBも作れない
意味がない
40636 ◆K0BqlCB3.k :2008/08/09(土) 11:44:54
40736 ◆K0BqlCB3.k :2008/08/09(土) 11:45:52
ごめん、今からインディージョーンズ見に行くから急いでるから!
408デフォルトの名無しさん:2008/08/09(土) 11:47:37
まあ普通はモデルを現実に合わせるよな。
代入だらけのプログラムをSSAとかいう形式に変換するとか。
409デフォルトの名無しさん:2008/08/09(土) 11:48:09
>>394
純粋関数型言語・遅延評価で、
型なし・インタプリタ言語ってあるよ。

変態言語 Lazy K がそれ。
ある意味では Make とかもそうかも。

少なくとも、
純粋関数型言語・遅延評価と、
コンパイル言語かインタプリタ言語か
っていうのはあまり関係ない。

純粋関数型言語・遅延評価は、
シンプルな手続き型よりもインタプリタを書くのが難しい、
っていうのはあるかもしれないけど。

純粋関数型言語であることと静的型であることは、少し関係があるかも。
純粋関数型言語でかつ動的型というのは、概念的にあまり良い食い合わせではないとは思う。

動的型っていうのは、関数の世界では「型無し」ってことになると思うんだけど、
いずれにせよアドホックなエラー処理が必要になって、
純粋関数型的にアドホックなエラー処理というのは少なくとも美しくない。
410デフォルトの名無しさん:2008/08/09(土) 12:17:29
>>409
遅延評価でインタプリタ。破壊的関数が作れないというものなら、R言語くらいしか知らない。
411394:2008/08/09(土) 12:56:14
皆さんレスありがとうございます。

論理的に組み合わせ悪いというよりは、静的型のメリットを選んだ
ということなんでしょうか。

静的型VS動的型というのは、安全VS自由ということだと思うんですが、
Haskellは安全を選んだということなのかな。純粋関数型としては、
副作用に関連する不具合から自由なのが売りだと思うので、更に
静的型によって徹底的に信頼性を上げてるという感じなんでしょうか。

>>409
純粋関数型であること(参照透明であること)と動的型が食い合わせ
悪いというのがちょっと分かりませんでした。動的型は実行時不具合
の問題が付きものと思うのですが、参照透明との関係をよろしければ
少し詳しく教えていただけマスでしょうか。
412デフォルトの名無しさん:2008/08/09(土) 13:08:18
そもそも関数型言語に意味が無い
413デフォルトの名無しさん:2008/08/09(土) 13:13:08
>>411
動的型を使うと、アドホックなエラー処理が必要になるよね?
っていうか、それがないと動的型を使ううまみがないと思うんだけど。

ここでいうアドホックなエラー処理っていうのは、
対象オブジェクトの型をプログラムで認識して、
意図しないオブジェクトが来たときにエラー処理するってことだけど。

このエラー処理にIOを使わないなら、
それは多相型やクラスを使っても同じ結果が得られるよね。

だから、Haskellに動的型を組み込む必要性は、
意図しないオブジェクトが来たときIOを使ったエラー処理をしたいときに限られると思う。

で、純粋関数型言語は参照透明性ゆえにIO処理するの苦手。


まぁ、動的型っていうのはプログラム中で型を認識できないと意味ないよね?
っていう時点で、カリー・ハワード対応との関係で微妙っていう気にするけど。

僕が考えているのは、そんな感じ。
414デフォルトの名無しさん:2008/08/09(土) 13:17:44
上っ面を語り合って自己満足か
Haskellに多いやつらの典型だなw
415デフォルトの名無しさん:2008/08/09(土) 13:18:59
グリーンスパンの第10法則が発動すると、どんな言語で書こうと
動的でマルチパラダイムな言語で書いたのと同じになる。
416394:2008/08/09(土) 13:33:07
>>413
なるほど、理解しました。ありがとうございます。
417デフォルトの名無しさん:2008/08/09(土) 13:50:48
>>405
せいぜい生きる力を養ってください
418デフォルトの名無しさん:2008/08/09(土) 13:54:52
>>416
implementationの本を読むといいよ
Peyton Jonesのがpdfで読めるはず
419デフォルトの名無しさん:2008/08/09(土) 14:11:34
>>418
俺はPJのが好きだな。
静的型付けとグラフ簡約が運命的な出会いであることがわかった。
420デフォルトの名無しさん:2008/08/09(土) 14:19:55
>>413
なんか議論が無茶苦茶じゃないか?
例えば「型エラー」を「0除算エラー」に置き換えても論理展開が変わらん

>このエラー処理にIOを使わないなら、
>それは多相型やクラスを使っても同じ結果が得られるよね。
動的型の重要な利点は、型をいちいち書かなくてもいいという利便性だよな
多相型やクラスを使って動的型をシミュレートするのはすごく面倒だから、この利点を享受できない

それから、GHCではerrorやundefinedで発生したエラーをIOモナド上で捕捉できる。念のため
421デフォルトの名無しさん:2008/08/09(土) 14:26:59
だな。Haskellの例外処理で不足があることはそうそうないと思う。
あと、動的型のメリットを例外処理だけに限定するのは視野が狭すぎる。
LISPのメリットはアドホックな例外処理か?そうじゃないと思う。
422デフォルトの名無しさん:2008/08/09(土) 14:39:32
>>420-421
納得できないのなら、それで良いです。
僕も、べつにそんなに優れた論拠だと思ってないから。
423デフォルトの名無しさん:2008/08/09(土) 14:55:35
俺も>>413はひどい文章で内容もないと思う。
>>416が理解したのが驚愕。
424デフォルトの名無しさん:2008/08/09(土) 15:20:10
本当だ、マジで何言ってるのかわからん
すげえ
425394:2008/08/09(土) 15:22:47
動的型のメリットは型を単に書かなくて済むことだとは思えないんですが。

それだけであれば、コンパイルで発見する不具合をテスト時に見つけよう
とする、つまり面倒なことを後回しにしてるだけ、ってことになりませんか?
426デフォルトの名無しさん:2008/08/09(土) 15:23:15
別に動けばいい
427デフォルトの名無しさん:2008/08/09(土) 15:30:45
何でも指せるポインタってのはメチャ便利なんですよ。
S式なんて最たるもので、静的な型付けは不能あるいはワイルドカード的。
静的か動的かはトレードオフの問題。
428デフォルトの名無しさん:2008/08/09(土) 15:42:04
>>425
不具合を見つけるタイミングが遅くなるという対価を払って、記述の利便性および変更の容易さという報酬を得る
ちゃんと取引として成立してるじゃないか

もちろん「型を書かなくて済む」こと以外にも利点はある
特定の静的型付け言語ではそもそも型を付けられないようなコードが許容されるとか
429デフォルトの名無しさん:2008/08/09(土) 17:38:51
>>425
lispを使ってる限りの印象だが
都合のよい所だけ型宣言が出来るというのは柔軟性につながるかな。
プログラムの最適の仕方も静的/動的で違いがあると思うよ。
型なんで考えずにアルゴリズムだけ作っちゃえができるからね。
それでも型を意識したプログラミングをすることはあるが。
でも、haskellでもポリモつかえばある程度型無視ラピッドプログラミング
は可能じゃないか?
430デフォルトの名無しさん:2008/08/09(土) 17:41:42
じゃあOCamlでいいじゃん
431デフォルトの名無しさん:2008/08/09(土) 17:44:14
>>430
haskellって参照透明性ってかなりのメリットだと思ってるけど。
432デフォルトの名無しさん:2008/08/09(土) 17:49:41
注意してかけばいいだけの話
Hashkellはメリットを殺すデメリットしかないだろ
433デフォルトの名無しさん:2008/08/09(土) 17:56:37
正直、exists型が標準になれば動的型付けは不要じゃね?
http://en.wikibooks.org/wiki/Haskell/Existentially_quantified_types
434デフォルトの名無しさん:2008/08/09(土) 17:57:26
>>430
OCamlはstrictだから。残念。
435394:2008/08/09(土) 19:55:26
>>428
コンパイル時に問題が抽出されることと、テストによって抽出されるのでは
質的な違いがあるんじゃないですか?テストは結局は人間がやるものだし、
不具合の可能性を低めるということにしかならないけど、コンパイルでの
不具合検査は対象となるプログラムの論理的正しさを証明していることに
なるかと思います。

容易に変更ができたとして、不具合がどこに潜んでいるのか分かりにくい
というのは非常に問題あると思いますよ。コンパイルで分かるのならば、
これは明白でしかも機械的に全てが晒されますから安心です。
436デフォルトの名無しさん:2008/08/09(土) 20:20:59
Rubyは危険だしセキュリティリスクしか
そんざいしないしな
437デフォルトの名無しさん:2008/08/09(土) 20:23:09
>>435
確かに、バグがどの段階で発見されるかには質的な違いがある
でも、静的な型検査だって全てのバグを検出できる訳じゃないから、
結局、動的検査との安全性の違いは程度問題

その上で、静的な型検査の利点がコストを上回るという判断は当然ありえるし、
そう判断したなら静的型言語を使えばいい
438デフォルトの名無しさん:2008/08/09(土) 20:28:12
>>435
静的型チェック馬鹿ですやん
439394:2008/08/09(土) 20:39:50
>>437
例えば、参照透明ということについてはどうでしょうか?こちらも、副作用を許容
すれば、プログラム中に登場する変数の中身が何に変異しているかどうかが
分からなくなり、実行してみないと問題が検出できない、ということになります。

参照透明を強要するのも、型を強要するのも、結局その辺がクリアできない
プログラマというのはそれらに関連する不具合を出してしまうんだと思いますが
どうでしょうか。気をつければいい、というのは簡単で規模が小さなシステムでは
言えることで、そうでなければ膨大なテスト工程が必要になってしまうのでは?
440デフォルトの名無しさん:2008/08/09(土) 20:46:48
OCamlが参照透明じゃないから嫌ってどういう事を言ってるの?
refとかで破壊的な変数が作れるから嫌とかそういうレベルの話じゃないよね。

それだったらref使わなければいいだけだから。
逆に、Haskellの参照透明で良い所ってどのへんなの?
OCamlのでも、ErlangのでもなくHaskellの参照透明性が良い理由を説明してほしいんだが。
441394:2008/08/09(土) 21:04:32
>>440
参照透明でない、ということは値が望んだ通りの値であることを
保証するためにどこまでも神経質にテストをしなければならない、
ってことですよね。

一人で開発するのであればいいですが、多くの人の手によって
間違いがあってはならないシステムの開発をする際、「それは
禁じ手だから止めてね」と口約束するだけってのは非常に怖い
わけです。だからこそ、テストの工程が膨れ上がる。

Haskellに自分が惹かれている大きな理由の一つは、この辺の
頑固さを貫いていることですね。
442デフォルトの名無しさん:2008/08/09(土) 21:19:02
参照の透明性があれば、
それだけでテストが必要なくなるわけでも、
テストが簡単になるわけでもない。
そうなるのはトイプログラムだけ。

嘘だと思うなら、GHC, Hugsなどのバグトラックをみてみればいい。
443デフォルトの名無しさん:2008/08/09(土) 21:21:51
テストが減ることを数学的に証明してみせれ。
444437:2008/08/09(土) 21:22:55
>>439
何が言いたいのか良く分からん
俺は「気をつければいい」なんて一言も言ってないよ
>>428に書いたように、動的か静的かの間でトレードオフが成立すると言っているだけ

>>441
OCamlの変数は変更不可だよ
変更できるのは参照(ref)で、これは変数とは別物
だから、口約束するまでもなく変数の値が変わらないことは保証されてる
445デフォルトの名無しさん:2008/08/09(土) 21:26:07
>>440
参照透明性を壊さないと入出力できないのが嫌
44636 ◆K0BqlCB3.k :2008/08/09(土) 21:37:36
>>443
数学的に無理だから、統計的に証明するわけですよ。
実際に〜〜でした、ってね。

ヒューマンインターフェース系の論文が参考になるんじゃないかな。
あっちは全部そんな感じ。
447デフォルトの名無しさん:2008/08/09(土) 21:38:56
>>441
Haskellでもやろうと思えばIORefとかで事実上破壊的な操作が可能になるわけですが、
これについてはどうお考えで?

「HaskellでIORefは使うな」っていうプログラミングルールを設定することは
「OCamlでref使うな」っていうルールを設定することと本質的に違わないと思うんだけど
それについてはどうなんすか。
44836 ◆K0BqlCB3.k :2008/08/09(土) 21:40:14
インディージョーンズ、あれは予算が無いからあんなにちゃっちい水晶髑髏なのか?
どう見てもアクリル製のガワの中に反射板入れただけやん。
UFOとかエイリアンとか、考古学じゃなくてSFやん。
突っ込みどころ満載な映画でした。

かしこ
449デフォルトの名無しさん:2008/08/09(土) 22:13:11
monadとラムダの簡単な練習いっぱい
したいです。どこがいい問題集頂戴
450デフォルトの名無しさん:2008/08/09(土) 22:23:39
>>449
do記法を使わずにliftM、liftM2、joinを実装
Continuationモナドを実装
45136 ◆K0BqlCB3.k :2008/08/09(土) 23:30:03
>>450
また何も考えずにそういうこと言う。

>>449
http://ja.doukaku.org/
45236 ◆K0BqlCB3.k :2008/08/09(土) 23:31:04
英語が読めるなら
http://projecteuler.net/
453デフォルトの名無しさん:2008/08/10(日) 05:05:51
>>451
モナドとλの練習なら>>450はいい案じゃないか。
いっぱいじゃないけど質的にいい。
454デフォルトの名無しさん:2008/08/10(日) 05:08:55
そんなことが書きたいんじゃなかった。

>>419
PJのって何?本もpdfもPJのでしょ?
455デフォルトの名無しさん:2008/08/10(日) 08:02:29
PJは
Implementation of Functional Programming
Implementing Functional Languages,(D. Lesterと共著)
を書いていて両方公開。
http://www.haskell.org/haskellwiki/Books
456デフォルトの名無しさん:2008/08/10(日) 08:05:37
457デフォルトの名無しさん:2008/08/10(日) 13:23:16
>>454
すまん、>>455のImplementing...のほうを言いたかった。
45836 ◆K0BqlCB3.k :2008/08/10(日) 13:39:12
>>453
>>449は本当にモナドとラムダの練習のためだけに問題をほしがっているのかどうかってこと。
それに、初心者は何か目に見えて動かせるものを書きたがるものさ。
誰かに見られることを想定して書くのと、「動けばそれでいい」だけで書くのとでは、
やっぱり前者の方がいろいろ調べたりすることで勉強になる。
459デフォルトの名無しさん:2008/08/10(日) 15:23:20
>>455
そこ載ってなくね?w
http://research.microsoft.com/~simonpj/Papers/slpj-book-1987/index.htm
http://research.microsoft.com/~simonpj/Papers/pj-lester-book/

>>457
サンクス。目次しか見てないけど、
Implementationがパターンマッチや型など広く扱ってて、
Implementingはコンパイラのコアな部分を主に扱ってる感じ?
静的型付けとグラフ簡約の運命的な出会いというからそうでもない?
まあImplementingのほうを読んでみます。

>>458
そうですね。
460デフォルトの名無しさん:2008/08/10(日) 16:23:15
載ってるよー

グラフ簡約と運命的な出会いというと遅延評価じゃないかね。
特にPJ的には。
461419:2008/08/11(月) 14:41:51
>>460
まあグラフ簡約は前提として、それを効率的に実装するには静的型付けがイイんだよ、
と、約20年前に読んだ時に思った。
462419:2008/08/11(月) 14:44:37
20年前じゃなくて15年前だった。かなり記憶が混乱してるな、俺 orz
463デフォルトの名無しさん:2008/08/11(月) 16:05:22
>>461
あまり理解できてなかったんじゃない?w
464デフォルトの名無しさん:2008/08/11(月) 16:13:31
>>463
かもしれない。
できれば君が読んでポイントだと思ったところを挙げてくれると皆の参考になると思う。
465デフォルトの名無しさん:2008/08/11(月) 16:20:35
PJの最初の本だと、
例え動的型チェックをやろうとも、そのコードは、
他の普通のコードと一緒でスーパー・コンビネータになって、
グラフ簡約されるだけだから、コンパイル時に型チェックを済ませることが、
スーパー・コンビネータのグラフ簡約上、特に有利だとは思えません。
466デフォルトの名無しさん:2008/08/11(月) 17:39:55
横から口はさんですまんが、静的型がついていたほうがパターンマッチが速くならね?
467デフォルトの名無しさん:2008/08/13(水) 09:02:33
Haskellの継続ってSchemeとは違いありますか?
468デフォルトの名無しさん:2008/08/13(水) 10:48:15
call/cc のようなものはありません
469デフォルトの名無しさん:2008/08/13(水) 11:17:46
>>468
MonadCont の callCC :: ((a -> m b) -> m a) -> m a のことじゃないの。

>>467
俺も気になる。違いはあるだろうけど、どう違うのか。
470デフォルトの名無しさん:2008/08/13(水) 11:23:16
やっぱりそうですか。継続ベースのアプリ
作るとしたら、ステートモナドに次のアクション
入れておくとかですかね。
471デフォルトの名無しさん:2008/08/13(水) 13:45:50
MonadContだと、型の関係で、無限ループするような式は書けない。
# mfixとか使えば別だけど。

例えば、Schemeで次の式は書けるが、MonadContでは書けない。
(call/cc (lambda (c) c))
(call/cc (lambda (c) (set! foo c)))

つまり、次の式は型が付かない。
callCC (\c -> return c)
callCC (\c -> lift $ put c)

要は、callCCで捉えた継続をそのcallCCの外に出せない。ただし、
callCC (\c -> ... callCC (\c' -> c c') ...)
のように、内部で別のcallCCを使って、それで捉えた継続を外に出すのはOK。

あと、変な例として、
callCC (\c -> return (Right (c . Left)))
はOK。でもやっぱり無限ループはできない。
472デフォルトの名無しさん:2008/08/13(水) 14:58:55
>>471
だとすると、smlのcall/ccを使ったco-routineみたいなことはできないということ?
473デフォルトの名無しさん:2008/08/13(水) 17:43:19
smlのcall/ccを使ったco-routineは知らないけど、co-routine自体はできる。

import Control.Monad.Cont

foo = callCC (\c0 ->
do
c1 <- callCC c0
c2 <- callCC c1
c2 10
undefined)

bar =
(do
c1 <- foo
c2 <- callCC c1
callCC c2)

main = print $ runCont bar id
474デフォルトの名無しさん:2008/08/13(水) 18:18:41
>>471
HaskellでYコンビネータを書くとき型が問題になるけど、
実質的には fix f = let g = f g in g で問題ない。
それと同じように、
loop = callCC (\c -> let g = c g in return g)
とすれば
do { l <- loop; liftIO $ print 0; l }
のように無限ループを書ける。
(これの変数付きループ版が MonadLib にあった。)
(call/cc (lambda (c) c))
がどう使われるのかよく分からないけど、
実質的には同じことになるんじゃないかな?

(call/cc (lambda (c) (set! foo c)))
callCC (\c -> lift $ put c)
は IORef を使うと問題なくできる。
State だと無理だけど、新しく再帰的なデータ型を定義してやれば、
あまり便利では無さそうだけど一応できた。
475デフォルトの名無しさん:2008/08/13(水) 22:46:51
オラ本の執筆遅れてます
著者にプレッシャヨロ
47636 ◆K0BqlCB3.k :2008/08/13(水) 22:51:05
どうせ買わないので暖かい目で見守るだけです。
477デフォルトの名無しさん:2008/08/13(水) 23:21:14
Schemeのcall/ccってその時点の継続を勝手にキャプチャして渡してくれる
んですよね?Haskellではそういうのは無いと思っていいんでしょうか?
478デフォルトの名無しさん:2008/08/14(木) 00:04:58
>>477
モナド無しでということなら無い。
そもそもcall/ccは副作用があるし。
479デフォルトの名無しさん:2008/08/14(木) 13:47:21
>>474ができると言ってるじゃないか
480デフォルトの名無しさん:2008/08/14(木) 17:35:34
あれはモナド有りでの話だよ。
481デフォルトの名無しさん:2008/08/14(木) 18:53:40
ごめん、>>479>>477へのレスね
482デフォルトの名無しさん:2008/08/14(木) 18:54:49
山本モナド
483デフォルトの名無しさん:2008/08/16(土) 19:35:13
484デフォルトの名無しさん:2008/08/16(土) 20:24:00
コメント欄も読もうな
485デフォルトの名無しさん:2008/08/16(土) 22:50:09
486デフォルトの名無しさん:2008/08/17(日) 12:30:17
Xmonad/Config archive - HaskellWiki
http://haskell.org/haskellwiki/Xmonad/Config_archive
の設定ファイル郡を理解できるぐらいまでHaskellについて知りたいんですが
どこから勉強すればいいんでしょう?
知識はXmonadやGhcをソースからインストールできる程度です
487デフォルトの名無しさん:2008/08/17(日) 13:44:52
>>443 >>446 静的で強い型を持つ言語は、単純な実行時エラーを防ぐので
テストは軽減する。haskellなどはそのことが数学的に証明されているので
プログラマはぬるぽやoutofboundsなどの基本的な間違いにであうことなく、
本質だけを考えることができる。
488デフォルトの名無しさん:2008/08/17(日) 14:23:37
パターンマッチに失敗すること多くない?
たとえば「空でないリスト」型が欲しいとき、ぬるぽ的な実行時エラーを防げるの?
489デフォルトの名無しさん:2008/08/17(日) 14:47:05
ぬるぽは無いけどout_of_bounds発生させまくりですが
依存型のある言語なら防げるかも知れんけど
490デフォルトの名無しさん:2008/08/17(日) 15:31:08
>>487
おまえ初心者スレにいたHaskell信者だろ。
491デフォルトの名無しさん:2008/08/17(日) 18:08:12
はいはい両者リングアウト
492デフォルトの名無しさん:2008/08/17(日) 18:14:59
>>488
それヘボすぎ
493デフォルトの名無しさん:2008/08/17(日) 18:26:58
モナドがIOに使えるのは分かった。けどどうしてそれをIO以外にも使ってるの? >Haskell
誰か教えて下さい
494デフォルトの名無しさん:2008/08/17(日) 18:36:20
Maybe(笑)を証明するため
495デフォルトの名無しさん:2008/08/17(日) 18:36:41
便利だから
496デフォルトの名無しさん:2008/08/17(日) 18:42:38
どんな時に便利ですか?
497デフォルトの名無しさん:2008/08/17(日) 18:59:33
モナドのすべて
ttp://www.sampou.org/haskell/a-a-monads/html/
の以下の部分を読むとわかるかも

Maybe というモナド
ひとつの例
リストもモナド
498497:2008/08/17(日) 19:11:05
第 II 部:標準的モナドのカタログ
の各モナドの利用場面や動機を見るのもいいかもしれない
499デフォルトの名無しさん:2008/08/17(日) 19:15:59
一応リストモナドやMaybeモナドが計算に使える、というのは理解しているつもりですが、
便利だからという理由以外にモナドをIO以外に使う理由はあったりしますか?
それだけの理由で使うには扱いが難しくて、プログラムを組む度に頭がオーバーヒートしそうになる

慣れの問題かそれとも理解不足か・・
500デフォルトの名無しさん:2008/08/17(日) 19:25:15
>>489
そこでmaybeもなどですよ。
501デフォルトの名無しさん:2008/08/17(日) 20:06:22
モナドという抽象的な枠組みを考えることで
IO, Maybe, List, etcの計算の合成を統一的に扱えるってのが最大の利点なんではないかと。

単に使うだけなら主に慣れの問題だと思う。
いろんな例を見て慣れていけば少しずつ理解もできていくんではないかと。
502デフォルトの名無しさん:2008/08/17(日) 20:09:49
自分の作ったモナド上でdo式を書くと、世界の法則を書き換えてるような気分になってちょっと面白い
503デフォルトの名無しさん:2008/08/17(日) 20:33:06
>>501
レス有難うです
慣れの他に密度の問題もあるかもしれないと思ったり。
他の言語より1行あたりの密度が濃いものになりやすい気がする。
というか濃縮されすぎてわけが分からなくなりやすい気がする。
504デフォルトの名無しさん:2008/08/17(日) 20:38:12
>>501
計算を統一的に扱うだけであれば、普通の型クラスでいいんですよね?

モナドは値ではなくて型コンストラクタに対するクラスなので、ちょっと違う
と思うんですが。
50536 ◆K0BqlCB3.k :2008/08/17(日) 20:39:51
モナドっていうと仰々しいイメージがあるかもしれないけど、
所詮はただの代数的データ型とそのデータ型に対して一貫性あるAPIのセットに過ぎないよ。
ところで、 データ型とAPIのセット のことをなんて呼べばいいの?
506デフォルトの名無しさん:2008/08/17(日) 20:40:10
Stateモナドとかの(s -> (a,s))みたいな変な定義が気持ち悪い
型クラス(b,s) -> (a,s)に型bを部分適用したって考えれば意味は通るけど……
507デフォルトの名無しさん:2008/08/17(日) 21:08:43
>>505
それが「型クラス」、ではないのでしょうか?MonadやFunctorはちょっと
毛色が違うという認識は勘違いでしょうか?
508デフォルトの名無しさん:2008/08/17(日) 21:17:01
http://www.hyuki.com/haskell/20041228215300

Ord、Eq、Show などの データ型とそのAPIのセット は「型クラス」
Functor、Monad、MonadPlus などの データ型の構築子とそのAPIのセット は「型構築子クラス」
509デフォルトの名無しさん:2008/08/17(日) 21:31:22
それ単にOrdとかの『類』は*で引数をとらないけど
Functorの『類』は*->*みたいに引数をとる、って違いにしか見えない
分けて考えるのはおかしいと思う
510デフォルトの名無しさん:2008/08/17(日) 21:37:45
>>509
型クラスと型構成子クラスじゃ抽象度が違うよ。
511デフォルトの名無しさん:2008/08/17(日) 21:49:13
俺も>>509みたいに感じるなあ
抽象度が違うのは理解できるが
512507:2008/08/17(日) 21:58:16
抽象度の違う型クラスを持つことで、値の計算遷移とは別レベルの
遷移を持つことが可能だ、という印象を持つんですけどどうなんでしょうか。

普通の計算を行う裏側で別の次元での計算が行われ、且つそれが
結合法則を満たしている、というのがモナドの定義と考えるのは
どうですか?自分は圏論などのこと全く無知なのでHaskellの構文
からの直感的な印象だけなんですけど。
513デフォルトの名無しさん:2008/08/17(日) 21:59:06
じゃあ類が*->*->*(関数(->)とかタプル(,)とか)に対する型クラスとかは
もっと抽象度が違うので別の名前が必要なのか?型構築子構築子クラスとか。
有名な人が書いてるから鵜呑みにしてるだけなんじゃないの?
514デフォルトの名無しさん:2008/08/17(日) 22:31:24
>>512
だいたいあってんじゃね?
見えてる部分で適当に処理を書いたら裏で適当に処理してくれる、
普通のプログラミング言語じゃfor文やif文みたいな処理構造、
あるいはマクロとして提供されるものと同等の処理ができるんだけど、
実態は単に型クラスでしかないので俺定義できるし、高階関数使えるし、表記もシンプルで、いろいろ小細工が利くのが利点。
たとえば、IOみたいにコンストラクタを隠したりすれば脱出不可な構造を作れるってわけ。

結合法則を満たしているってのは、まぁ別に特別なことじゃない。
EqやOrdにも反射律とか推移則とか守らないといけないルールがあるけど、
よっぽどのことがない限り変な実装はしないだろうから、一般のプログラミング言語ではそこまで突っ込まない
でもモナドって実態がよくわかんないから、ルールを明記してる。そんだけでしょう。
515デフォルトの名無しさん:2008/08/17(日) 22:45:32
念のため補足。
>処理構造(略)同等の処理ができるんだけど
普通の言語では処理構造のものが、モナドが利用されてる例としてはErrorモナドとかContinuationモナドとかがあったね。

>よっぽどのことがない限り変な実装はしないだろうから、一般のプログラミング言語ではそこまで突っ込まない
浮動小数点の比較と等価性で違う実装がされてるとか、変な実装もあるけど。

個人的にはMonad則は、
値に関して順次実行できる何かで、値に対して何もしない処理もできる何かだ、というルールだと解釈してる。
516デフォルトの名無しさん:2008/08/17(日) 22:50:03
変な実装=全順序じゃない、と読み替えてくれ。
コンピュータのメモリ節約を考えれば生の浮動小数点型を使うのもまっとうな実装だわw
517デフォルトの名無しさん:2008/08/17(日) 23:19:23
ごめん、誤解を招くといやなのでもう一つ補足……
>値に関して順次実行できる何か
これは実行順序じゃなくて値の計算する方向を言ってるだけだよ。
g.f x がxにfを適用してgを適用するってのと同じことだよ。
実行順序は普通のモナドもIOモナドも方向は決まってないよ。
518初心者修業中:2008/08/17(日) 23:37:55
ん?
実行順序を明確にするのがIOモナドの目的の一つ
と認識していますが。

そういう意味ではないのかな…
519デフォルトの名無しさん:2008/08/17(日) 23:41:24
Haskellをみて日本のhaskellコミュって元気なの?
他の言語に比べて内と外をわけすぎるようなそんな印象をもってる。
なんでだろ?
520デフォルトの名無しさん:2008/08/17(日) 23:58:38
>>518
たとえば、
1:2:3:[]は、
1:2:3:[] → 1:2:[3] → 1:[2, 3] → [1, 2, 3]と簡約されるかもしれないし、
1:2:3:[] → [1, 2:3:[]] → [1, 2, 3:[]] → [1, 2, 3]と簡約されるかもしれない。
でも結果は一緒でしょ?

同じように、
Hello, Worldって出力 >> 一文字入力 >>= 前の文字を出力
みたいなのは、まぁ言ってみれば(不正確だけど)
[Hello,Worldって出力, 一文字入力, 前の文字を出力]みたいな並びにされる(と思われる。実装はカプセル化されていて不明)。
この並びがプログラム終了後にコンパイラにわたって、コンパイラがこれを順番に処理していく。

実はこの並びをプログラム終了後以外に評価する方法があって、それがUnsafePerfomedIOって言う関数。
getContentとかは実はこれを使って実装されている。
Unsafeという名前が示すように、素人にはお勧めできない。(getContent自体は普通に使える。)
521デフォルトの名無しさん:2008/08/18(月) 00:02:55
Maybeの特化にしか見えません
52236 ◆K0BqlCB3.k :2008/08/18(月) 00:25:49
>>519
世界的に全く元気がありません。
ちょこっと変なライブラリを書いたと思えばそれっきり離れていっている人も多数。
523デフォルトの名無しさん:2008/08/18(月) 01:36:55
>>520

後者の簡約は型がおかしいし、1:2:3:[]ではなく、
f x = (unsafePerformIO $ print x) `seq` xで
f 1:f 2:f 3:[]だった場合、前者と後者の簡約順序ではprintの順番が違ってくる。
前者は3,2,1で後者は1,2,3

一方で(>>=)は最左最外簡約でも最右最内簡約でも
左から順にしか値が定まらないようになってる。

putStr "Hello" >>= (\ _ -> getChar) >>= (\ c -> putChar c)
(>>=)の右辺が関数だから左辺の値が定まるまでa >>= bが最終的な値に簡約できないようになっている。
524デフォルトの名無しさん:2008/08/18(月) 03:17:18
>>522
元気無い理由って何でしょうか。他に元気ある言語ってあるのかな。
525デフォルトの名無しさん:2008/08/18(月) 04:14:24
ruby
526デフォルトの名無しさん:2008/08/18(月) 08:38:27
>>520
> 1:2:3:[] → [1, 2:3:[]] → [1, 2, 3:[]] → [1, 2, 3]と簡約されるかもしれない。

型が滅茶苦茶だよ。

> この並びがプログラム終了後にコンパイラにわたって、コンパイラがこれを順番に処理していく。

意味不明。なぜプログラム終了後にコンパイラが出てくる。
ランタイムライブラリとごちゃまぜになているぞ。
527デフォルトの名無しさん:2008/08/18(月) 10:05:00
Haskellにこういう奴が多い気がするのはなぜだ
528デフォルトの名無しさん:2008/08/18(月) 10:21:37
「こういう奴」と書けばどんな奴を指してるのか分かってもらえると思ってるような、
想像力の貧しい奴がこのスレに多いような気がする
529デフォルトの名無しさん:2008/08/18(月) 13:36:03
末尾が「気がする」で終わってるレスは
全部気のせいのような気がする
530デフォルトの名無しさん:2008/08/18(月) 15:08:49
なんという自己言及レス
531デフォルトの名無しさん:2008/08/18(月) 15:12:16
関数型らしくて言いじゃないか
532デフォルトの名無しさん:2008/08/18(月) 15:41:06
>>531
つ座布団1枚
533デフォルトの名無しさん:2008/08/18(月) 21:50:15
* -> * -> * ってどんなとき使うの?
534デフォルトの名無しさん:2008/08/18(月) 22:25:25
アナルトレイン
535デフォルトの名無しさん:2008/08/19(火) 07:45:46
  ( ゚д゚)゚д゚)゚д゚)
  /  つ つ  つ
  (_(_  ノ ノ  ノ
  し∪ ∪ ∪
536デフォルトの名無しさん:2008/08/19(火) 10:10:53
>>505
> ところで、 データ型とAPIのセット のことをなんて呼べばいいの?

プログラミング言語一般での話なら「抽象データ型」でしょうね。
537デフォルトの名無しさん:2008/08/19(火) 11:50:46
>>533
関数(->)とかタプル(,)とか
538デフォルトの名無しさん:2008/08/20(水) 20:24:46
485でおま。
それでなのです。 >ときどきの雑記帖の中の人
539デフォルトの名無しさん:2008/08/21(木) 14:40:13
Arrow は * -> * -> * のクラス
MonadTrans は (* -> *) -> * -> * のクラス
540デフォルトの名無しさん:2008/08/21(木) 21:20:37
http://book.realworldhaskell.org/beta/

これの30章が消えてるんだけど・・・。
541デフォルトの名無しさん:2008/08/21(木) 22:05:29
本買えよ
542デフォルトの名無しさん:2008/08/21(木) 23:26:23
30章だけが読みたいんだよ。

ところで、HaskellでPetStoreってあるの?
54336 ◆K0BqlCB3.k :2008/08/21(木) 23:56:58
>>542
横からすみませんが、
Pet Storeをよく知らないのでちょこっと検索したんですが、
これっていったい何が面白いんですか?
544デフォルトの名無しさん:2008/08/22(金) 00:08:29
>>543
面白くは無いんだけど、色んな言語やフレームワークで同じもの作る
ことで比較をするためのものでしょ。同じアプリがこんな感じで作れ
ちゃうぞ、という。
545デフォルトの名無しさん:2008/08/22(金) 11:40:45
Haskellでウェブアプリというとふつう本か
54636 ◆K0BqlCB3.k :2008/08/22(金) 12:37:40
最近では新しい言語はWEBアプリが書きやすくないと人が入ってこないらしく、
ライトウェイト言語がブームみたいだね。
HaskellはライトウェイトではないからWEBアプリ向きとは全然思えないんだけど、
RubyでRubyOnRailsが考えられたみたいにHaskell独自のWEB向きキラーアプリが
出てこないとHaskellの人気はこれからもずっと平行線だと思うよ。
547デフォルトの名無しさん:2008/08/22(金) 12:41:19
>>546
WEBアプリが書きやすいっていうより、APIとかWEBコンテナが標準装備されてないとダメという感じがする。
Javaの功罪は大きい。
548デフォルトの名無しさん:2008/08/22(金) 12:41:59
まだ横ばいならたいしたもんだ
549デフォルトの名無しさん:2008/08/22(金) 12:48:26
>HaskellはライトウェイトではないからWEBアプリ向きとは全然思えないんだけど、
ライトウェイトって何?動的に型を付ければライトウェイト?
それとwebとどういう関係があるの?
550デフォルトの名無しさん:2008/08/22(金) 13:05:36
あまり考えずに気の向くままに書いてもあっさり動くのが
ライトウェイトってことじゃないか?
web案件は短期だったりアジャイルだったりでライトウェイトに
開発できるのが求められてるってのはある
551デフォルトの名無しさん:2008/08/22(金) 13:10:45
WEBアプリの開発者は、JavaかRubyのHowto本から入ってる。
だから、WEBアプリ開発者は、身体のどこかに、プログラミング言語のJavaかRubyに似てない部分に拒否反応を持ってる。
552デフォルトの名無しさん:2008/08/22(金) 13:11:10
ここでHaskellは人間の思考過程に最も近いから
考えが即座にコードにうつせるため開発期間が最短であると主張する人がどこからか登場
                    ↓
553デフォルトの名無しさん:2008/08/22(金) 13:23:23
                    |
                ( ゚д゚ )↓
                 (⊃⌒*⌒⊂)
                  /__ノ''''ヽ__)
554デフォルトの名無しさん:2008/08/22(金) 13:27:58
>>550
それならHaskellもライトウェイトで良くね?
555デフォルトの名無しさん:2008/08/22(金) 14:05:36
明示的なコンパイル作業が必要ないってのはLLの必要条件な気がする。
556デフォルトの名無しさん:2008/08/22(金) 14:18:04
LLとかWebアプリとか、
だから普及しないとか、
どうでもよくねえ?
好きな事、楽しい事すればいい。
557デフォルトの名無しさん:2008/08/22(金) 14:22:47
>>555
runghcがあるじゃないか
もうちょっと速ければと思うことはあるけど
558デフォルトの名無しさん:2008/08/22(金) 14:34:05
>>556
そういう立場も理解できるけど、俺は普及してほしい
ライブラリのメンテとか人が足りてないじゃん
559デフォルトの名無しさん:2008/08/22(金) 14:46:33
>>552
Prologには負けるんじゃない。
56036 ◆K0BqlCB3.k :2008/08/22(金) 14:47:15
runghcはオーバーヘッドもかなり大きいみたいだね。

$ cat hello.hs
main = putStrLn "hello"
$ time runghc6 hello.hs
hello

real 0m0.835s
user 0m0.780s
sys 0m0.052s

$ cat hello.rb
print "hello\n"

$ time ruby hello.rb
hello

real 0m0.015s
user 0m0.012s
sys 0m0.000s
56136 ◆K0BqlCB3.k :2008/08/22(金) 14:48:14
$ cat hello.pl
print "hello\n"

$ time perl hello.pl
hello

real 0m0.007s
user 0m0.004s
sys 0m0.000s

$ cat hello.py
print "hello"

$ time python hello.py
hello

real 0m0.035s
user 0m0.020s
sys 0m0.016s
562デフォルトの名無しさん:2008/08/22(金) 15:03:43
LLでHaskell関係のプレゼンとかしてる人いるみたいだけど?
563デフォルトの名無しさん:2008/08/22(金) 15:07:56
WebアプリとLL(と呼ばれている言語)との間には全く関係はないけど、
Webアプリのかなり大部分は一般的にLLと呼ばれている言語で書かれているだろう。
そういう"LL"はテキスト処理がしやすいからってのがあるだろうな。
まあHaskellがそういう意味で人気にならなくても別にどうでもいいけど。

ここでmondic Parser Combinatorを持つHaskellが
最もテキスト処理に適した言語であると主張する人がどこからか登場。
                    ↓
564デフォルトの名無しさん:2008/08/22(金) 15:38:43
HaskellもLL言語だよ
565デフォルトの名無しさん:2008/08/22(金) 15:45:06
これどうなの?
ttp://happs.org/
566デフォルトの名無しさん:2008/08/22(金) 16:09:31
Parser Combinatorがあるからテキスト処理ならHaskell最強だろ。







満足した?
567デフォルトの名無しさん:2008/08/22(金) 17:42:48
haskellは型推論がちゃんと効いてる使い方が出来れば、LL的な生産性は確保できるだろう。
だがな、至高の存在で良いじゃないか。

haskellの性質上webプログラミングは不得意分野に思うんだが、mod haskellなんて生まれる
分けでもないし生まれたところで破壊的操作がほとんどできないし、ファイル操作は基本的に
苦手でしょ。webは動的言語の親玉が一番向いてるけどs式アレルギーな人が多いからLLに
なってるんでしょうね。

だから、無理にwebに擦り寄らずとも良いと思うんだけどね。むしろ、破壊的操作より安全性を
大切にされる金融などのところで目立つ存在になってくれたらいいんじゃないか?
56836 ◆K0BqlCB3.k :2008/08/22(金) 18:09:07
>>567
もし金融などで使われることを想定するなら、
haskellの並列処理に関する部分も早く実装してほしいところですね。
(まだ未完成)
569デフォルトの名無しさん:2008/08/22(金) 18:44:00
某氏のhapps解説はお流れ?

>>567
> 破壊的操作がほとんどできない
なんで?
570デフォルトの名無しさん:2008/08/22(金) 18:58:34
なんでそんなにHaskellの応用分野を限定したがるんだw

>>567
コンパイルするならmod_haskellがあっても恩恵は小さいだろ
>破壊的操作がほとんどできないし
Haskellで入出力書いたことあるか?
>ファイル操作は基本的に苦手
これも良く分からん
flock使うのにわざわざライブラリを落としてこないといけないとか、そういうこと?
571デフォルトの名無しさん:2008/08/22(金) 19:43:28
ウイルス対策ソフトのように危機感を煽るのはいいが、
既存のシステムを補強するのではなく全部作り直せというのは、ちょっとね
572デフォルトの名無しさん:2008/08/22(金) 19:54:17
>>570
Prologを事務処理に使うと、住所や氏名情報などで爆発的にアトムが
発生し、Heap領域を埋め尽くして、GCが頻発するという事態となる。
もちろん数百万レコードを越える処理単位の話だが。
Haskellの場合この問題は起きないの?
573デフォルトの名無しさん:2008/08/22(金) 20:37:03
Webアプリが苦手ってことは無いと思うんだけどな。今後Webベースのアプリは
まだ増殖するだろうから、そっちで使いやすいフレームワークやDSLが出ないと
使う人は頭打ちだと俺も思う。

研究者の論文レベルのものも面白いだろうけど、上から下までHaskellベースで
かかれたWebアプリとかで目立つものが出てほしいよ、個人的には。
574デフォルトの名無しさん:2008/08/22(金) 20:53:32
>>572
アトムの爆発ってのはPrologスレで言及されてる現象のことでいい?
そもそもPrologのアトムってのが良く分からんので何が問題なのか理解できん
Lispのシンボルみたいな物と思っていいのかな
それなら相当するものはHaskellにはないよ
575デフォルトの名無しさん:2008/08/22(金) 21:35:41
>>574
Lispのシンボルみたいな物、ですね。
記号をどう処理しているのですか。
576デフォルトの名無しさん:2008/08/22(金) 21:53:05
>>540
30章ってなんの章だったの?
577デフォルトの名無しさん:2008/08/22(金) 22:12:26
>>575
「記号」と言われてもいまいちピンと来ないんだが、何にせよ、
普通の手続き型言語が「記号」を処理するのと大差ない方法で処理してると思う

取り得る種類がコンパイル時に決まっているなら列挙型
そうでないなら整数とか文字列
文字列の比較のコストが問題になるなら自分でシンボルテーブルのようなものを用意する、とか
578デフォルトの名無しさん:2008/08/22(金) 22:34:03
579デフォルトの名無しさん:2008/08/23(土) 09:45:26
>>572
Prologでも、
1レコード512バイトをsub_atomで30項目に分解したり、更にsplitの
処理をしたりすると確かにアトムが大量発生するだろうが、
Stringとして読み込んで、終始String処理に徹すれば、アルファベットの
数、つまり高々数万のアトムで済むんじゃないの?
Stringすなわちリスト処理になると遅いから嫌なのかな。
580デフォルトの名無しさん:2008/08/23(土) 10:00:27
宣言的言語をリアルタイム処理に使いたくない病にかかってる。
資源が十分にあると理屈では分かっていても、終わったら電源切っても大丈夫な処理じゃないと拒否反応がでる。
581デフォルトの名無しさん:2008/08/23(土) 10:09:14
>>579
処理速度もあるかも知れませんが、アトムだと、
foo([株式会社|R],R).
と書けるところが、Stringだと
foo(List,R) :- append("株式会社",R,List).
と書かなくてはならないということがあります。
appendを高速化する機構が欲しくなりますね。
582デフォルトの名無しさん:2008/08/23(土) 10:35:10
それって代数的データ型を使ってこんな感じで良いんじゃない?

data Atom = Kabushiki | Dummy deriving (Show, Eq)

foo :: [Atom] -> [Atom]
foo (Kabushiki : r) = r
583デフォルトの名無しさん:2008/08/23(土) 11:43:27
584デフォルトの名無しさん:2008/08/23(土) 12:43:04
>>581
この話おかしいよ。
foo([株式会社|R],R). の方は、
すでに株式会社というアトムが切り出されていて、リストの構成要素になっている。
一方、
foo(List,R) :- append("株式会社",R,List). のListはString。ここは、
foo(["株式会社"|R],R).
でなきゃ、フェアじゃない。
585デフォルトの名無しさん:2008/08/23(土) 13:58:45
>>572
> Prologを事務処理に使うと、住所や氏名情報などで爆発的にアトムが発生し

第五世代コンピュータプロジェクトの成果を是非参照下さい。
58636 ◆K0BqlCB3.k :2008/08/23(土) 14:16:16
>>585
よく知らないけどソフトウェア科学会会誌7月号に第五の話題が載っていたよ
587デフォルトの名無しさん:2008/08/23(土) 14:21:10
成果って、「prologって役立たずじゃん」という結論を得たこと?
58836 ◆K0BqlCB3.k :2008/08/23(土) 14:28:53
>>587
それは短絡的な人たちの根拠のないうわさ。
第五は基礎研究なので企業の人たちが求めるような成果が出ないのは当たり前のこと。
589デフォルトの名無しさん:2008/08/23(土) 14:31:33
Prologの話は他でやってくれ
んで問題点を整理してまたいらっしゃい
59036 ◆K0BqlCB3.k :2008/08/23(土) 14:33:31
詳しいことは忘れたけど、
述語論理による仕様記述を使った鉄道のプロジェクトが企業側で行われた例があったような。
なんだったっけ?
591デフォルトの名無しさん:2008/08/23(土) 14:45:22
Prologはどうでもいいのだが、Haskellで金融(とくに保険業)のアブリを
開発する場合、何か問題になる点はないのか。
592デフォルトの名無しさん:2008/08/23(土) 14:54:20
>>591
必要なメモリサイズを予測しにくい点とか。full lazyな処理系全般に言えると思うけど。
593デフォルトの名無しさん:2008/08/23(土) 14:57:02
金融系システムにHaskellを使うメリット自体が思いうかばん。
いいじゃん、Javaでつくるのが流行ならJavaで作らせれば。
どうせ枯れたシステムなんだから。
594デフォルトの名無しさん:2008/08/23(土) 15:00:18
>>592
full lazyな処理系って、よくわからない。
59536 ◆K0BqlCB3.k :2008/08/23(土) 15:11:43
どんな言語で書いたとしても、必要なメモリの量は実際に動かしてみないとわからないよ。
596デフォルトの名無しさん:2008/08/23(土) 15:17:46
haskellっていいプロファイラあんの?
597デフォルトの名無しさん:2008/08/23(土) 15:26:42
>>595
COBOLなんかは確定してると思うけど。
598デフォルトの名無しさん:2008/08/23(土) 15:42:16
>>597
してない。
SORTなどに内部的に使う記憶容量が不明。
599デフォルトの名無しさん:2008/08/23(土) 15:43:11
Haskellのようにデフォルトで遅延評価する言語は、
計算をできるかぎり遅延させようとするから、
下手な書き方するとすぐメモリリークする

Haskellのメモリリークは大抵の場合小規模な修正で直るけど、
どこを修正すべきか探すのに慣れとプロファイラが要る

>>596
GHC付属のプロファイラは優秀だと思う
60036 ◆K0BqlCB3.k :2008/08/23(土) 15:47:59
>>596
profオプションをつけてコンパイルしたらランタイムシステムにプロファイラが組み込まれるよ。
詳しくはマニュアルで。
601デフォルトの名無しさん:2008/08/23(土) 16:19:23
>>598
ん?確定はしてなくても最大どれかけかかるかは確定してるでしょ。
グラフ簡約のヒープ消費は予測もつかんぞ。
602デフォルトの名無しさん:2008/08/23(土) 16:27:11
>>601
確定してるのかしてないのかどっちだw
603初心者修業中:2008/08/23(土) 16:37:52
Haskellでメモリーリークが起きるのですか?

ガベージコレクションにバグがない限り、
メモリーリークが起きるとは思えないのですが…。

FFIを使った場合の事でしょうか…。
604デフォルトの名無しさん:2008/08/23(土) 17:15:44
>>599 の例としては↓の話かな。
http://d.hatena.ne.jp/desumasu/20060909/1157800884

この場合のメモリーリークは単なるメモリの解放忘れって事ではなくて、
期待した解放タイミングと実際のそれとのギャップの事みたいだね。
605初心者修業中:2008/08/23(土) 17:42:49
これも「メモリーリーク」と呼ぶのでしょうか?

*Main> foldr (+) 0 [0..1000000]
*** Exception: stack overflow
606デフォルトの名無しさん:2008/08/23(土) 18:05:58
プログラマが意図してないで、リファレンスが残るようなコーディングを
しちゃってる、というのをリークに含めることもある。
607デフォルトの名無しさん:2008/08/23(土) 18:34:57
>>605
それは「マヌケ」と呼びます。
608初心者修業中:2008/08/23(土) 18:57:56
stack overflowが発生する時、

簡単にわかる場合は「マヌケ」
ちょっとわかりづらい場合は「メモリーリーク」

と呼ぶという認識でよろしいでしょうか?
609デフォルトの名無しさん:2008/08/23(土) 19:14:20
リークってのは「漏れ」のこと。
GCのある言語だと、>>606しか起こり得ない。
>>605の「溢れ」とは全然違う。
610デフォルトの名無しさん:2008/08/23(土) 19:20:46
>>605
それはスタックオーバフロの例外であって、エラーとは違う。
メモリリークしているわけではないよ。
611デフォルトの名無しさん:2008/08/23(土) 19:22:12
C言語みたいに型があいまいな言語ではメモリリークが起こりうるが、
Haskellみたいに強い静的型付けされている言語にはメモリリークなんてありえないよー
612デフォルトの名無しさん:2008/08/23(土) 19:26:56
スタックオーバーフローとメモリーリークは
現象として全然違うと言う事ですね。
分かります。
613デフォルトの名無しさん:2008/08/23(土) 19:53:14
>599や>604が挙げているような例はC言語で
良く言われる「メモリーリーク」とは違う現象だな。

Haskellの場合、遅延評価がデフォーなので
うかつに再帰を使うと計算の途中結果が膨大な
ものになってヒープ領域が溢れてしまう。

Cの場合はただの確保したメモリの解放し忘れ。
Cでも再帰的なメモリー確保をすれば
Haskellみたいな事も起きうるはずだが。
614デフォルトの名無しさん:2008/08/23(土) 20:06:48
>>611
強い静的型付けとメモリーリークの有無はほとんど関係がありません。
GCの方がずっと関係が深いです。
615デフォルトの名無しさん:2008/08/23(土) 20:09:24
Pascalのnewとfreeだっけ?
あれ考えれば分かるよな。
強い型付けでも簡単にメモリーリークは起きる。
616デフォルトの名無しさん:2008/08/23(土) 20:56:45
foldl でも stack overflow するんだよね。
Data.List.foldl' 使えばいいんだけど。
617デフォルトの名無しさん:2008/08/23(土) 21:35:43
なんで foldl でスタック溢れるの?末尾再帰が最適化されてないの?
618デフォルトの名無しさん:2008/08/23(土) 21:48:31
>>604のリンク先に書いてある
末尾再帰は最適化されるよ
619初心者修業中:2008/08/23(土) 23:53:01
>>617
遅延評価だからと認識しています。
↓参考
http://haskell.g.hatena.ne.jp/jmk/20060710/1152516465
620617:2008/08/24(日) 00:40:37
>>618-619
なるほど、非常によくわかりました。
(つーか前出のリンク読まずにレスして申し訳ない)

うーむ、しかし末尾再帰が最適化されることの旨みは、
・ローカルスコープの値をスタックに積む必要がなくなることと
・連続するreturnが省略されること
の2点だと思うけど、foldl のように結局は遅延評価のための
computation がスタックに積まれていて、後から順次簡約するなら
「最適化されている」とは言い難い気もするな・・・。
最適化するための然るべき変形は、一応してあるんだろうけど。

まあ seq 使うとか、回避の仕方がないわけじゃないからいいのかな?
621デフォルトの名無しさん:2008/08/24(日) 00:54:46
↓にも関連した話が載ってる。
http://itpro.nikkeibp.co.jp/article/COLUMN/20070403/267180/?P=2
622デフォルトの名無しさん:2008/08/24(日) 13:10:00
■■学校を作ろう!■■
VIP発でサイトを作ろうと思うんだ。(詳しくはWikiを見てくれ)
パートスレになるんでパー速(GEP)に移動している。
今スタッフを募集しているから、来てくれないか?

■Wiki
http://www36.atwiki.jp/vipvipschool/
■募集スタッフ
プログラム担当(特にErlang、Perl)
デザイナー(サイト上のアイコン、ロゴなど)
WEBデザイナー(サイトデザイン案に沿って、htmlやCSSを書ける)
他にも宣伝担当なども募集している。
■スレ
http://ex14.vip2ch.com/test/read.cgi/news4gep/1219068297/
623デフォルトの名無しさん:2008/08/24(日) 16:41:26
「特にErlang」…

実用性でいうとやっぱErlangなのかな…
624デフォルトの名無しさん:2008/08/24(日) 18:20:21
>623
大規模なWebサービスを構築するのに向いていると
考えたから企画者がErlangを採用したんだろうね。
625デフォルトの名無しさん:2008/08/25(月) 09:10:25
大規模な、ってのがクセ者で、
実情は単にDBのテーブルが大きいだけだったりするよな。
そもそもウェブアプリでDB以外どこが肥大化するよ?
626デフォルトの名無しさん:2008/08/25(月) 09:11:28
画面?
627デフォルトの名無しさん:2008/08/25(月) 09:20:29
>>625
複数のwebサービスから情報集めたり、もしくはhttp以外のプロトコルで通信して情報を取得しなきゃいけなかったり、
別プロセスで並列キューに入れて処理しなきゃいけなかったり、システムそのものが大きくなるとこはあると思う。
それともデータサイズの規模に限定した話?
628デフォルトの名無しさん:2008/08/25(月) 09:53:32
>>625
とりあえずErlang + YAWSの事例くらいは、
念頭においてくれないと、話にならないのでは?
629デフォルトの名無しさん:2008/08/25(月) 09:55:11
>>627
> 複数のwebサービスから情報集めたり、

そういうのはAjaxでクライアント側がやるのが流行では?
まあサーバ側がやってもいいですが、HTTPセッションを入れ子にするのは
あまり筋がいい設計とは思えません。

> もしくはhttp以外のプロトコルで通信して情報を取得しなきゃいけなかったり、

まあDB接続なんかもそうですよね。
しかし「大規模になる」ような要因とはあまり考えられないのですが。

> 別プロセスで並列キューに入れて処理しなきゃいけなかったり、

fastcgiとかの話でしょうか?特段、だから大規模になるというものではないと思いますが。

> それともデータサイズの規模に限定した話?

コード自体はほとんどCMS系フレームワークをユーザ定義コンテナを定義する程度で
用が済むことが多いと思います。特に、>>622のような、いかにもCMSっぽいシステムでは。
630デフォルトの名無しさん:2008/08/25(月) 10:00:08
>>629
> コード自体はほとんどCMS系フレームワークをユーザ定義コンテナを定義する程度で
> 用が済むことが多いと思います。特に、>>622のような、いかにもCMSっぽいシステムでは。

よいCMS系フレームワークを、
容易に開発できるかどうかって話をしているんだと思いますよ。
631デフォルトの名無しさん:2008/08/25(月) 10:54:21
>>630
なるほど、わかりました。
格納するコンテンツの量は結局DBのサイズの問題になると思うので、
それ以外の「大規模」の要因というと、
・同時接続数(パフォーマンス)
・登録ユーザー数
ぐらいでしょうか。
それとも単純にコードサイズを指して「大規模」という話なんでしょうかね。
「学校」というドメインが明確になっているので、
一般のCMSフレームワークほど汎用化は要求されないし、
どのような要因でコードサイズが「大規模」化するのか興味があります。
632デフォルトの名無しさん:2008/08/25(月) 12:22:00
>>624
Apacheとか使わずErlangでサーバー構築するんじゃないの?
633デフォルトの名無しさん:2008/08/25(月) 12:26:39
キッチンシンクアプローチか……
634デフォルトの名無しさん:2008/08/25(月) 13:01:50
Erlangをわざわざ使うということは、数百レベルの並列プロセスを
マルチコアで何とかしようと考えていると見て間違いない。
Webだとすれば、WebServer以外考え難い。生徒数千でほぼ
同時にアクセスがあるとか。
635デフォルトの名無しさん:2008/08/25(月) 13:13:15
しかし、>>622 はなんでErlangスレに書いてないんだ?w
636デフォルトの名無しさん:2008/08/25(月) 13:16:41
単に初期メンバーにErlang使いが居ただけなじゃいの?
637デフォルトの名無しさん:2008/08/25(月) 13:16:52
Erlangスレ見たことない方ですねw
638デフォルトの名無しさん:2008/08/25(月) 13:42:02
Erlangはどうでもいいんだけれど、
HaskellでもPerl使いを確保しておいて、単体の機能は専らCPANから取り出させて、
確保されているインターフェイスを介してHaskellで利用するというやり方は
多くなるんじゃないかな。短時間で開発する一手法としてね。
639デフォルトの名無しさん:2008/08/25(月) 13:57:49
ならないね。
640デフォルトの名無しさん:2008/08/25(月) 14:13:29
>>638 落日のPerlを使うかどうか。 規格書の通りに一からすべて開発するのは確かに大変だね。
641デフォルトの名無しさん:2008/08/26(火) 00:21:14
Text/ParserCombinators/ReadP.hsとKoen Claessen氏のペーパーを読んで思ったんですが、

Haskellに慣れてくるとこの実装が直感的に見えてくるんですか?
Haskellのパーサコンビネータ関連のペーパーを読んでいない状態でReadPを読んで、

data P a = Get (Char -> P a)  
      略
      | Result a (P a)
      略                  なのを「え、一番直感的じゃん」

とか、
newtype ReadP a = R (forall b . (a -> P b) -> P b)

instance Monad ReadP where
  return x   = R (\k -> k x)                    ← これとか
  fail _      = R (\_ -> Fail)
  R m >>= f  = R (\k -> m (\a -> let R m' = f a in m' k))  ← これとか
とか
get = R Get
ってなるを、「ああ、自明だなすげえ直感的」みたいに理解できるようになる物なんですかね。。難しすぎる。。。
642デフォルトの名無しさん:2008/08/26(火) 00:29:58
>>629
大規模になる要因なんていくらでもあるじゃん。
今時は単にUIがWebで、バックエンドが複雑化してるものも少なくないしね。
分散業務システムで多種類のプロセスを相手にすりゃ自然と規模は大きくなるかと。
何でもかんでもインターネット上でパブリックに利用可能な整理されたサービスばかりじゃないからね。
学校だって企業並みにシステムが複雑化してるとこもあるから、強ち単純とは言えないんじゃないかと。
まあ何はともあれ、ロジックが複雑になればなるほど、関数型の恩恵は大きくなるわな。
643デフォルトの名無しさん:2008/08/26(火) 01:08:51
といったって、googleも複雑なシステムとか言われてるけど、
googleを支える技術とか読んでもそんなに複雑とは思えないんだよなぁ。
台数は1台だけど自宅で似たようなことやってるもん。
644デフォルトの名無しさん:2008/08/26(火) 08:11:38
>>641
P のような再帰的な型のモナドを、
効率のために継続モナド(ReadP)で包むのは定石。
Haskell への慣れっていうより、
モナドや継続モナドへの慣れの問題な気がする。

P は問題によって様々だけど、
ReadP のとこは Control.Monad.Cont の
一般的な継続モナドと(型を除いて)同じなので、
それを理解しておくと問題に集中できていいかもよ。
645デフォルトの名無しさん:2008/08/26(火) 08:13:32
つ チラシの裏
646デフォルトの名無しさん:2008/08/26(火) 08:21:08
>>642
それはバックエンドで動いている他プロセスが複雑なのであって
ウェブアプリが複雑なわけではないのでは?
647デフォルトの名無しさん:2008/08/26(火) 08:32:48
>>625
機械翻訳とかではなくて?
648デフォルトの名無しさん:2008/08/26(火) 18:38:57
>>644
どうもレスありがとうございました。

>P のような再帰的な型のモナドを、
>効率のために継続モナド(ReadP)で包むのは定石。
これは初めて聞きました。どうもありがとうございます。

確かに
If we want to build monads on top of a continuation based programming paradigm,
such as stream processors or continuation based I/O in Haskell,
we need to build a monad around the continuation based operations.
って書いてあるペーパーを見付けました、その継続ベースの方法について考えながら考えていこうと思います。

649デフォルトの名無しさん:2008/08/26(火) 18:52:43
650デフォルトの名無しさん:2008/08/26(火) 19:00:04
>>649
そうです、でもこれだけ読んでもこれで何がしたいのか俺には正直よく分かりませんな。。
例がなくても理論だけ聞けば全て分かるタイプの人なら大丈夫なのかもしれませんが。
651デフォルトの名無しさん:2008/08/28(木) 06:47:20
>>648
P みたいなのを継続ベースともいうけど、
ReadP を使うのは純粋に効率のためで、
そこに書いてあるのとは話が違うような。
652デフォルトの名無しさん:2008/08/28(木) 11:12:38
> 純粋に効率のためで

そう単純化されても…
653デフォルトの名無しさん:2008/08/28(木) 14:48:42
いや、単純だし…
654デフォルトの名無しさん:2008/08/28(木) 21:41:23
具体的にどういう場合にどうして効率が良くなるんですか?
ReadPだと、PがReadPで包まれてるわけだけど、

get' = Get return
look' = Look return
sat' p = do a <- get' ; if p a then return a else Fail
char' c = sat' (c == )
string' s = do str <- look' ; scan s str
   where scan [] _ = return s
       scan (x:xs) (y:ys) | x == y = do get' ; scan xs ys
       scan _ _ = Fail
みたいにReadPでくるまないバージョンも用意できて、それもrunで使える。
http://www.cs.chalmers.se/Cs/Grundutb/Kurser/afp/2006/Papers/parser-claessen.pdf
ここにも効率がって書いてあるけどどんな場合なのかさっぱりだ。。
655デフォルトの名無しさん:2008/08/29(金) 14:13:46
ReadPはdata宣言じゃなくてnewtype宣言だから、
記述上は包まれた形になってるけど、実装では包みが外れた形になる。

参照: http://haskell.g.hatena.ne.jp/jmk/20061203/1165141002

Pは直接的にはうまく束ねることができないから、一旦仮想的なReadPで束ねてるって感じ?
656デフォルトの名無しさん:2008/08/29(金) 15:53:54
>>655
どうもありがとうございます。

実際にはReadPの所はR Get やR Lookなどが渡されることになりますよね。
そのあとすぐにrunで即Rはずしてますし。

>Pは直接的にはうまく束ねることができないから
これってどういう意味で仰ったんですか?
P を束ねてパーサとして使うことも、実際できる(>>654のget'など)のでわざわざどうしてReadPにするのか、
Pの>>=が左結合的に作用するのが問題らしいんですけどそれが問題になる具体的なケースについて
私にはサッパリ思い付かなかったので先人たる皆様にお聞きしたかった次第です。
657デフォルトの名無しさん:2008/08/29(金) 17:28:28
>>654
ReadP の計算で左結合になってる >>= がある場合でも、
内側の P の >>= をすべて右結合にすることで、
P の >>= の再帰が無くなって効率が良くなる。

9節の第1パラグラフに書いてある通りなんだけど。

左結合を右結合にってのは、>>= の結合則
(m >>= f) >>= g == m >>= (\a -> f a >>= g)
の左辺を右辺にするってな話。
例えば、string s >>= f でも string s の中で
>>= を使ってるので、左結合になってる。
つまりほとんど全ての場合に当てはまる。
658デフォルトの名無しさん:2008/08/29(金) 17:29:19
効率が悪くなる事情は、そこにも書いてあるようにリストの ++ と同じ。

リストの ++ は左引数に関して再帰する。
[] ++ ys = ys
(x:xs) ++ ys = x : (xs ++ ys)
そのため (xs ++ ys) ++ zs は xs に関して二重に再帰することになる。
foldr (++) [] (map show [1..10000])
foldl (++) [] (map show [1..10000])
実際これらを実行してみると前者はすぐ終わるけど、後者は "1" を10000回結合、
"2" を9999回結合、... "10000" を1回結合、みたいになって遅い。加速してくけど。
遅いだけじゃなく、中間リストを生成するので無駄にメモリを使うことにもなる。
foldl は極端な例だけど、foldr も極端で、いつも無駄が無いようにはいかない。
659デフォルトの名無しさん:2008/08/29(金) 17:30:18
で、回避策。

xs ++ ys は、xs の最後の [] を ys に置き換える。
それを効率よくやるには、最初っから [] なんか使わないで、
1:2:3:[] を \nil -> 1:2:3:nil みたいにしとけばいいじゃんという発想。
つまり [a] を [a] -> [a] に、xs を xs ++ に、++ を (.) にする。

こうしておくと、[] を与えてリストに戻すときには、
(.) が右結合になってなくても ++ は右結合になる。
(((xs ++) . (ys ++)) . (zs ++)) []
= ((xs ++) . (ys ++)) (zs ++ [])
= (xs ++) (ys ++ (zs ++ []))
= xs ++ (ys ++ (zs ++ []))

実際 String の ++ を頻繁に使う class Show あたりでは、
できるだけ type ShowS = String -> String を使うことになってる。
shows :: Show a => a -> ShowS を使ってさっきの
foldl (.) id (map shows [1..10000]) []
をやってみると、今度は問題無く速い。
660デフォルトの名無しさん:2008/08/29(金) 17:31:29
で、ReadP。

m >>= f (P の >>=)は、m の最後の return a を f a に置き換える。
それを効率よくやるには、最初っから return なんか使わないで、
Get (\c1 -> Get (\c2 -> return [c1,c2])) を
\k -> Get (\c1 -> Get (\c2 -> k [c1,c2])) みたいにしとけばいいじゃんという発想。
つまり P a を forall b. (a -> P b) -> P b に、
m を m >>= に、>>= を \m f k -> m (\a -> f a k) にする。

以下略。
661デフォルトの名無しさん:2008/08/29(金) 17:32:22
で、余談。

foldr c n xs は、xs の : を c に、[] を n に置き換える。
それを効率よくやるには、最初っから : や [] なんか使わないで、
1:2:3:[] を \c n -> 1 `c` 2 `c` 3 `c` n みたいにしとけばいいじゃんという発想。
つまり [a] を forall b. (a -> b -> b) -> b -> b にする。
リストに戻すときは build xs = xs (:) [] を使う。
すると foldr c n (build xs) ==> xs c n と変換できる。

map f xs <==> build (\c n -> foldr (c . f) n xs)
例えばこういう変換を定義すれば、
(map f . map g) xs = map f (map g xs)
==> build (\c n -> foldr (c . f) n (build (\c n -> foldr (c . g) n xs)))
==> build (\c n -> (\c n -> foldr (c . g) n xs) (c . f) n)
==> build (\c n -> foldr (c . f . g) n xs)
==> map (f . g) xs
のように map f . map g ==> map (f . g) という変換ができる。
map f . map g 以外にも、他のいろいろなリスト関数の
foldr/build を使った形への変換を定義しておけば、いろいろな変換ができる。
foldr/build による融合変換ってやつ。今の GHC もこれを使ってる。
詳しくは GHC User's Guide の 8.13. Rewrite rules あたりを見てくれ。
662デフォルトの名無しさん:2008/08/29(金) 18:19:15
>>657-661
とても分かりやすい解説どうもありがとうございます!
ちょっと解決の糸口がつかめた感じがします、これからじっくり考えてみたいと思います。
とてもご丁寧にありがとうございました。

流石だ。。。
663デフォルトの名無しさん:2008/08/30(土) 18:34:32
Haskellが宣言型言語とか最初に言い出したのは誰なのかしら
664デフォルトの名無しさん:2008/08/30(土) 18:44:45
imperative language ←→ declarative language の対比で
ごく自然発生的なものだと思うが?
665デフォルトの名無しさん:2008/08/31(日) 00:07:29
宣言型言語 = what(何をしたいか)を記述
手続き型言語 = how(どうやるか)を記述

クロージャをいかに早めに潰すかに苦心するHaskellは後者ですな
666デフォルトの名無しさん:2008/08/31(日) 00:38:36
>>665
宣言型言語=述語論理を記述

と思ったらHaskellも述語論理の仕様記述言語に非常に近い特徴を持っていることに気づく。
667デフォルトの名無しさん:2008/08/31(日) 03:38:00
>>665
> クロージャをいかに早めに潰すかに苦心
ってどういうこと?
668デフォルトの名無しさん:2008/08/31(日) 09:45:13
>>667
関数のインライン展開のようなものじゃないか
よく分からんが
関数リテラルなら展開しやすいが高階関数の戻り値のクロージャは展開しにくい気がする
だからどう書くか (how) を工夫する

人間が問題を「宣言」するだけでコンパイラが問題を解いてくれる
というのは
素朴な解決策は簡単に見つかるのだが最適化が難しい (が機械的にできる) 問題に限定されるはず
669デフォルトの名無しさん:2008/08/31(日) 15:47:12
計算資源が有限なため、howが分からないとwhatも記述できないという罠
670デフォルトの名無しさん:2008/08/31(日) 15:59:09
本質的には what -> how の書き換えと how -> how の最適化は似たようなもんだからな。
最適化は手続き型でもやってるから、非手続き型の人はwhatの部分を強調してみたりC/C++より速くなると言ってみたり。

LLの人は最適化にあまり拘らないし、テストさえ通ればhowを直接書いてもいいやって感じだけど。
671デフォルトの名無しさん:2008/08/31(日) 17:18:22
>>667
>>600前後の流れ参照
要するに未評価の式(これはクロージャで実装されてる)を溜め込まないように注意する必要がある
672デフォルトの名無しさん:2008/08/31(日) 20:51:42
しかし、そんなこと言ってたらprologだって宣言型と言えなくなるんじゃない?
673デフォルトの名無しさん:2008/08/31(日) 21:42:38
お前らは
人間の性格はA型B型O型AB型の4種類に分けることができる
とか思ってそうだよな。
674デフォルトの名無しさん:2008/08/31(日) 23:36:24
なんでも過不足なく分類できると思い込む愚かさ
血液型と性格をろくな検証なしに簡単に結びつけてしまう短絡さ
どっちをさしてるのか紛らわしいので例としては不適
675デフォルトの名無しさん:2008/09/01(月) 01:06:10
>>674
おもしろおかしい
676デフォルトの名無しさん:2008/09/01(月) 07:57:32
677デフォルトの名無しさん:2008/09/01(月) 15:40:49
zipで(ry
678デフォルトの名無しさん:2008/09/02(火) 14:15:50
>>666
試しにZあたりの実行系でもつくってみればw
679デフォルトの名無しさん:2008/09/02(火) 17:56:25
>>678
何が言いたいのははっきり言え。
小馬鹿にするだけでは情報価値ゼロだぞ。
680デフォルトの名無しさん:2008/09/03(水) 08:50:51
述語論理なめんな、ってことじゃね?
せめてホーン論理に限定するとかじゃないと話にならんだろ。
681デフォルトの名無しさん:2008/09/03(水) 23:53:10
関数とKleisli以外のメジャーなArrowってあるの?っていうかArrowって死滅したの?
682デフォルトの名無しさん:2008/09/04(木) 00:04:13
>>676
おお!でも英語疲れる。訳書出版の予定はないの?
683デフォルトの名無しさん:2008/09/04(木) 01:25:52
>>681
死滅しそうなのはHaskellだが、新しいHaskellのライブラリはほとんどArrowベースだよ。
684デフォルトの名無しさん:2008/09/04(木) 11:41:24
このスレって嘘多いよな。
685デフォルトの名無しさん:2008/09/04(木) 12:00:02
このスレって〜

ってレス多いよな。
686デフォルトの名無しさん:2008/09/04(木) 15:00:58
そういえば、大学入試のときに大学ランクとタバコの関係に気づかされたなぁ・・・
東大 誰も吸っていない
京大 誰も吸っていない
同志社大 ちらほら
関西大 校舎内で吸っているやつがいる(!!!)

ありえないです、低ランク大・・・
やっぱりランクの低い大学出身のやつは信用できない・・・
687デフォルトの名無しさん:2008/09/04(木) 15:19:00
そして増える意味不明なレス
688デフォルトの名無しさん:2008/09/04(木) 15:20:04
>>684
素人なのでどの変がうそなのか教えてください
689デフォルトの名無しさん:2008/09/04(木) 15:45:52
686みたいな奴がhaskellを使うとはとても思えんのだが、
何しに来てるのかね?
690デフォルトの名無しさん:2008/09/04(木) 15:50:35
>>689
Haskellがどういうものだと思っているんですか?
691デフォルトの名無しさん:2008/09/04(木) 17:36:25
>>686は今マルチされてるコピペ、スルー推奨です。
692デフォルトの名無しさん:2008/09/04(木) 19:33:03
>>690
全角数字を見るといらっとくる人が使う言語
693デフォルトの名無しさん:2008/09/04(木) 19:35:16
確かにイラっときた
694デフォルトの名無しさん:2008/09/04(木) 21:21:38
>>693
それはカルシウム不足
695デフォルトの名無しさん:2008/09/06(土) 23:15:53
Haskellで良いコード綺麗なコードというのはどんなコードですかね。

出来るだけ変数使わない方がいいとか、何が何でもポイントフリーにするとか、
あるいはそれ以外でも、何でも。
696デフォルトの名無しさん:2008/09/06(土) 23:55:28
>>695
y f = f (y f)
697デフォルトの名無しさん:2008/09/07(日) 00:05:33
>>695
haskellでは数学的にきれいなコードが「きれいなコード」と呼ばれます。
698デフォルトの名無しさん:2008/09/07(日) 00:12:32
良いコード:
意味のあるところでControl.*を使う
悪いコード:
ポイントフリーのためにControl.ApplicativeやControl.Arrowをimport
699デフォルトの名無しさん:2008/09/07(日) 00:15:18
っていうか、ポイントフリーってなにがいいの?せっかくパターンマッチがあるのに。

>>687
ライブラリはそうだろうけど、普通のアプリを書くときは?
700デフォルトの名無しさん:2008/09/07(日) 00:33:20
単純な場合には無駄に変数が増えず、シンプルに分かりやすくなるから良い。
複雑な場合には無理をしても分かりにくくなるだけだから悪い。
パターンマッチとは使いどころが違う。
701デフォルトの名無しさん:2008/09/07(日) 00:34:19
>>699
圧倒的に短く書けるからだよ。
それにポイントフリーだと関数の入出力の流れみたいなのがまっすぐ表せるから、処理の全貌が見通しやすい
702デフォルトの名無しさん:2008/09/07(日) 00:41:52
まっすぐだけど、流れが逆じゃん。
というわけで>>>使うのはやっぱダメ?逆なのに脳味噌合わせるべきなの?
703デフォルトの名無しさん:2008/09/07(日) 00:46:48
GUIアプリを書くときはどういうのが綺麗なんだ?
704デフォルトの名無しさん:2008/09/07(日) 00:59:26
>>702
逆なの? y = f x より x f = y が脳味噌に合ってるの?
705デフォルトの名無しさん:2008/09/07(日) 01:11:04
>>704
なんでやねん。
unlines . take 10 . filter (> 10) . map read . lines
より、
lines >>> map read >>> filter (> 10) >>> take 10 >>> unlines
の方が、少なくとも俺は脳に優しく感じる。

で、こう書くと、map read と filter (> 10) を分けてるのが冗長でダサい気もするが、
(filter (> 10).read)みたいにした方が良いのか、かえってこっちの方がダサいのか、
あるいは、(filter (\x -> 10 > read x)) みたいにラムダにすべきなのか、綺麗の勘所が判らんのです。
706デフォルトの名無しさん:2008/09/07(日) 01:12:53
>>705
あ、前半がStringに戻してないのはご愛敬と言う事で、よろしく。
707デフォルトの名無しさん:2008/09/07(日) 01:32:55
>>705
String に戻さないといけないなら
filter ((10 <) . read) だろう。ラムダでもいいけど。
まあ、その辺はこだわるとこでもないかと。

> なんでやねん。
f (g x) と (f . g) x の向きは関係あるんですよ。
数学でも向き的事情から x^f という記法を使うこともある。
708デフォルトの名無しさん:2008/09/07(日) 02:23:43
>>702
左から右だろうが右から左だろうがどっちでも一緒だろ。
俺には違いが分からん。
709デフォルトの名無しさん:2008/09/07(日) 02:27:05
>>702
こういう反抗したい年頃のやつが言語を汚くしていくんだろうな。
なんでもないものを指差して「使いにくい」などと言ったり、まるでガキ。
710デフォルトの名無しさん:2008/09/07(日) 03:31:39
現代日本では横書き文字は左から右だから、
その方が自然に感じるのは当然と思います。

また、bind演算子が(>>=)で左結合である事を考えても
Haskellを設計した人もその方が自然と感じたのではないでしょうか?

慣れの問題かもしれませんが、
そんなにおかしな意見とは思えません。
711デフォルトの名無しさん:2008/09/07(日) 07:34:52
まあ関数合成の向きが右から左なのは>>707の説明の通りだし、Haskellに限らず数学でも同じルールだからな。数学でも気持ち悪いって云う人は結構居るしまあそんなに変わった意見でもあるまい。
712デフォルトの名無しさん:2008/09/07(日) 21:48:37
社内コーディング規約でここにスペースを入れろとかそういうのよりは高尚が感じがするかもしれないけれど
所詮バイクシェッド
乱用すれば読みにくいし、パズルみたいにポイントフリーするのは間違ってる
数学的に綺麗綺麗とか、圏論的に自然とかというけれど、誰でも圏論がわかるわけじゃないし。

しかし、いかにポイントフリーで書くか、という事を考えると確かにおもろいよ
713デフォルトの名無しさん:2008/09/07(日) 21:56:43
亀だが

>>36
>FPGAとかのHDL記述とかに応用したりしてる人いないの?

Lavaがあるよ。並列性とか関係ないし、回路をそのまま関数で書くだけなんだけど。そしてVerilogより使いやすい、なんてこたーない。HDLよりましだが、副作用を書くのがまわりくどい

http://www.cs.chalmers.se/Cs/Grundutb/Kurser/svh/tools.html

714デフォルトの名無しさん:2008/09/07(日) 22:31:52
s/HDL/VHDL/
715デフォルトの名無しさん:2008/09/08(月) 21:55:12
>>713
ArrowっぽいHDL作りたいな
716デフォルトの名無しさん:2008/09/09(火) 18:48:21
Real World Haskell
November 15, 2008

待ち遠しい。
717デフォルトの名無しさん:2008/09/12(金) 22:50:22
過度の並列化で複雑化するゲーム開発
コスト削減の鍵は純粋関数型言語らしい
http://www.watch.impress.co.jp/game/docs/20080911/epic.htm
71836 ◆K0BqlCB3.k :2008/09/12(金) 22:54:50
>>717
そうだろうね。
俺はずううっと前からそう論文に書いてたけど。
だんだんpi-calculusの人気が出てきたね。
719デフォルトの名無しさん:2008/09/12(金) 23:58:55
> Sweeney氏は純粋関数型言語のもつ並列処理安全性に着目しており、
>将来的にゲームプログラミングはそういった処理系に移行していくべきだとした。
>Sweeney氏はそのひな形として言語“Haskel”を挙げているが、
>ゲーム開発のメインストリームたり得る言語はまだ登場しておらず、将来に期待しているという。

なんでHaskellは駄目なんだろう。
ライブラリ含めた開発環境の問題か処理系の最適化の問題か
それとも言語仕様レベルで本質的に向いていないのか。
720デフォルトの名無しさん:2008/09/13(土) 00:06:19
前者じゃない?
721デフォルトの名無しさん:2008/09/13(土) 00:09:07
こんなことでもないと注目せんのだな
722デフォルトの名無しさん:2008/09/13(土) 00:48:51
遅延評価に漬かりまくりで、ダメなのでは?
遅延評価って言ってみれば、後ろからの逐次でそ?
無限リスト使えないHaskellってHaskell?
723デフォルトの名無しさん:2008/09/13(土) 07:07:42
LazyがいやならSMLやOCAML使えばいいだけ。何が不足よ?
724デフォルトの名無しさん:2008/09/13(土) 08:23:12
>>723
前方参照,where構文
725デフォルトの名無しさん:2008/09/13(土) 09:32:44
>>724
LETで何が不足よ?
726デフォルトの名無しさん:2008/09/13(土) 10:42:16
>>717,>>719からのコンテキストを読んでくれよ。
727デフォルトの名無しさん:2008/09/15(月) 18:14:08
質問です

たとえばJavaなどではクラスのインスタンスをオブジェクトと呼びますが、
Haskellの代数的データ型に格納されたデータのことをなんと呼べば良いですか?
728デフォルトの名無しさん:2008/09/15(月) 18:21:45
>>727
関数
729デフォルトの名無しさん:2008/09/15(月) 19:00:09
>>727
「オブジェクト」に対応する用語は普通は「値」でいいんじゃないか

>Haskellの代数的データ型に格納されたデータ
これどういう意味?
型が代数的データ型であるような値のことならそのまま「代数的データ型の値」
代数的データ型の構築子に渡した値のことなら「フィールドの値」くらいか?

data Point = Pt Int Int

x = Pt 0 3
-- xはPoint型の値
-- xのフィールドの値は0と3
730デフォルトの名無しさん:2008/09/15(月) 20:26:27
Haskellのプログラミングスタイルのことはなんて呼べばいいですか?
ストリーム指向?
731デフォルトの名無しさん:2008/09/15(月) 20:30:20
関数指向
732デフォルトの名無しさん:2008/09/16(火) 23:55:40
Haskell系のShellでオススメってある?
73336 ◆K0BqlCB3.k :2008/09/17(水) 00:00:30
>>732
シェルって何のこと?
言語とは関係ないと思うけど。
シェルスクリプトのことを言っているの?
734デフォルトの名無しさん:2008/09/17(水) 00:07:44
>>733
HSHみたいなやつ

探してみた奴だとどれも開発止まってて…
735デフォルトの名無しさん:2008/09/17(水) 00:09:07
Haskell風構文のシェルっていくつかあるんだな、ググって初めて知ったわ
736デフォルトの名無しさん:2008/09/17(水) 00:15:11
Haskell系の自然言語でオススメってある?
737デフォルトの名無しさん:2008/09/17(水) 00:22:13
lojbanとか?
自然言語じゃないけど
738デフォルトの名無しさん:2008/09/17(水) 15:52:29
Yiとか使ってる人いるの?
739デフォルトの名無しさん:2008/09/17(水) 17:56:30
Yi って 彝 ?
740デフォルトの名無しさん:2008/09/17(水) 18:20:56
ぅぃ?
741デフォルトの名無しさん:2008/09/17(水) 18:31:27
http://haskell.org/haskellwiki/Yi
使ったこと無いなぁ。
742デフォルトの名無しさん:2008/09/19(金) 17:29:49
ひょんなことからerlangを勉強し始めたが、構文はともかく、思想としては面白いな。
並行指向プログラミングというのかな?
このパラダイムはオブジェクト指向よりも現実志向のパラダイムのように思う。
Haskellでも並列化がうまくいけばerlangみたいな仕組みを実装できるかもしれない。

# erlangの構文は糞 糞 糞 糞杉
743デフォルトの名無しさん:2008/09/19(金) 18:18:31
ぅぃゅ
744デフォルトの名無しさん:2008/09/19(金) 20:28:25
コンカレントハスケル?
745デフォルトの名無しさん:2008/09/19(金) 20:34:40
ああ、コンカレントは並行だったか・・・
746デフォルトの名無しさん:2008/09/20(土) 11:00:42
>>743
私はProlog屋なので、erlangの構文のクソ部分に敏感でない。
お手数かけて恐縮だが、糞の部分を列挙していただけると有難いのだが。
747a36 ◆K0BqlCB3.k :2008/09/20(土) 12:04:07
>>742
たぶん、その思想というのはpi-calculusのことかな。
748デフォルトの名無しさん:2008/09/20(土) 13:08:03
ここのみんなからするとgtk2hsって綺麗なの?
749デフォルトの名無しさん:2008/09/20(土) 13:29:19
Erlangってpi-calculusベースなのか
750デフォルトの名無しさん:2008/09/20(土) 13:56:48
>>746
743ではないけど、
receive...endとか、カリー化できないとかではないですか?
751デフォルトの名無しさん:2008/09/20(土) 14:52:33
>>723
元記事ではSTMが挙げられてるけど、OCamlだと無くね?

>>749
綺麗って何が?Gtk2Hsを使ったコード?
それならあまり綺麗じゃないんじゃない。
GUIを綺麗に書くためのハイレベルなライブラリは
いろいろあるけど、どれも決定打にはなってないような。
752デフォルトの名無しさん:2008/09/20(土) 15:23:34
>>751 >>749 じゃなくて >>748 ?
753デフォルトの名無しさん:2008/09/20(土) 15:27:39
>>752
>>748な俺からでもそれはわかる。
754デフォルトの名無しさん:2008/09/21(日) 00:46:57
gtk2hsと言えば、
gtk_rc_parse_string相当の関数や、
gtk_widget_modify_cursor(これは新しいからか)相当の関数が見付からなくて諦めたことがあります。。
いや私の検索能力が低いだけだと思うんですが、かなり頑張ってもどうしても見つかりませんでした。。。
皆さんgtkやpango、gdkの関数を捜すときってやっぱり根性ですか?
大抵はキャメルケースにすれば大丈夫ですがそうでない時はかなり困りますよねー。。
755デフォルトの名無しさん:2008/09/21(日) 12:17:25
いや、検索能力の問題じゃなくて、実際に無いんじゃない?
Gtk2Hsのソースgrepしてみて無かったら無いような。
756デフォルトの名無しさん:2008/09/22(月) 08:20:06
webで読んでるけどreal world haskell凄いヴォリュームだな
一週間やってもまだ終わらん
製本版はもう鈍器レベルだな
757デフォルトの名無しさん:2008/09/22(月) 09:55:41
なにか面白いこと書いてあった?
758a36 ◆K0BqlCB3.k :2008/09/22(月) 15:02:13
759デフォルトの名無しさん:2008/09/22(月) 16:29:27
url知らないって意味じゃなくて、自分では読む気が無いってことだよ。
760a36 ◆K0BqlCB3.k :2008/09/22(月) 16:37:06
ぱっと見た感じでは、名前の通り実際にHaskellで開発する時に「背中に手が届く」本になってる感じ。
たとえばデータベースと通信する方法とか、
GUIを作るときのライブラリとかツールとかの紹介とか、
どちらかというと「Haskell逆引きクイックリファレンス」
みたいな感じだね。
目新しいことは何もないけど、逆引きリファレンスとしてはいろんなライブラリとか紹介されていて便利かな。
761a36 ◆K0BqlCB3.k :2008/09/22(月) 16:39:11
いろいろサンプルコードも載ってるからわかりやすい。
文章の良よりコードの両方の方が多いから英語が苦手な人でもわかると思う。
762a36 ◆K0BqlCB3.k :2008/09/22(月) 16:39:49
良 → 量
コードの両方 → コードの量
763デフォルトの名無しさん:2008/09/24(水) 11:57:39
Parsec.Tokenをロードすると
ERROR file:{Hugs}\packages\parsec\Text\ParserCombinators\Parsec\Token.hs:64 - Syntax error in data type declaration (unexpected `.')
とでて読み込めないのですがどうしたらいいのでしょうか
764デフォルトの名無しさん:2008/09/24(水) 12:09:05
>>763
Hugsを標準モードじゃなくて拡張モードで起動すればいい
hugs -98
765デフォルトの名無しさん:2008/09/24(水) 12:51:18
>>764
無事読み込めました。ありがとうございます
766デフォルトの名無しさん:2008/09/24(水) 15:23:46
do構文で、変数の使用が強制されるのはなんとかならんの?
.とか$とかの気の利いたバージョンない?
767デフォルトの名無しさん:2008/09/24(水) 15:27:56
何を言ってるのかよく分からんが >>= とか?
768デフォルトの名無しさん:2008/09/24(水) 15:36:59
>>=だけですっきりいけるならdo構文使わないでしょ(ってこともないか?少なくとも俺は)。
do構文でモナドを「外す」ためだけに一時変数がやたら必要になるのがイヤって話。
つまるところ>>=になっちまいそうな気もするけど、
便利な演算子なり特殊なカッコなりで、無駄な変数使わずに何とかならんかなぁ、と。
769デフォルトの名無しさん:2008/09/24(水) 16:11:24
なにか具体例見せてくれ
770デフォルトの名無しさん:2008/09/24(水) 16:18:02
do式の中で、
  a <- v
  b <- f a
は、aを使わずに
  b <- v >>= f
と書ける

同様に、
  a <- v
  let b = f a
は、
  b <- liftM f v
と書ける

こういう話?
>>=は普通にdo構文の内部で使えるよ
俺はこの場合=<<を使う方が好きだけど
771デフォルトの名無しさん:2008/09/24(水) 16:26:30
何を言ってるのか俺もよく分からん。
do ...; a <- m; f a; ...

do ...; f =<< m; ... -- m >>= f でも同じだけど...
とか
do ...; a <- m; let b = f a; ...; g b; ...; h b; ...

do ...; b <- liftM f m; ...; g b; ...; h b; ...
とかすればいいって話じゃなくて?

って書き込もうとしたんだけどその前に新着レス見たら>>770被りすぎ。
772デフォルトの名無しさん:2008/09/24(水) 16:44:57
n <- m
a <- n

a <- join m
にするパターンもあるかも。

n <- m
o <- n
a <- o

a <- join (join m)
とか。
773デフォルトの名無しさん:2008/09/24(水) 16:48:50
ぱっといい例は書けないけど、例えば単純な例で
do args <- getArgs
cnt <- getContents
now <- getClockTime
return someFunc args cnt now
を、
do return soumeFunc #getArgs #getContents #getClockTime
とかこんな感じに書けないかと。(#が架空のモナド外し演算子とか)
774デフォルトの名無しさん:2008/09/24(水) 16:53:15
>>770,771,772
ありがとう。特にjoinは使った事なかった。
俺がアホでした。
775デフォルトの名無しさん:2008/09/24(水) 16:56:54
あれ?やっぱ違うや。求めてるのとjoin。いや、それはそれで勉強になったけど。
776デフォルトの名無しさん:2008/09/24(水) 17:01:37
というか、liftM3ですね。とりあえず釣って来ます。
777デフォルトの名無しさん:2008/09/24(水) 17:21:21
ちなみに、
do args <- getArgs
   cnt <- getContents
   return otherFunc args True cnt
だったら?
778デフォルトの名無しさん:2008/09/24(水) 17:27:31
>>773みたいな構文は俺も欲しい
このスレで前に同じことを書いた記憶がある
Template Haskellを使えばなんとかなるかな

>>777
liftM3 otherFunc getArgs (return True) getContents
不恰好だけど
779デフォルトの名無しさん:2008/09/24(水) 18:03:09
>>773 は Control.Applicative を使って
soumeFunc <$> getArgs <*> getContents <*> getClockTime

return sumFunc <*> getArgs <*> getContents <*> getClockTime
って書ける。infixl 4 # ; (#)=(<*>) とすればあのままいける。
っていうのは
(return soumeFunc) #getArgs #getContents #getClockTime
じゃなくて
return (soumeFunc #getArgs #getContents #getClockTime)
のつもりだろうから嘘だけど。

ただ、IO は Applicative のインスタンスになってるけど、
一般のモナドは WrappedMonad って型が用意されてるだけなので、ちょっと面倒。
でも Control.Monad に <*> と同じ意味の ap ってのがあってこれはどのモナドにも使える。
<$> とかの Control.Applicative にあるいろいろな関数がないけど。

あと Control.Applicative には f (a -> b) -> a -> f b な関数が無いけど
それを f *$ x = f <*> pure x とか定義すれば
liftM3 otherFunc getArgs (return True) getContents は
otherFunc <$> getArgs *$ True <*> getContents と書ける。さすがにキモイ。
780デフォルトの名無しさん:2008/09/24(水) 18:18:11
おおっ、あるのね。
俺の見る程度の範囲じゃ<*>とかはあんま見ないけど、そういえばapは見るな。
まあ、>>698とか見ると、>>778の書き方が普通は落とし所って所かも知れんけど、調べてみます。
781デフォルトの名無しさん:2008/09/24(水) 23:29:43
windows環境でunix 2.3.0.0のインストールに成功した方っていらっしゃいますか?
私の環境では以下のエラーを吐いてbuildに失敗します。

compiling dist\build\System\Posix\DynamicLinker\Module_hsc_make.c failed
command was: C:\ghc\ghc-6.8.3\bin\ghc.exe -c -package base-3.0.2.0 -package directory-1.0.0.1 -Iinclude dist\b
uild\System\Posix\DynamicLinker\Module_hsc_make.c -o dist\build\System\Posix\DynamicLinker\Module_hsc_make.o

どなたか知恵をお貸しください

--unix.cabal
>The package is not supported under Windows (except under Cygwin).
Windowsは基本的に非サポート、
Cygwin環境下はOKという意味だと思ったんですが違いますか?
782デフォルトの名無しさん:2008/09/24(水) 23:58:13
長くて貼れなかった部分(すみません)のログを見てみると
cygwinのフォルダにあるheaderファイルの発見に失敗しているようでした。

終電の時間が近いので、検索パスの追加をした所で今日は帰ります
783デフォルトの名無しさん:2008/09/25(木) 00:01:22
仕事でハスケル使ってんの?
784デフォルトの名無しさん:2008/09/25(木) 01:25:45
言語設計学者の悲願の言語だけど、開発環境はまだ全然整備されていないから、ほぼ0
785デフォルトの名無しさん:2008/09/25(木) 03:02:05
学生だろ?
786デフォルトの名無しさん:2008/09/25(木) 03:18:09
学生のうちから終電まで勉強してんのかよ。
そんなんじゃ社会に出てからもたんぞ。
787デフォルトの名無しさん:2008/09/25(木) 03:51:42
Schemeのcondみたいのはどう書くのがよいでしょうか?
case でマッチング無しガードのみにすればとりあえず出来るけど、dummyや_が冗長。
case dummy of
   _ | conditionA -> bar
     | conditionB -> foo
   otherwise -> baz
788デフォルトの名無しさん:2008/09/25(木) 04:41:08
そこだけ別函数にしちゃえば良いんじゃ?
789デフォルトの名無しさん:2008/09/25(木) 12:37:19
>>786
何という優しさ。
790デフォルトの名無しさん:2008/09/25(木) 19:56:07
こういうsyntax sugarが欲しいなあ。

data X = A | B | C | D

case x of
A | B -> 1
C | D -> 2
791デフォルトの名無しさん:2008/09/25(木) 19:58:51
確かに欲しい
でも縦線だとガードに見えるから別の記号が要るな
792781:2008/09/25(木) 20:53:49
だめでした。
定義されていない型、定義されていない関数のエラーは
HsUnix.hに手を加えてなんとかしましたが(includeするファイルを追記)

↓結果
dist/build/System/Posix/DynamicLinker/Module_hsc_make.o(.text+0x49):Module_hsc_make.c: undefined reference to
`_impure_ptr'
dist/build/System/Posix/DynamicLinker/Module_hsc_make.o(.text+0x8d):Module_hsc_make.c: undefined reference to
`_impure_ptr'
dist/build/System/Posix/DynamicLinker/Module_hsc_make.o(.text+0xb5):Module_hsc_make.c: undefined reference to
`_impure_ptr'
dist/build/System/Posix/DynamicLinker/Module_hsc_make.o(.text+0xe9):Module_hsc_make.c: undefined reference to
`_impure_ptr'
collect2: ld returned 1 exit status
linking dist\build\System\Posix\DynamicLinker\Module_hsc_make.o failed

それはともかく、今夜はwww.haskell.orgに繋がりにくいですね
793デフォルトの名無しさん:2008/09/26(金) 13:22:23
>>790
そういう、かゆいところに手が届くのは、やっぱりLISP系最強なんだろうか。
794デフォルトの名無しさん:2008/10/01(水) 23:03:38
流行に乗ってHaskellを勉強しているのですが、バイナリファイルの扱い方に困ってます。

int numFloat;
int numInt;
float floats[numFloat];
int ints[numInt];

C的な擬似コードで書くとこんな感じのバイナリファイルに対して、
floatsとintsのデータを取ってきて文字列でフォーマット化して表示してみよう、と思っています。

hFile <- openFile filepath ReadMode
cs <- hGetContents hFile

ひとまずこれで[Char]を持ってきて、そこからnumFloatとnumIntを切り出せばよいか、
と思ってるのですが、じゃあそれってどうするんだろう、ってところで詰まってます。

(numFloat,numInt,残り) = hogeFunction cs

みたいな感じで切り出すのが関数型的な感じなのかな、と思っているのですが、
そもそもこの辺の考え方からして駄目っぽいですか?
795初心者修業中:2008/10/01(水) 23:29:57
>>794
バイナリモードじゃないとダメなんじゃないでしょうか?
こんなのがありました

ttp://ha6.seikyou.ne.jp/home/yamanose/haskell/wave2.html
796デフォルトの名無しさん:2008/10/01(水) 23:38:17
>>795
ありがとうございます。
BinaryModeって付けないと駄目なのと、
あとPtrを経由してデータを取ってくるんですね。

これで勝つる!
797デフォルトの名無しさん:2008/10/02(木) 00:03:06
べつにPtrを経由しなくても>>794の方針でいけるよ
効率を気にするなら別だけど
798デフォルトの名無しさん:2008/10/02(木) 00:27:22
Ptrを経由しないとバイナリ表現のFloatから
HaskellのFloatを得る手段が難しいよ。
http://thread.gmane.org/gmane.comp.lang.haskell.cafe/44845/focus=44927
799初心者修業中:2008/10/02(木) 00:56:54
>>797
テキストモードの場合、、
control-ZをEOFと認識したり、CRLFを LFに変換すると
GHCのマニュアルにありますが、
問題ないのでしょうか?
800デフォルトの名無しさん:2008/10/02(木) 01:06:55
>>799
問題ある
>>797は、バイナリモードで開いた上でgetContentsすればいい、という意味で言った

>>798
確かにそうだな
ちゃんとテストしてないけど一応こんなんでいけるみたいだ

import Data.Bits
import Data.Word

w32ToFloat :: Word32 -> Float
w32ToFloat w
  | ep == 255 && sf /= 0 = 0 / 0
  | sf == 255 = sign / 0
  | sf == 0 && ep == 0 = sign * 0
  | otherwise = sign * encodeFloat r e
  where
    sn = shiftR w 31
    ep = shiftR w 23 .&. 0xff
    sf = w .&. 0x7fffff

    sign = if sn == 1 then -1 else 1
    e = fromIntegral ep - 127 - 23
    r = fromIntegral sf + 0x800000
801デフォルトの名無しさん:2008/10/02(木) 01:37:29
バイト列をFloatとして解釈させたいわけだから、
必要なのは Word32 -> Float じゃなくて [Word8] -> Float なんじゃなかろうか。
というわけでPtr経由だけど書いてみた。

import Foreign

fromBytes :: Storable a => [Word8] -> a
fromBytes bs = unsafePerformIO $ allocaArray (length bs) $ \ p -> pokeArray p bs >> peek (castPtr p)

toBytes :: Storable a => a -> [Word8]
toBytes x = unsafePerformIO $ alloca $ \ p -> poke p x >> peekArray (sizeOf x) (castPtr p)

toBytes (0.5 :: Float) => [0,0,0,63]
fromBytes [0,0,0,63] :: Float => 0.5
802デフォルトの名無しさん:2008/10/02(木) 09:32:32
で、整数のendianはどうするとか色々とケチがついていくにしたがって、重くて遅いコードに変身していくわけだ。
803デフォルトの名無しさん:2008/10/02(木) 10:50:10
endian変更は[Word8]にreverseかければ良いんじゃね。

システムのendian判定はこんな感じ?
isLittleEndian = (1 :: Int) == fromBytes [1,0,0,0]
isBigEndian = (1 :: Int) == fromBytes [0,0,0,1]
804デフォルトの名無しさん:2008/10/02(木) 13:03:52
やっぱり>>800にはバグがあった
-  | sf == 255 = sign / 0
+  | ep == 255 = sign / 0

>>802
[Word8]からWord32を作って、そこからFloatにすればシステムのendiannessを気にする必要ないよ
この場合PtrやUArrayを経由するのでもencodeFloatでも良い
805デフォルトの名無しさん:2008/10/02(木) 17:35:05
-- テストしてみた。

-- import Test.QuickCheck

(f `eq` g) x = Result (Just (f x == g x)) [] [show (f x), show (g x)]

forAllBinaryFloat :: (Testable b) => ([Word8] -> b) -> Property
forAllBinaryFloat t =
 forAll (choose (0,1)) $ \s ->
 forAll (oneof [elements [0,255], choose (1,254)]) $ \e ->
 forAll (oneof [elements [0], choose (1,2^23-1)]) $ \f ->
 t (sefToBytes s e f)

sefToBytes :: Int -> Int -> Int -> [Word8]
sefToBytes s e f = endian [shiftL s' 7 .|. shiftR e' 1, shiftL e' 7 .|. f1, f2, f3]
 where
 [_,f1,f2,f3] = endian (toBytes f)
 [s',e'] = map fromIntegral [s,e]
 endian = if head (toBytes (1 :: Word32)) == 1 then reverse else id

prop_float :: (Float -> Float) -> Property
prop_float fl2fl = forAll (oneof fls) (id `eq` fl2fl)
 where fls = [elements [0,{-0/0,-}1/0,-1/0], fmap (/ 2^127) arbitrary, arbitrary]

prop_bytes :: ([Word8] -> [Word8]) -> Property
prop_bytes bs2bs = forAllBinaryFloat (id `eq` bs2bs)
806デフォルトの名無しさん:2008/10/02(木) 17:36:01
-- quickCheck test1 や verboseCheck test5 とかで実行。

test1 = prop_float (fromBytes . toBytes)
test2 = prop_float (w32ToFloat . fromBytes . toBytes)
test3 = prop_float (uncurry encodeFloat . decodeFloat)
test4 = prop_bytes (\bs -> toBytes (fromBytes bs :: Float))
test5 = prop_bytes (toBytes . w32ToFloat . fromBytes)
test6 = forAllBinaryFloat $ \bs -> not (isNaN (fromBytes bs :: Float)) ==>
 (fromBytes `eq` (w32ToFloat . fromBytes)) bs

{- 1, 3 は通った。最初 NaN/=NaN をうっかりした。
w32ToFloat は非正規化数を無視してるので、2, 5, 6 が通らなかった。
4 は NaN のときに、仮数部の最上位ビットがおかしくなった。
5 は w32ToFloat は NaN を全て 0/0 にするのもあって通らなかった。
NaN の表現が変わるのは Float を解釈する場面
(つまりコピーとかじゃない)なら問題無いだろうけど。-}
807デフォルトの名無しさん:2008/10/02(木) 21:41:10
QuickCheckすげー
盲目的なランダムテストだけじゃないのな

概念的には、(ieee754で表現される)外部フォーマットのデータを読んで、
ネイティブのFloatに変換して使いたいのか、
それともieee754データとしてそのまま扱いたいのかでやることが変わってくるな
実際にはどうせieee754を採用してるアーキテクチャでしか動かさないから、ショートカットが効くわけだけど
808デフォルトの名無しさん:2008/10/03(金) 01:51:57
QuickCheckってどうも使い方が解らない。
テストが元実装と結局ほとんど同じにならない?
元実装は仕様をすでに表してるわけで、その仕様にあってるか確認するコードは、
結局同じになるのは必然だと思うんだけど。
仕様から演繹出来る他の事を確認しろって事かな?
でも、演繹で導かれる事が、元仕様とは別の理由で成り立つ事もあるよね?
809デフォルトの名無しさん:2008/10/03(金) 03:06:21
>テストが元実装と結局ほとんど同じにならない?
ならない。>>805-806を見れば分かる通り

>元実装は仕様をすでに表してるわけで、その仕様にあってるか確認するコードは、
>結局同じになるのは必然だと思うんだけど。
そういう場合もあるし、そうでない場合もあるから、決して必然じゃない
たとえば、ソート関数が正しいかどうか確認するコードと、
実際にマージソートやクイックソートをするコードは全然違うものになる
さらに「マージソートでもクイックソートでも結果が同じになる」みたいなのもテストになるし

>でも、演繹で導かれる事が、元仕様とは別の理由で成り立つ事もあるよね?
もちろん
だれもテストで全ての誤りを発見できるとは思ってない
810デフォルトの名無しさん:2008/10/03(金) 14:26:34
あと、ランダムテストが有効な場合とそうでない場合があるよね。
>>805-806はあまりランダムである必要が無いかも。
きわどいケース(上の場合だと0、非正規化数、無限大、NaN)を
並べ上げにくい場合にランダムテストが有効な気がする。
811デフォルトの名無しさん:2008/10/03(金) 14:35:10
ああそうか、例えばソートの例の場合、
「正しくマージソート出来てるか」じゃなくて
「正しくソート出来てるか」のテストになるからか。

前者はQuickCheckに関わらず外部テストでは確かめようがないから、
「ソートする」じゃなくて「マージソートする」という仕様はソースレビューするしかないのか。
812デフォルトの名無しさん:2008/10/03(金) 16:36:28
単なる関数じゃあまり意味がなくて、
結果としてのアウトプットが特徴的で綺麗な性質を持ち、
かつ、その性質自体が目的である場合に威力を発揮するって感じか。
その類の物は、性能が競われる事が多い気がするから、その辺りのサポートもあると良いかも。
813デフォルトの名無しさん:2008/10/03(金) 18:38:09
2chって連続した半角スペースが に置換されるようになったの?

f :: A -> B のテストは
・B (or A) の == を使う場合
  ・一般の場合
    ・h :: A -> B を用意して f x == h x をテスト
  ・逆関数 g :: B -> A がある場合
    ・x == g (f x) をテスト
    ・y == f (g y) をテスト
・使わない場合
  ・r :: A -> B -> Bool をうまく用意して r x (f x) をテスト
(テストはランダムな x :: A, y :: B に対して)
大概こんな感じ。

元実装とほとんど同じテストってのは、
g やうまい r が無くて、f x == h x というテストしか無いんだけど、
f と違う h も無くて、でも f x == f x じゃバカ丸出しなので、
== を明示的には使わないで実質的に f x == f x と同じことをやる、
みたいな感じじゃないかな。
814デフォルトの名無しさん:2008/10/03(金) 18:39:53
うわ俺バカ丸出し。&nbsp;って書きたかった。
815デフォルトの名無しさん:2008/10/03(金) 19:31:09
datを直接見るようにすればnbspなんて使わなくてもインデントされるよ
816デフォルトの名無しさん:2008/10/08(水) 12:19:55
滅茶苦茶な事を聞いていそうで済みませんが、
cabal configure と runhaskell Setup.hs configure、
cabal build と runhaskell Setup.hs build、
cabal install と runhaskell Setup.hs install、
って何か違うんでしょうか。
同じだとしたらなんのために両方あるんでしょうか。
817初心者修業中:2008/10/08(水) 15:33:21
>>816
・runhaskell はHaskellのソースプログラムを実行するコマンド
・cabal はパッケージをインストールするコマンド
…と認識しています。

参考

ttp://haskell.g.hatena.ne.jp/illillli/20080224
818デフォルトの名無しさん:2008/10/08(水) 23:08:47
オラ本でねーぞコラ
819デフォルトの名無しさん:2008/10/09(木) 00:31:08
cabal なんてコマンドあるの?
あるとしたら runghc Setup と打つより楽だからじゃ?
820初心者修業中:2008/10/09(木) 01:00:41
>>819
参考

ttp://haskell.g.hatena.ne.jp/illillli/20080224
cabal-installというパッケージにcabalというユーティリティがあった。
パッケージのダウンロードからインストールまでを自動化してくれるようだ。
821デフォルトの名無しさん:2008/10/09(木) 04:00:42
今んとこ、RubyGemsを目指して整備中って事で、
最終的にSetup.hsはなくなるかオプショナルになってcabalコマンドに統一されるんじゃない?
http://page.freett.com/shelarcy/log/2007/diary_03.html#when_we_can_use_caball-install
http://hackage.haskell.org/trac/hackage/wiki/RubyGems

現時点でのそれら重複してるコマンドの詳細は判らないけど、installについては、
cabal install monadius
monadius
で遊べるってのは、Setup.hsでは無理だろう。
822デフォルトの名無しさん:2008/10/09(木) 04:20:27
>>821
RubyGemsなんて目指されると非常に困る。
823デフォルトの名無しさん:2008/10/09(木) 12:13:24
ん?どんな風に?
824デフォルトの名無しさん:2008/10/09(木) 18:45:20
質問です。
Haskellにて、二次元配列を時計回りに90度回転させるには、どうすればいいでしょうか?

今あるコードが
rot90 list = reverse (map (head) list) : rest
where rest = if length (concat taillist) == 0 then []
else rot90 taillist
where taillist = map tail list
ですが、ものすごく非効率的だと思います。
825デフォルトの名無しさん:2008/10/09(木) 19:03:11
>>824
length (concat taillist) == 0
の部分を
all null taillist
にでもすれば別に非効率的でもない気がする

俺ならtransposeを使うな
rot90 = transpose . reverse
826デフォルトの名無しさん:2008/10/09(木) 19:24:00
>>825
素早い回答ありがとうございます。
実は、transposeも定義しないといけなく、transposeでrot90を使っているので…。

transpose list = rot90 (hflip list)
hflip list = reverse list

というふうになっております。
827デフォルトの名無しさん:2008/10/09(木) 19:39:20
どうしてもrot90でtransposeを定義しなきゃいけないの?
そうでなくて単にtransposeが必要ってだけならその定義は捨てて
import Data.Listしてtransposeを使えば良いんじゃない?
828デフォルトの名無しさん:2008/10/09(木) 19:45:38
transposeって標準の関数ではないんですか?
829デフォルトの名無しさん:2008/10/09(木) 19:53:59
>>827

課題では、自分でtransposeを定義しろ、とのことでした。
830デフォルトの名無しさん:2008/10/09(木) 20:20:13
>>828
Prelude関数ではないのでData.Listをインポートしないと使えない。

>>829
だったら >>825 が最初に言ってる変更をするか、rot90を使わずにtransposeを定義すれば。
831デフォルトの名無しさん:2008/10/09(木) 21:12:45
Data.Listのtransposeはこれ
transpose :: [[a]] -> [[a]]
transpose [] = []
transpose ([] : xss) = transpose xss
transpose ((x:xs) : xss) = (x : [h | (h:t) <- xss]) : transpose (xs : [ t | (h:t) <- xss])
832デフォルトの名無しさん:2008/10/10(金) 06:57:02
>>813
連続した半角スペースはjavascriptモードで書き込むときに置換されるらしい。

>>824-825
長方形じゃないときに、all だとエラー、any だと長方形になるように切り落とす。
filter 使えば>>831の transpose に map reverse . したような感じになる。
([<h or t> | h:t<-xss] = map <head or tail> (filter (not.null) xss))

違ったやり方なら
rot90 = foldl c []
 where
  c yss [] = yss
  c [] xs = [[x] | x<-xs]
  c (ys:yss) (x:xs) = (x:ys) : c yss xs
とか。
833デフォルトの名無しさん:2008/10/10(金) 07:01:54
あ、any じゃ list == [] のときまずいという話もあるか。
834デフォルトの名無しさん:2008/10/11(土) 00:49:41
>>823
パッケージの管理方法にいろいろと問題がある。
835デフォルトの名無しさん:2008/10/11(土) 01:26:24
>>834
具体的に言ってくれよ。そして開発者達にも。
836デフォルトの名無しさん:2008/10/27(月) 20:53:56
質問です。ディレクトリの階層構造をData.Tree型に納めようとしてい
るのですが、遅延評価が効くようなコードが書けません。
type FileTree = Tree FilePathとして、以下のような関数を作ってみたのですが。
recursiveFileTree :: FilePath -> IO FileTree
recursiveFileTree name = do
 contents <- catch (getDirectoryContents name) (\e -> return [])
 children <- let
  filtered = filter filterDots contents
  pathadd = map (\x -> name </> x) filtered
  mapped = map recursiveFileTree pathadd
  in sequence mapped
 return (Node (takeFileName name) children)
  where filterDots :: FilePath -> Bool
   filterDots "." = False
   filterDots ".." =
   filterDots _ = True
(インデントしてるように見せるために全角スペースを入れています。見えますか?)
おそらくsequenceで[IO FileTree] -> IO [FileTree]としているあたりが問題なのだと思いますが、解決策が分かりません。
837デフォルトの名無しさん:2008/10/27(月) 22:14:59
・unsafeInterleaveIOを使う
・Data.Treeを使うのをやめて、明示的なIOを伴う木を定義して使う

好きな方を選んでくれ
838デフォルトの名無しさん:2008/10/27(月) 22:22:13
一応言っておくが、HaskellのIOは基本的に遅延しないし、普通はそれで正しい
IOは実行順が重要なことが多く、遅延させて順番をうやむやにすると厄介なことになりやすい
それだとどうしても不便というときのためにunsafeInterleaveIOがある
839デフォルトの名無しさん:2008/10/30(木) 10:12:08
f a b c の部分適用として f a b と書くことはできますが、(\a -> f a b c) にあたる部分適用を a を省略して書く方法はありますか?
840デフォルトの名無しさん:2008/10/30(木) 11:26:17
flip使え
841デフォルトの名無しさん:2008/10/30(木) 17:56:42
flip (flip f b) cはさすがに悪趣味だろ
842デフォルトの名無しさん:2008/10/30(木) 18:02:48
(\a -> f a b c) → 15文字
flip (flip f b) c → 17文字
843デフォルトの名無しさん:2008/10/30(木) 19:39:38
($c).($b).f flip (`f`b) c
844デフォルトの名無しさん:2008/10/30(木) 19:45:59
こんなのもありました。

(flip.(flip f)) b c

3引数flip
http://haskell.g.hatena.ne.jp/mr_konn/20061223/1166869265
845デフォルトの名無しさん:2008/10/30(木) 19:54:21
>>844>>841 の変形だね。
あと、内側の括弧は無くてもOK
846デフォルトの名無しさん:2008/10/30(木) 21:45:30
f # b c みたいな構文(# は未適用引数を表す)があったら便利だったかもね
847デフォルトの名無しさん:2008/10/30(木) 23:03:15
SRFI 26 みたいな?
848デフォルトの名無しさん:2008/10/30(木) 23:47:19
\x->f x b c
849デフォルトの名無しさん:2008/10/31(金) 08:29:54
850デフォルトの名無しさん:2008/10/31(金) 11:19:22
>>846
それだと
f # b c -- \a -> f a b cと同等

(f #) b c -- (\a -> f a) b cと同等
を区別する必要が出てきて面倒だな
851デフォルトの名無しさん:2008/11/02(日) 13:03:16
http://d.hatena.ne.jp/m-hiyama/20081031/1225416719
ブログ持ってないのでここで。酒井さんのパクリ。

{-# OPTIONS -fglasgow-exts #-}

import Control.Monad (liftM2)
import Data.Either
import Test.QuickCheck


infix 4 :<->:
type a :<->: b = (a -> b, b -> a)

(.>) :: a:<->:b -> b:<->:c -> a:<->:c
(f1,g1) .> (f2,g2) = (f2 . f1, g1 . g2)

un :: a:<->:b -> b:<->:a
un (f,g) = (g,f)


type a :+: b = Either a b
infixr 5 :+:

alt :: a:+:b :<->: b:+:a
alt = (f,f) where f = either Right Left

swap :: a:+:b:+:c :<->: b:+:a:+:c
swap = (f,f) where f = either (Right . Left) (either Left (Right . Right))

rt :: b :<->: c -> a:+:b :<->: a:+:c
rt (f,g) = (r f, r g) where r = either Left . (Right .)
852デフォルトの名無しさん:2008/11/02(日) 13:04:16
data T = L | N T T deriving (Eq, Show)

fold :: a:+:(T,(T,a)) :<->: (T,a)
fold = (f,g)
 where
 f (Left a)            = (L,a)
 f (Right (t1,(t2,a))) = (N t1 t2,a)
 g (L,a)       = Left a
 g (N t1 t2,a) = Right (t1,(t2,a))

h :: (T,a) :<->: a:+:(T,a):+:(T,(T,(T,a)))
h = un fold .> rt (un fold)

s :: a:+:(T,(T,(T,a))) :<->: (T,a):+:(T,(T,(T,(T,a))))
s = rt (un fold .> alt) .> swap .> rt fold .> alt
853デフォルトの名無しさん:2008/11/02(日) 13:05:44
st :: (T,a) :<->: (T,(T,(T,(T,(T,(T,(T,a)))))))
st =
 -- T
 h
 -- 1 + T + T^3
 .> swap
 -- T + 1 + T^3
 .> rt (s .> s .> s .> s
 -- T + T^4 + T^7
       .> alt)
 -- T + T^7 + T^4
 .> swap
 -- T^7 + T + T^4
 .> rt (s .> s .> s .> s .> s)
 -- T^7 + T^6 + T^9
 .> swap
 -- T^6 + T^7 + T^9
 .> un h
 -- T^7
854デフォルトの名無しさん:2008/11/02(日) 13:08:02
instance Arbitrary T where
 arbitrary = oneof [return L, liftM2 N arbitrary arbitrary]

main :: IO ()
main = do
quickCheck $ \x -> x == (snd st (fst st x) :: (T,()))
quickCheck $ \x -> x == fst st (snd st x :: (T,()))


型検査で漏れてるのは fold の定義ぐらいで、QuickCheck 意味ないのかも。
855デフォルトの名無しさん:2008/11/03(月) 11:50:00
すげえ、読みやすいな
856デフォルトの名無しさん:2008/11/05(水) 07:40:02
GHC 6.10.1リリースあげ
857デフォルトの名無しさん:2008/11/05(水) 08:34:43
((f.) . g) a b
みたいなテクニックが沢山載ってるようなページを教えてください
858デフォルトの名無しさん:2008/11/05(水) 12:06:08
unsafeInterleaveIO :: IO a -> IO a
unsafeInterleaveIO (IO m)
= IO ( \ s -> let
r = case m s of (# _, res #) -> res
in
(# s, r #))

この#って何なんですか?ghc6.8.2ではエラーになりますし…
859デフォルトの名無しさん:2008/11/05(水) 12:38:02
>>858
unboxed tupleってやつだね。
http://itpro.nikkeibp.co.jp/article/COLUMN/20070206/260872/?ST=develop&P=2

>>856
Windows版を入れてみたんだけど、ライブラリの置き場所がキモイな。
6.8だと$topdir/lib以下に入ってたのが6.10.1だと$topdirに入ってる。
キモイし$topdirの見通しも悪いので6.8と同じように$topdir/libの中に移動して
package.confの中の$topdir\\を$topdir/lib\\に全置換した。
860デフォルトの名無しさん:2008/11/05(水) 14:29:51
>>859
ありがとうございました
拡張構文なんですね
861デフォルトの名無しさん:2008/11/06(木) 23:45:00
weakリダクションって何?
862デフォルトの名無しさん:2008/11/08(土) 00:10:49
googleで検索したらひっかかったので、ここに書かせていただきます。質問していいでしょうか?

Haskellの処理系だけを使って、prologみたいなことができないか調べています。
↓でprologのタプル parent(tom, bob). のような感じにすると、

parent::[Char]->[Char]->Bool
parent "tom" "bob" = True
parent "liz" "bob" = True
parent "mike" "liz" = True
parent _ _ = False

とりあえず、
main = print $ parent "tom" "bob"
main = print $ parent "mike" "bob"
で True や False が出て、prologっぽくなります。

そこで、
parent X "bob"
という質問に対し、
X=tom
X=liz
みたいに変数にユニファイするような定数を手に入れるような仕組みってあるでしょうか?

入門書に、コンパイル時に内部でグラフを作るみたいな話が書いてあったので、
そのグラフを参照できるようなことができれば実現できると思うのですが、無理でしょうか?
863デフォルトの名無しさん:2008/11/08(土) 00:23:23
>>862
無理
Haskellの関数は文字通り関数なので、引数を放り込んで結果を観察する他に使い道は無い
864デフォルトの名無しさん:2008/11/08(土) 00:43:20
中間形式のグラフみたいなの見れないのん?
865デフォルトの名無しさん:2008/11/08(土) 01:15:29
中間形式のグラフって何?
グラフ簡約のことを言ってるのなら、グラフが作られるのは実行時だし、
要するに「未評価の式」を表してるだけだから、それを見ても>>862みたいなことをする助けにはならんよ
866デフォルトの名無しさん:2008/11/08(土) 01:27:35
少なくとも書こうとしてるプログラムの中からは見れない。
Haskellって厳格な言語で、その手の変なことは基本的にできないよ。
何をやりたいのか知らないけど、インタプリタ的なものを書いて、
それをライブラリとして使えば?
867デフォルトの名無しさん:2008/11/08(土) 01:38:05
ん、普通にMaybeとかそれ以前にListモナドとか使えば普通に実現出来るって云うかモナドのすべて読んだ方が良いと思うよ
868デフォルトの名無しさん:2008/11/08(土) 02:16:43
関数から引数への参照は、関数が展開されても複数の場所から同じ場所を参照するという話と、
先にグラフを作って、実行時に、そこにデータを流し込むような感じの説明があったから、
処理系をそのまま利用して、かなり高速なデータベースが作れると思ったんですけどダメですかね。

実現できればprologよりも表現能力が高いから面白そうだと思ったんですが。
869デフォルトの名無しさん:2008/11/08(土) 03:27:38
>関数から引数への参照は、関数が展開されても複数の場所から同じ場所を参照する
これはその通り

>先にグラフを作って、実行時に、そこにデータを流し込む
これはぜんぜん違う
多分どこかで誤読してると思う
870デフォルトの名無しさん:2008/11/08(土) 11:40:05
>>867
zs <- everything
append [1..100] [1..100] zs
こういうやり方じゃ生きてるうちに終わらないかもよ。
Listモナドは、もちろんユニフィケーションや制約伝播なんて無くて、
総当りで解を求めようとする非決定性計算ってだけなんで。
871デフォルトの名無しさん:2008/11/08(土) 11:50:02
yet another embedding of pure Prolog into Haskell
http://okmij.org/ftp/Prolog/Arithm/DefinitionTree.hs

いまいち使い方はわからんけど、ググったら見つかったので貼っておく。
872デフォルトの名無しさん:2008/11/08(土) 20:48:35
>>870
failや[]で枝狩り
873デフォルトの名無しさん:2008/11/09(日) 00:44:22
>>872
変数をどう表現して、何をどう枝刈るの?
874デフォルトの名無しさん:2008/11/22(土) 08:25:24
887 名前:デフォルトの名無しさん[] 投稿日:2008/11/22(土) 00:28:37
Real World Haskellは糞本だと思う
875デフォルトの名無しさん:2008/11/23(日) 12:49:16
出版されたの?
876デフォルトの名無しさん:2008/11/25(火) 23:01:38
出版されたかは知らないけど訳してる人がいる
ttp://d.hatena.ne.jp/mokehehe/20081124/rwh
877デフォルトの名無しさん:2008/11/25(火) 23:27:23
始まったばかりにしても、ひでえ訳
878デフォルトの名無しさん:2008/11/25(火) 23:41:58
Real World Haskellって翻訳本が出ると思いますか?
マイナーな言語だけど、微妙にブームになってるし
来年ぐらいに出版されたりするかなあ?
879デフォルトの名無しさん:2008/11/25(火) 23:48:26
確かに一時期あったけど、とっくに沈静化したような…>ブーム
880a36 ◆K0BqlCB3.k :2008/11/25(火) 23:50:52
>>879
最近は沈静化したように見せかけて、ジワジワきてるよ。
各大学の卒研レベルではHaskellやったりしてるところが増えてきてる。
881デフォルトの名無しさん:2008/11/26(水) 00:04:13
うーん、訳の出来とは別になんか期待できなさそうな感じ
882a36 ◆K0BqlCB3.k :2008/11/26(水) 00:08:27
原文自体平易な英文なので今後のことを考えるなら英文に慣れるために原文で読むことをお勧めします。
883デフォルトの名無しさん:2008/11/26(水) 00:12:16
まだ10章までしか読めてないけど
ふつケルの次くらいに読む分には悪くないと思う>RWH

タダだし
884デフォルトの名無しさん:2008/11/26(水) 00:17:39
本買おうと思ったけど、WEBで読めるわけだし
翻訳本が出るまでそれですまそうかなw
885デフォルトの名無しさん:2008/11/26(水) 00:19:34
RWHクソだろ〜
11章からはページを増やすためにネタを書きましたって
レベルのオナねたのオンパレードだぞ
886デフォルトの名無しさん:2008/11/26(水) 00:36:34
RWHってネットでもう出回ってるんだなw
887デフォルトの名無しさん:2008/11/26(水) 00:45:56
出回ってるつーかあれを最近本にしたんでしょ?
888デフォルトの名無しさん:2008/11/26(水) 00:49:09
存在型ってなんですか?
889デフォルトの名無しさん:2008/11/26(水) 01:23:56
バキシルとか大麻のことだ
890デフォルトの名無しさん:2008/11/26(水) 01:48:33
ありがとうございます。
891デフォルトの名無しさん:2008/11/26(水) 07:48:38
>>888
Cardelli読め
892デフォルトの名無しさん:2008/11/26(水) 13:02:02
Haskell: The Craft of Functional Programming

Programming in Haskell
のどちらがお勧めですか?ふつけるの次くらい。
893デフォルトの名無しさん:2008/11/26(水) 21:24:32
>>884
下手糞な翻訳の恐れ大。最近多いね、いや昔からか
894デフォルトの名無しさん:2008/11/26(水) 22:52:49
Programming in Haskellはいいよ。ふつけるの前でもいいです。
895デフォルトの名無しさん:2008/11/27(木) 19:14:12
>>892
自分はふつけるの後にCraftでした。というか、その間にSICPが
あるので、あんまり参考にならないかな。ふつける読んでも
ちょっとピンとこなかったんですね、よくまとまってるとは思うのですが。

自分は普通の文系プログラマで、関数型プログラミングの世界とは
無縁だったので、SICPをくぐる必要があったと感じてます。
896デフォルトの名無しさん:2008/11/27(木) 19:30:50
Craftはいつ第3判が出るのですか?
897デフォルトの名無しさん:2008/11/27(木) 19:55:34
Craft第2版以降で目立ったHaskellの技法というと、Arrowぐらいでしょうか。

あとはReal Worldみたいな実用面を書いたものになりますかね。
898デフォルトの名無しさん:2008/11/27(木) 20:02:06
ガンズのニューアルバムが出るころに出版されるそうです。
899デフォルトの名無しさん:2008/11/28(金) 20:17:32
それは出版されないってのとどう違うのだ
900デフォルトの名無しさん:2008/11/28(金) 22:32:12
泳げる頃にh(ry
901デフォルトの名無しさん:2008/11/28(金) 23:59:30
1版ならともかく3版なら別に出なくてもいいんじゃね
902デフォルトの名無しさん:2008/11/29(土) 00:04:26
Implementing Functional Languages: a tutorial

ってのをやってますが、練習問題の回答とかどっかに転がってますでしょうか。
903デフォルトの名無しさん:2008/11/29(土) 11:25:49
>>902
著者本人が公開してる。あとは自分で探せクズ。
904デフォルトの名無しさん:2008/11/29(土) 11:27:36
>>903
おめーがクズだろ
この引きこもりw
905デフォルトの名無しさん:2008/11/29(土) 21:15:40
自演乙
906デフォルトの名無しさん:2008/11/29(土) 22:05:13
Haskellで書かれた数式処理ソフトがあると聞いたのですが
maximaと比べると
言語から直接利用するときの利用しやすさは、どんな感じなのでしょうか?
907デフォルトの名無しさん:2008/11/30(日) 09:20:37
PJの答を探しているクズ、どこのゼミ生かしらんが、これで次の輪講はアウトだなwww
908902:2008/11/30(日) 09:56:28
>>907
自分では探してみましたが、部分的なコードだけしか見つけられませんでした。

ちなみに、自分は学生ではないんです。輪読の場があったりしたら入りたい
ですけど、ちょっと今は時間的に厳しいかな。ネットでやってたりするといいん
ですが。
909デフォルトの名無しさん:2008/11/30(日) 16:00:41
探すもなにも、入手方法ちゃんと書いてあるじゃんwww
910デフォルトの名無しさん:2008/11/30(日) 21:28:44
>>896
2021年4月19日に出るみたいです。
まだ相当先ですね。
911デフォルトの名無しさん:2008/12/01(月) 20:25:35
どんどん延期してると思ったら
今度はありえないくらいに延ばしたな・・・
912デフォルトの名無しさん:2008/12/07(日) 12:54:19
ghci の補完って windows じゃ効かないんですかね。
Linux 上だとちゃんと動いて便利だったのでショックです。

ネット探してみると rlwrap 使えとかあったけど
rlwrap って動的な補完(スコープ内の関数一覧等)
って可能なんでしょうか。
913デフォルトの名無しさん:2008/12/07(日) 13:54:21
そんな高度な補完はemacsのinferior-haskellとかeclipseの拡張でもできるかどうか怪しいな
914デフォルトの名無しさん:2008/12/07(日) 13:56:28
英語配列30g早く!
915902:2008/12/07(日) 20:05:48
>>909
書いてありました。これって個人でも送ってくれるのでしょうかね。

ただ、まだ半分ぐらいなんですけど、問題簡単なので別に解答不要
になりそうです。ありがとうございました。
916デフォルトの名無しさん:2008/12/13(土) 18:52:49
do記法と(>>=)の対応についてですが、
do;putStr "a\n";putStr "b\n";putStr "c\n";

putStr "a\n" >>= (\_->putStr "b\n" >>= (\_-> putStr "c\n"))
なんですかね?

右結合的になったり匿名関数に変換されたりと難しいです
917a36 ◆K0BqlCB3.k :2008/12/13(土) 19:06:24
>>916
一緒です。
でも
putStr "a\n">>putStr "b\n">>putStr "c\n"
と書いた方がきれいですよ。
918a36 ◆K0BqlCB3.k :2008/12/13(土) 19:06:57
あと、括弧なくても良いですよ。
919デフォルトの名無しさん:2008/12/14(日) 10:36:09
なるほど、そう言えばlambda式ってかなり優先順位が高いんでしたね
ありがとうございました
920デフォルトの名無しさん:2008/12/14(日) 15:42:38
F#からポロロッカしてきました

fold/undold、flip とかを使った関数合成がすげえ苦手なんですが
このあたりに特化した書籍とかってないでしょうか

モナドとか継続とかはわりとどうでもいいんですが
921デフォルトの名無しさん:2008/12/14(日) 16:19:34
プログラムの変形やそこで使う公式を見るのがいいと思う。
birdがそういうの得意な人だから、
Introduction to Functional Programming using Haskell
http://www.amazon.com/Introduction-Functional-Programming-using-Haskell/dp/0134843460/
"Using Haskell"じゃない前の版の方がその辺は内容が濃かった。

The Algebra of Programming
http://www.amazon.com/Algebra-Programming-Prentice-Hall-International-Computer/dp/013507245X/
は関数合成、変形ドリルみたいな内容だった。
たしかparserを必要な機能を持つように変形する論文もあったはず。

922デフォルトの名無しさん:2008/12/14(日) 17:06:40
undoldって何かと思ったけど、unfoldの間違いだよね?
923920:2008/12/14(日) 17:19:51
間違いですw

>>921
ありがとう
Introduction〜とRealWorldHaskellをぽちってみました
下は高杉…
924デフォルトの名無しさん:2008/12/15(月) 17:13:13
yet another haskell tutorialの4.6で

cfold' f z [] = z
cfold' f z (x:xs) = f x z (\y -> cfold' f y xs)

という継続fの与え方次第でfoldlにもfoldrにもなるものが出てきたんですが
普通のfoldlやfoldrの定義からこれを導きだす手順のようなものがあるなら知りたいです

また「なんでも再帰」流に一つ引数増やして、最後にそれを必ず呼び出すようにして
末尾再帰の形に直していく…ってやり方で書こうとしてますがさっぱりです
925デフォルトの名無しさん:2008/12/16(火) 12:48:15
面倒だからfactorialで書くと、
fac 0 = 1
fac n = n * fac (n-1) なのか
fac n = fac (n-1) * n なのかってことだから、

fac n = ((n *) . fac) (n-1)あるいは、
fac n = ((* n) . fac) (n-1)

fac n = (((\m ->(m *)) n) . fac) (n-1)あるいは、
fac n = (((\m ->(* m)) n) . fac) (n-1)

fac0 f n = ((f n) . (fac0 f)) (n-1)で
fac0 (\m ->(m *)) nあるいはfac0 (\m ->(* m)) n

\m ->(m *)と\m ->(* m)は、
fac(n-1)を計算した後にすべき計算、つまり継続になっています。

926デフォルトの名無しさん:2008/12/16(火) 12:51:01
要するにfoldってのは累積を計算しているのだから、
その累積演算を関数に独立させると、foldの性質上、継続的になるのです。
mapだとこうはなりません。
927デフォルトの名無しさん:2008/12/16(火) 22:40:24
>>926
ところがどっこい、この説明のすぐ後で、
「CPSを使ってmapとfilterを書け」なんて演習問題が出されてるわけですよ。

それを考えると、foldlの定義からcfold'へ持っていってあげたほうが
親切かもしれません。
928デフォルトの名無しさん:2008/12/16(火) 22:53:36
あっと、「この説明」ってのは
「yet another haskell tutorial の cfold' の説明」のことね。
929デフォルトの名無しさん:2008/12/16(火) 23:38:03
>>927
cfold'は、元のfold*の引数に渡す演算自体が継続的になるのに対して、
mapでは引数に渡す演算ではなくて、:が継続的になるわけです。
だからYAHTでは微妙に表現を変えています。
map f = foldr (\x -> ((f x) :)) []
ですから当たり前ですけども。
930デフォルトの名無しさん:2008/12/19(金) 19:38:36
>>929
すまん、「継続的」という言葉の意味がさっぱり分からん。
CPSにしたときに最後に行われる計算、という意味なら、
foldlは「foldl」自体が継続的、
foldrは引数として渡す関数「f」が継続的ということになるので、
fold*で継続的となる関数が同じになるとは思えない。
931デフォルトの名無しさん:2008/12/21(日) 19:58:16
おそらく激しいFAQだとは思うのですが、日本語の扱いについて。
Charの仕様からして、 >>5の「i. CharをUnicodeとして扱う」が筋と思いますが、
リテラルはともかく、IOでの変換のスタンダードな方法はもう固まってきてるでしょうか。
http://blog.kfish.org/2007/10/survey-haskell-unicode-support.html によると、
メジャーな方法が3つあるらしいですが、どれか、もしくはどれかがdefactoになっているでしょうか。
Haskell'でも使えるのがいいですが…。
932デフォルトの名無しさん:2008/12/21(日) 22:14:48
utf8-stringっぽいかな‥‥
933デフォルトの名無しさん:2008/12/24(水) 03:05:00
>>930
本人ではないが、
fが継続的(serial):
 どのxに対してもあるyが存在してf x yという関係が成り立つ。
クリプキの様相論理で出てくる、でも多分、その意味で使っている
わけではないと思うけど。
934デフォルトの名無しさん:2008/12/24(水) 21:30:39
クリプキナツカシス

・空でない集合W(要素は可能世界)と、W中の二項関係(到達可能性関係)Rの組をフレームと呼び、F=<W,R>と表す
・そこから到達可能な世界が一つもない世界を dead end と呼ぶ
・Rがserialである⇔∀w∃w'(wRw') = そのフレームには dead end が存在しない

とすると

「必然的にAならAは可能である (□A->◇A)」がフレームFで妥当 ⇔ Rがserialである


…学生の頃のノート読み返してみたがわけわかんね('A`)
935デフォルトの名無しさん:2008/12/25(木) 02:07:28
専門外のうろ覚えながら

ある世界で□Aが成立するとは、そこから到達可能な世界全てでAが成立することで
ある世界で◇Aが成立するとは、そこから到達可能な世界のなかに、Aが成立する世界があること
という認識でいいのかな。

ある世界で、任意の論理式Aについて『□A→◇A』が成り立つなら、『(◇A)∨(◇¬A)』。
つまり、その世界から到達可能な世界のなかに、Aが成立するものかあるか、¬Aが成立するものがある。
結局、『□A→◇A』は「到達可能な世界が少なくとも1つあり、その世界でのAの成否には言及しない。」と言っているんだろう。

で、全ての世界で『□A→◇A』が成立するなら、全ての世界が「次の世界」を持ち、dead endが存在しない、と。
936デフォルトの名無しさん:2008/12/25(木) 15:44:56
自然言語に直すと余計にややこしく思える
937デフォルトの名無しさん:2008/12/26(金) 15:26:05
Haskellの話じゃないのに、Haskellスレっぽい。
938デフォルトの名無しさん:2008/12/26(金) 21:21:34
モナドは様相だしな
939デフォルトの名無しさん:2008/12/26(金) 21:46:54
stateのsemanticsをtemporal logicでってのはよくある。
940デフォルトの名無しさん:2008/12/26(金) 23:20:06
規制か?
941デフォルトの名無しさん:2008/12/27(土) 15:24:26
StringとIO Stringって何が違うの?
むしろHaskell的にどう解釈すればStringとIO Stringの区別がつくの?
942デフォルトの名無しさん:2008/12/27(土) 15:39:30
IOの結果得られる文字列がIO String。
例えば、ファイル全体を文字列にして返すreadFileは、
readFile :: FilePath -> IO String
943デフォルトの名無しさん:2008/12/27(土) 16:22:29
base/GHC/IOBase.lhsより
newtype IO a = IO (State# RealWorld -> (# State# RealWorld, a #))
IOの実体は現実世界の状態をとって、IO動作実行後の状態と型aをもつ値の組を返す関数
と読めるけどいまいち釈然としないなー
まともに理解するには圏論や時相論理とかの知識がいるのかな?
944デフォルトの名無しさん:2008/12/27(土) 16:48:09
いらないよ。

エラーが起きたかどうかとか、
readLineだと、どこまで読んだかとか、
writeFileだと、書き込んだファイルとか、
そんなのがIOの「状態」。
945デフォルトの名無しさん:2008/12/27(土) 17:36:07
俺は >>943 に書いてあるとおり、現実世界を状態としてもつ
Stateモナドの一種だけど runState を書かなくてもいい特別
扱いされたものだと理解している。
946デフォルトの名無しさん:2008/12/27(土) 22:26:09
gtk2hsもwin32パッケージもインスコできねぇ
947デフォルトの名無しさん:2008/12/28(日) 19:54:43
StringとIO Stringについてはなんとなく分かった
そういうものと認識していればいいのね
で、IO StringからStringってどうやって取り出せるの?
入門書嫁ですねわかりました
948デフォルトの名無しさん:2008/12/28(日) 20:23:31
パターンマッチで抜き出す。
949デフォルトの名無しさん:2008/12/29(月) 11:11:32
REPL的な環境で使ってると、何が違うのか気付きにくいよね……
950デフォルトの名無しさん:2008/12/29(月) 12:19:22
REPLがそもそもIOモナドだもんね。
トップレベルで扱っていると思っているのはStringじゃなくてIO String。
951a36 ◆K0BqlCB3.k :2008/12/29(月) 12:23:10
>>950
モナドではないと思うよ
952デフォルトの名無しさん:2008/12/29(月) 12:27:41
REPLモナドとか作れそうだな
しかしそういうCUIインターフェースを作るフレームワークって既に誰か作ってそうな気もする
953デフォルトの名無しさん:2008/12/29(月) 12:38:02
つ $(GHC)/compiler/ghci/GhciMonad.hs
954デフォルトの名無しさん:2008/12/29(月) 12:38:38
>>952
つ $(GHC)/compiler/ghci/InteractiveUI.hs
955デフォルトの名無しさん:2008/12/29(月) 14:08:02
>>947
つ>>=
956デフォルトの名無しさん:2008/12/30(火) 00:58:13
template haskell使ったらユニットテスト等で
どんな式からexpectedやgotが算出されたかとか、
このテストケースが書かれたのはソースのn行目、m項目であるとかを表示できるんだねぇ
これ使えばHUnitもRspecとかみたいにテスト結果をもっとkwsk表示するようになるんだろうか
957デフォルトの名無しさん:2008/12/30(火) 11:12:18
と思ったけど今のsyntaxだと$()だらけで汚いことになるからありえんか
958デフォルトの名無しさん:2009/01/01(木) 13:00:08
HTFというのがまさしくそれ…のようなんだが
使い方が全然わからねぇ…
Q [Dec]を要求するtestsって何!?
959デフォルトの名無しさん:2009/01/01(木) 14:45:43
話ぶった切ってすまそ

GHC-6.10 + OpenGL + GLUT の環境で

renderPrimitive LineLoop $ mapM_ vertex [Vertex2 (-0.9) (-0.9), Vertex2 0.9 (-0.9), Vertex2 0.9 0.9, Vertex2 (-0.9) 0.9]

↑これをGHCiで入力すると IO () として正常に扱ってくれるんだが
GHCでソース中に書くと

「Ambiguous type variable `a' in the constraints: `VertexComponent a' arising from a use of `vertex'」
「Probable fix: add a type signature that fixes these type variable(s)」

とか怒られるんだが…
どこでどうダウンキャスト(?)すればいいのかわからない

エロいひとご教示おねがいします
960デフォルトの名無しさん:2009/01/01(木) 15:39:19
↓自己解決しました

renderPrimitive LineLoop $ mapM_ vertex [Vertex2 (-0.9 :: Float) (-0.9), Vertex2 0.9 (-0.9), Vertex2 0.9 0.9, Vertex2 (-0.9) 0.9]
                                   ~~~~~~~
しょぼくてごめん^^
961デフォルトの名無しさん:2009/01/09(金) 13:20:33
とりあえず、HaskellのMLで圏論の話とかやめてもらえねーかな。
正直、みんな引いてると思うんだよね。
新規参入者が減るからHaskellの話と圏論の話は別のMLに分けた方が良いと思うんだ。
962デフォルトの名無しさん:2009/01/09(金) 14:02:50
このスレでそんな事逝っても意味ないだろバカ
直接そのMLで家よバカ
963デフォルトの名無しさん:2009/01/09(金) 14:09:20
>>962
代わりに言ってよ
俺は他人の反感買いたくないんだ
964デフォルトの名無しさん:2009/01/09(金) 14:16:03
Meta Language の方の ML かと思ったから意味がわからなかった
965デフォルトの名無しさん:2009/01/09(金) 14:43:46
本物の初心者はhaskell cafeへ
966デフォルトの名無しさん:2009/01/09(金) 14:51:32
Haskellと圏論は不可分なものではない。
単にモナドが圏論チックなだけ。
圏論の議論は圏論のメーリングリストでやればいい。
967デフォルトの名無しさん:2009/01/09(金) 15:12:02
You Ain't Gonna Need Itですか?
968デフォルトの名無しさん:2009/01/09(金) 15:44:39
マイナー人間同士仲良くやりなさいよ。
そんなことで剣呑するより圏論する方がいいじゃないか。
969デフォルトの名無しさん:2009/01/09(金) 15:58:05
圏論厨UZEEE
970デフォルトの名無しさん:2009/01/09(金) 15:59:56
っていうか、圏論って別にマイナーでもないぞ。
数学じゃ普通に使う。
HaskellのMLに来てるやつは数学系のMLについて行けなかった奴らだろうな。
971デフォルトの名無しさん:2009/01/09(金) 16:03:33
haskellと一緒に勉強すると単品でやるよりわかりやすいらしい
972デフォルトの名無しさん:2009/01/09(金) 16:34:23
おしりまん
973デフォルトの名無しさん:2009/01/09(金) 19:32:17
Real World HaskellってAmazonのComputers & Internetカテゴリで
ベスト11に入ってる。配下のProgrammingでは5位。

すごいな。Haskellってこんなに流行ってるのか…
974デフォルトの名無しさん:2009/01/10(土) 08:49:40
SICP が売れて Scheme が流行ったか?
975デフォルトの名無しさん:2009/01/10(土) 09:28:00
学生が主に買ってるってこと?
976デフォルトの名無しさん:2009/01/10(土) 12:42:47
>>973
尼の情報操作
977デフォルトの名無しさん:2009/01/10(土) 12:45:49
現在8位 どんどんあがってる haskellの時代きた
978デフォルトの名無しさん:2009/01/11(日) 22:07:35
Amazonの順位は簡単に上下するぞ
979デフォルトの名無しさん:2009/01/12(月) 06:03:33
http://www.amazon.co.jp/Real-World-Haskell-Bryan-OSullivan/dp/0596514980/ref=pd_sim_fb_4

これはHaskell初心者向けかな?
schemeとocamlの基本は理解してる程度。
980デフォルトの名無しさん:2009/01/12(月) 06:15:48
まず日本語を理解しろ
981デフォルトの名無しさん
なんで自己啓発してんの?