[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 10/27 09:49 / Filesize : 225 KB / Number-of Response : 933
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 16:41:29 ]
haskell.org
www.haskell.org/

日本語サイト
www.sampou.org/cgi-bin/haskell.cgi
www.shido.info/hs/

過去ログ
関数型プログラミング言語Haskell
Part1 pc.2ch.net/tech/kako/996/996131288.html
Part2 pc2.2ch.net/test/read.cgi/tech/1013846140/
Part3 pc8.2ch.net/test/read.cgi/tech/1076418993/
Part4 pc8.2ch.net/test/read.cgi/tech/1140717775/
Part5 pc8.2ch.net/test/read.cgi/tech/1149263630/
Part6 pc11.2ch.net/test/read.cgi/tech/1162902266/
Part7 pc11.2ch.net/test/read.cgi/tech/1174211797/
Part8 pc11.2ch.net/test/read.cgi/tech/1193743693/
・2chの仕様により、行頭の半角スペースは表示されません。
 コードをインデントしたいときは、代わりに または全角スペースを使うことができます。


59 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 23:03:23 ]
monadiusはもはや古いぞ。
今はもっと洗練されてる。

60 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 00:08:32 ]
Little Haskeller読んで学習中。日本語版もホスイ

61 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 01:40:02 ]
>>60
それってリトル隙間の姉妹本?

62 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 02:51:30 ]
mod_haskell.soまだー?

63 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 03:51:48 ]
>>62
まってないで作って公開しろ

64 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 23:00:47 ]
>>59
今って例えばどれ?

65 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 03:04:27 ]
www.geocities.jp/takascience/doc/monadius-kof.pdf
古いというか、力技で作ったって感じ。
>>59はFRPを念頭においてるんだろうけど、
FragのObjectBehaviorなんかが洗練されてるのかは微妙。

66 名前:デフォルトの名無しさん [2008/05/22(木) 19:37:06 ]
質問です。

0〜10までの整数を定義した型というのは宣言できますか?

67 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 01:04:34 ]
>>27
数学基礎論がまるで分からないんだね。



68 名前:初心者修業中 mailto:sage [2008/05/23(金) 02:23:32 ]
>>66
data Hoge = Hoge0|Hoge1|Hoge2|Hoge3|…|Hoge10

これじゃ駄目?

69 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 07:10:08 ]
数学できない奴くるな

70 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 13:34:41 ]
haskell関係の文書(特に論文)を読みたくてhaskell.orgをあさってるんだけど
沢山あるからどれを読もうか迷ってしまう
このスレ的に、コレは読んでおいて損は無い!って奴あったら教えてくらはい
今のとこ読んだのはImperative functional programmingとLazy vs Strictと
Haskell vs. Ada vs. C++ vs. Awk vs. ...

71 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 13:47:07 ]
Tackling the awkward squad

72 名前:デフォルトの名無しさん [2008/05/23(金) 13:49:13 ]
もうここで紹介される論文はすべて読んだんだよなぁ。
2chは時代遅れ情報しか出てこねーな。noobどもしかいねぇ。

73 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 13:53:08 ]
2chの情報に価値がないと思うなら立ち去ればいいじゃないか!

74 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 14:18:52 ]
>>71
落として読んでみるよー
他にもあったら是非教えてクレクレ
>>72
玄人さん面白かった論文教えて

75 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 14:36:10 ]
>>69
そんな事を言う奴が来るな!
数学なんぞできんでもプログラムはできる!!

76 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 14:49:15 ]
最初のうちはな
手続き型にどっぷり浸かった後で関数型言語を触って嵌ってしまったやつは
やつは皆計算機科学の世界に飛び込み二度と帰ってこなくなっちまうものなのさ

「コード書いてるより数式弄くってるほうが楽しいおwwww」
俺の同僚の最後の言葉さ・・・

77 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 16:03:56 ]
だからオブジェクト指向が生き残るのですね



78 名前:デフォルトの名無しさん [2008/05/23(金) 18:02:35 ]
最近、自作のソースをarrowで設計段階からやり直そうとしているんだけど、
いまいちメリットが無いんだよなぁ。
前のコードの方が短かったし、arrowにしたせいで複雑になってしまうことも多々ある。
arrowのメリットを具体的に教えてくださいよ。
論文読んでみてもarrowのうまみが伝わってこないんだよね。

79 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 18:31:30 ]
難読化

80 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 19:12:20 ]
どんなものが分かりやすいかなんて人それぞれだし
arrowを使ったほうが分かりやすいって感じる人も少しはいるでしょうから
そういう人が勝手に使ってればそれでいいんでしょう

81 名前:36 ◆K0BqlCB3.k [2008/05/23(金) 19:20:21 ]
arrowを使ったプログラミングでは設計段階で図式化しやすいところにうまみがあるのかな?

82 名前:36 ◆K0BqlCB3.k mailto:sage [2008/05/23(金) 19:21:01 ]
ミスってコテハンつけちゃったぜ

83 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 19:39:51 ]
>>82
warrockに帰れwww

84 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 19:58:07 ]
>>78
(モナドと比較した場合)arrowの旨みって、モナドではないがarrowである型があるっていう一点じゃないの?
そういう型を扱うときはarrowの枠組みが便利というだけ

85 名前:36 ◆K0BqlCB3.k mailto:sage [2008/05/23(金) 20:07:01 ]
っていうかさ、俺は(\x -> (x, x))とかして処理を分けるのをいちいち書くのがめんどくさいときにarrow使うぜ

86 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 20:12:53 ]
>>85
確かにそれは慣れれば便利かもな
でも、Arrow (->)という特定のインスタンスを使ってるだけなら、
>>78が言ってるようなArrowの旨味とは別の話な気がする

87 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 23:35:21 ]
>>71
ちょwwBeautiful Codeって本みながら、たまたまスレ覗いたら、
本の中でソレ紹介されてたぞww



88 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 00:10:42 ]
arrowって今のところ
解析関係かデバッグ関係
形式証明以外使えそうな分野
無い


89 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 04:49:01 ]
分かってねーな

90 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 04:59:31 ]
分かってねーなじゃわからないっす。

91 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 22:25:11 ]
>>76
関数型が好きな理由は、所謂プログラミングの面白さがあるからではないな。

92 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 00:01:55 ]
do { ... } は「アクションっていう値」という認識でいいの?

93 名前:初心者修業中 mailto:sage [2008/05/25(日) 00:18:03 ]
>>92
do構文はbind演算子で結合された式を
手続型言語っぽく見せる糖衣構文と認識してますが。

94 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 01:33:41 ]
>>92
do{...}が値を持つ単なる式であるか、という質問ならそのとおり
>>93が言うようにdo式は構文糖で、bind演算子(>>=)の略記
do式の値が(広い意味で)アクションか、という質問ならそのとおり
具体的には、IOモナドに関するdo式なら値はIOアクション、リストモナドならリスト、という具合

95 名前:92 mailto:sage [2008/05/25(日) 01:35:15 ]
>>94
そういう意図の質問でした。ありがとう。

96 名前:初心者修業中 mailto:sage [2008/05/25(日) 02:31:03 ]
>>94

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

Maybeも(広い意味で)アクションなのでしょうか?


97 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 03:08:50 ]
>>96
そういうつもりで書いた
一般的でない用語法だったらすまん



98 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 03:28:30 ]
Just x : なにもしないでxを返すアクション
Nothing : 計算を即座に終了させるアクション

99 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 07:33:24 ]
f x: xにfを適用するアクション
1 + 2: 1と2を加えるアクション

100 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 09:42:48 ]
理系の方々に伺いたいんですけど、Haskellは数学で蓄積された
知識をダイレクトにコード化が可能だと感じますか?

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

そういう点で、Haskellはそのままとは言いませんが書きやすいの
かなぁと。だけど、僕の知人で理系の人たちはC言語使う場合が
多いようです。最大の理由はスピードだそうですが、手間を考えると
早い計算機使ってHaskellで書いた方がいい、という考えの人も
いるんでしょうか。

101 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 10:41:40 ]
ダイレクト云々よりも
LINPACKが使えるかどうか
それが問題だ


102 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 10:49:58 ]
>>99
関数とアクションは同じものなの?

103 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 10:55:25 ]
>>102
別のものだよ
>>99はネタ(か、たちの悪い誤解)だから真に受けんな

104 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 11:19:31 ]
LINPACKとか言ってるおっさん
氏ねよw

105 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 11:24:30 ]
>>100
0か1かみたいな考え方は辞めた方がいいかと。
工学の人は合理的、合目的的に考えるから、適材適所でやります。

速い計算機に、さらに速いソフトウェアがあれば、より計算を回せます。
計算機が速いから、ソフトウェアは遅くていいなんてやり方じゃ、
ライバルに負けてしまいます。遊びならそれでもいいけど。

106 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 11:39:54 ]
>>100

107 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 12:36:24 ]
「アクション」ていうのはIOモナドだけじゃねえの?
Maybeとかでも「アクション」ていうの?



108 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 12:43:09 ]
少なくともStateとかSTMモナドではアクションって言うよ

109 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 12:43:17 ]
自分もActionというのはIOだけを指しているのだと思ってました。要するに
関数の外の世界に対して、関数の動きが影響を与えたり、逆の現象が発生
するのがActionであり、IO型であると。

IOがモナドなのは、モナド則に当てはまるから、ってだけではないでしょうか?

110 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 13:21:38 ]
モナド則に当てはまらないものをモナドと言うわけないでしょ。

111 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 15:29:12 ]
使ったことないけどSerTHとか?

114 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 15:33:25 ]
>>113
へえ・・・ 何となくおもしろそう
ドキュメントとか読んでみます

115 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 15:58:20 ]
SerTH見てみましたけれど、どうやら私の用向きとは違うようですね。

116 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 16:02:02 ]
Template Haskellの方もちょっと見てみます

117 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 00:05:41 ]
計算理論の基礎
計算機プログラムの構造と解釈

ってどっち買ったらいいの?
なんか最近数学の基礎たりねー



118 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 00:17:22 ]
ちなみに計算理論の基礎が
つい先日第2版が出たので聞いてみた
私事だけど金がないので優先度が欲しい

119 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 07:36:44 ]
後者は原著がネット上で無料で読めるから前者

120 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 09:26:17 ]
というか全然違う傾向のほんのどっちがいいか聞かれても…
しかもHaskellには関係ない
推薦図書スレは別にあるよ


121 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 14:08:03 ]
こっちでいいかと
science6.2ch.net/test/read.cgi/informatics/1160740645/

122 名前:36 ◆K0BqlCB3.k mailto:sage [2008/05/26(月) 15:31:05 ]
全く調べずに聞くが、concurrent arrowなんてのは無いの?
arrow使ってていつも思うんだが、並列処理に向いてなくない?
FPGAとかのHDL記述とかに応用したりしてる人いないの?

123 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 22:01:15 ]
>>117
若いうちに読んどいた方がいいのは計算理論の基礎 の方だろ。
計算機プログラムの構造と解釈は仕事で必要になってからで十分。

124 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 22:17:09 ]
>>123
独学でやってしまった奴は
次何すればいいの?
とりあえず今自習でλの数学側の
側面勉強してみているが
何の役に立つかわからん

125 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 22:24:27 ]
絵を描いて学ぶ・プログラマのためのラムダ計算
d.hatena.ne.jp/m-hiyama/20070220/1171956186

126 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 22:27:23 ]
僕が「ラムダ計算は知っておいたほうがいい」と思う理由は、形式的計算体系としての“純粋ラムダ計算”が理論的に重要だから、というだけではありません。
むしろ、次に述べるようなことがより大きな動機となります。
まず、関数を表現する方法としてのラムダ記法(lambda notation)に慣れて、紙と鉛筆によるインフォーマルなラムダ計算が出来ると、
けっこうそれを使える場面が多いのです。例えば、「JavaScriptによるテンプレート・モナド、すっげー簡単!」の最後で、モナド法則を示すために、
インフォーマルなラムダ計算を使っています。
ある種の計算的実体(例:クロージャ)や計算手法(例:継続ベースの計算)の説明にもラムダ式がよく使われます。
式言語(EL; expression language)に対する処理系(パーザーやエバリュエータ)を作る場合なども、ラムダ計算が良いヒントになるでしょう。
もちろんラムダ計算は、既存の関数型言語を理解する基盤となります。あるいは、新しいプログラミング言語を設計する際にもラムダ計算が規範になるかも知れません。

127 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 22:45:04 ]
そもそも計算とはいったいなんなんだ?




128 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 23:36:50 ]
後者関数ってなんだぉ?

129 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 00:14:01 ]
やっぱ手書きしねーと理解できねーよw


130 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 07:23:35 ]
data type Nat = O | S Nat
という定義で自然数(0以上の整数)が表現できる。(ペアノの公理を満たす)
このとき S のことを後者関数(successor function)と呼ぶ。

131 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 11:39:43 ]
ここで
定義に再帰を使っていいんですか?
とか聞くとYコンビネータとか出てきちゃうんだろうか

132 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 16:49:17 ]
質問です

yampaっていったい何ですか?
ごく簡単に馬鹿でもわかるように概要を説明してください

133 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 19:16:35 ]
>>132
d.hatena.ne.jp/propella/20070315/p1
なんかどうよ。

134 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 20:06:04 ]
>>132
ll.jus.or.jp/llw2004/program/Reactive.pdf
5ページ目
Haskell による Arrowised Functional Reactive
Programming という実装


135 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 22:54:50 ]
Yampaってコンパみたいなもん?

136 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 07:20:03 ]
>>127N.D.Jones, Computability and Complexity
その他良本情報はこちら
ttp://www.kurims.kyoto-u.ac.jp/~hassei/reading_list.html


137 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 11:55:19 ]
「The Haskell School of Expression」で使われているコードの
ファイルってどこかに落ちてませんかね。



138 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 13:59:28 ]
>>137
ttp://www.haskell.org/soe/software1.htm

139 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 14:22:28 ]
>>138
あ、これってグラフィックライブラリだけじゃなくて、本のコードも
入ってるのか。勘違いしてた。ありがとう。

140 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 20:44:19 ]
comb :: Maybe a -> (a -> Maybe b) -> Maybe b

このときの

Maybe a -> (a -> Maybe b) ここまでが入力だよね?
2項目の引数が関数になっているって解釈でいいんだよね?

141 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 21:04:28 ]
うん

142 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 21:41:20 ]
違うだろw

入力 : Maybe a
出力 : (a -> Maybe b) -> Maybe b

143 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 21:51:45 ]
()でくくるとどうなるのw?

144 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 21:52:57 ]
>>142
同じことじゃねーか
関数を返す関数と二引数の関数を同一視するのはHaskellでは普通の習慣

145 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 22:22:38 ]
>>143
a -> Maybe b
っていう関数を引数にとるっていうことだよ

146 名前:初心者修業中 mailto:sage [2008/05/31(土) 22:30:19 ]
>>140
Maybe a -> (a -> Maybe b) の2つを入力とする事もできるし、
Maybe a だけを入力とする事もできる。

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

…と認識しています。


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

Haskellはグラフ簡約によって1度に1つのTermを解釈していくだけ
なので、最終的な結果は高々1つになるはずだと思っていたのですが
どうやら違うようで混乱してきました。困った、不勉強だ困った




148 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 22:38:00 ]
>>143
右結合の二項演算子?である「->」の結合順序をデフォルトから変更している。

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

A -> (B -> C) -> D
は、
A -> ((B -> C) -> D)
と解釈される。

149 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 22:39:34 ]
>>147
>どうやら上の人曰く間違っているようで
間違ってないよ

150 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 22:56:33 ]
>>142が突っ込んでるのは

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

の部分。

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

こっちは合ってる。

152 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 23:54:09 ]
カリー化とは何か?を書いた方がいいんではないでしょうか。

↓ではお願いします。

153 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 23:58:34 ]
この関数適用は出来損ないだ。食べられないよ。

154 名前:初心者修業中 mailto:sage [2008/06/01(日) 01:08:22 ]
カリー化とは、
複数の引数を持つ関数を
引数一つの関数の組み合せとする事。

…と認識しています。

155 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 01:08:36 ]
カリー化という言葉を見ると頭の中で
「カリンカカリンカ カリンカマヤ」という歌が繰り返されて止まらなくなる。

156 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 01:54:38 ]
おれもそうりかいしてる。<154
でも、カリー化ときいてターメリックをぶっかけてるイメージしかないw

157 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 09:01:04 ]
ガラムマサラとかも入れた方がいいのでは?



158 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 10:27:15 ]
エバラ化、桃屋化

159 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 10:28:14 ]
味の素化

160 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 10:59:26 ]
>>140
  A -> (B -> C)
というふうに切り出してしまったけど、これは本来の
  A → ((B → C) → D)
という結合関係を無視してる(「A -> (B -> C)」という型を扱うみたいに書いている)。
ってのが>>142でしょ。

カリー化の影響として、「複数の引数をとる」
  (A × (B → C)) → D
ことと、「関数を返す」ことの、どちらに主眼があるかが不明瞭になるってのがあると思うね。

161 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 11:24:29 ]
>>151>>160
その理屈は分かるんだが、カリー化を理解してるのか怪しい初心者に対して
混乱させるようなことを言うのは不親切だと思う
Maybe aと(a -> Maybe b)の二つが引数になっているという理解で正しい、と教えれば十分じゃないか

162 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 11:48:09 ]
> Maybe a -> (a -> Maybe b) ここまでが入力だよね?

「ここまでが引数リストに対応する部分だよね?」と読むと○
「ここまでが引数の型だよね?」と読むと× ← ちょっと窮屈な解釈かも、みたいな空気

164 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 15:19:49 ]
> Maybe a -> (a -> Maybe b) -> ここまでが入力だよね?

と書けばおk

165 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 17:10:16 ]
なるほどw

166 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 23:06:52 ]
複数引数の邪悪な関数をこらしめるのがカリー化です。

167 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 23:33:45 ]
それだけならタプルで渡せばいいだけじゃそ



168 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 23:44:14 ]

=>

これがよくわからん


169 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 23:47:32 ]
<コ:彡

170 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 00:31:27 ]
兄者…

171 名前:初心者修業中 mailto:sage [2008/06/02(月) 01:36:10 ]
>>168
:は、リストの先頭に要素を結合する演算子

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


…と認識しています。

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



173 名前:デフォルトの名無しさん mailto:sage [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 名前:初心者修業中 mailto:sage [2008/06/04(水) 01:51:20 ]
お願いします m(_ _)m

175 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 07:01:52 ]
改めて見るとオーバーロードの解釈が破綻してるなw
すまぬ

177 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 00:09:02 ]
=>
C++のテンプレートの特殊化みたいなものか
演算子は定義されているけど特定の型じゃないと
処理できない場合、特定のの変数を特殊化すること
あるけど



178 名前:初心者修業中 mailto:sage [2008/06/05(木) 00:54:30 ]
>>177
日本語でお願いしますm(_ _)m

179 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 08:24:10 ]
Haskellian ももうブランドではなくなりましたね…
メジャーになった証か


180 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 08:41:12 ]
=> の意味は総称型に制限を与える、じゃだめなのかなぁ。

質問、というより興味本位のアンケート。
あなたが思うhaskellの面白いところってどこですか?

181 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 09:05:56 ]
アホな質問するスレがあるところ

182 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 16:59:32 ]
堅い言語なのに簡潔に書けるようになってるところが面白いと思うし、すごく好きだ
記号を多用してたり、インデントを使ってたり

183 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 18:54:01 ]
「haskell使ってる」と言うと、みんなに尊敬して貰えること

184 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 19:19:05 ]
>>180
高速化を考え出すと、すごくたいへんなところ。

185 名前:デフォルトの名無しさん [2008/06/05(木) 21:02:04 ]
[(x,y) | x + y = 10]

186 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 21:59:49 ]
>>183
このスレ見てたらそう思えんわな、、、


187 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 22:55:55 ]
知らない人は知らないし、知ってる人はわかるもんな
しかしいい言語だ



188 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 23:02:27 ]
汎関数系の言語はC++もそうだが、
かなり野心的な言語設計になるね。
クラス囲い込み度が低いからだろうか。

189 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 23:56:07 ]
>>185
そんなのできたの!?と思って ghci で試したらできなかった。
ちょっと悲しくなった。

190 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 00:00:22 ]
インデントがよくわからなくて
エラーでていらつく
なんとかならんのかね?この糞言語
インデント制約糞なら最初からなんか
そういう機能入れろよなぁ

あーあー世界で最悪の糞言語だね
インデントのせいだけで

191 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 00:12:41 ]
>>190
そういう説もあります。
そうでないという説もあります。

192 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 00:29:14 ]
インデントがいやなら { } と ; で全部区切ればいいじゃん
一緒だよ

193 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 03:41:00 ]
それを見つけるのにもtraceが役立つのではないか

195 名前:初心者修業中 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 07:41:25 ]
[(x,y) | x <- [1..], y <- [1..], x+y = 10]

197 名前:初心者修業中 mailto:sage [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 名前:初心者修業中 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 08:43:25 ]
つまらない答えだが

[(x,y) | k <- [0..], x <- [0..k], y <- [0..k], x + y == k]


200 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 08:52:37 ]
つまらないのならこれが一番
[(x, 10-x) | x <- [0..10]]

201 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 08:54:12 ]
>>199
間違ってるやん!

202 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 09:51:55 ]
[(a,b) | x <- [0..], y <- [0..x], x + y == 10, (a,b) <- [(x,y), (y,x)]]
こんなんできたっけ

203 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 09:52:48 ]
なんだ(a,b)って t <- [(x,y), (y,x)]

204 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 10:16:24 ]
>>190
Pythonに見られるインデントによる制御構造の是非
pc11.2ch.net/test/read.cgi/tech/1169473442/l50

205 名前:初心者修業中 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 15:16:52 ]
GHC 6.8.3 まだー?

207 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 18:05:51 ]
>>206
作って公開してくれ。



208 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 00:31:44 ]
無明関数って何がうれしいの?

209 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 00:52:24 ]
いちいち関数の名前考えなくても良い
名前をつけるまでもない単純な関数を作る時に便利

210 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 01:08:37 ]
名前を付けることは名前空間を汚染すると言うこと
名前よりも式そのもののほうが理解しやすい場合もある

211 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 01:24:35 ]
getChar >>= \a -> getChar >>= \b -> putChar b >> putChar a
こういうのに名前つけるのはいやだな

212 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 02:04:23 ]
>>208
そういう話題は関数型言語スレのほうが向いている。
関数型言語一般について語れるよ。

213 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 02:12:55 ]
>>208
どんなバックグラウンドをもってる?関数型言語についての経験は?
手続き型の国の人ならば、わかりにくいところやね。
関数を変数でもたすってのは関数型では日常茶飯事なんですわ。
そこに便利さのヒントがアルよ。

214 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 07:57:49 ]
map (\(a, b) -> a+b) [(1,1), (2, 3) ..]

215 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 10:56:31 ]
>>213
手続きの国からワープしてきたのですが
関数を変数にするならポインタ渡せばよくないですか?

そうすれば、定義しても渡せますよね?

216 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 11:20:46 ]
名前があってもなくてもポインタ渡すのです

関数オブジェクトは、メソッドがひとつしかないクラスのインスタンス、に似ています
インスタンスに名前がついているとは限らないのです

217 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 11:33:06 ]
>>216
よくわからないぉ
もう少し詳しく説明してぉ?



218 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 11:43:32 ]
無明関数…悟りでも得たいのか?


219 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 11:46:43 ]
>>218
間違えただけだぉ気にしないで

220 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 11:47:44 ]
>>218
悟りは得るものではなく開くものです。

221 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 12:06:14 ]
名前を考えるのが面倒くさい
再利用しない
定義している箇所を探すのが面倒くさい
関数内部の処理が簡潔

のときは無名関数使いたくならないか?

222 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 12:14:34 ]
つーか、関数本体そのものずばりを一覧できる状態で渡しているのにわざわざ名前をつける必要があるのだろうか

223 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 12:28:02 ]
カリー化
(new Satori(x)).open(y)

224 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 12:43:21 ]
無名関数で再帰するにはどうすればいいですか
たとえば、
f n = if n == 1 then 1 else n * f (n-1)
はどのように書けばいいですか?

225 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 12:46:45 ]
fix (\f n -> if n == 1 then 1 else n * f (n-1))
むみょーん。Haskellian じゃないから fix があるかどうかシラネ


226 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 12:49:20 ]
型無し言語なら
(\f -> f f) (\f n -> if n == 1 then 1 else n * f f (n-1))

227 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 12:54:26 ]
あー、でも f って名前つけちゃったな




228 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 13:11:01 ]
>>225-226
ここはHaskellのスレですよ

229 名前:初心者修業中 mailto:sage [2008/06/07(土) 13:17:55 ]
>>225
Control.Monad.Fix にありますね。

fix :: (a -> a) -> a
fix f = let x = f x in x


230 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 14:16:56 ]
>>224
... f ...
where f n = if n == 1 then 1 else n * f (n-1)
局所的な関数定義で代わりになるんじゃないの、というのはダメかな

233 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 16:01:17 ]
>>232に同意

234 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 16:19:36 ]
名前が付いてるからダメ

235 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 16:37:58 ]
... (f where f n = if n == 1 then 1 else n * f (n-1)) ...
こうかー

236 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 17:22:54 ]
閉括弧が一個多かった
... (let f n = if n == 1 then 1 else n * f (n-1) in f) ...



238 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 21:46:25 ]
The Haskell School of Expressionで勉強してます。

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

www.elbeno.com/haskell_soe_blog/

↑このページは参照してますけど、11章までなので、全部が
まとまったのがあると嬉しいです。

239 名前:デフォルトの名無しさん [2008/06/16(月) 14:44:56 ]
ポイントフリースタイルについて質問なんですが、
Haskellでは原理的にどんな関数でもポイントフリースタイルに
変形可能なのでしょうか。

240 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 15:00:34 ]
うん

241 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 18:48:23 ]
>>239
Sコンビネータとかもポイントフリーに出来るんだっけか?

242 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 23:28:00 ]
ポイント = initial objectからのarrow
ポイントフリースタイル = ポイントを使わない関数定義

245 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 00:11:23 ]
(Monad m) => m (a -> b) -> m a -> m b

これって未だによくわからないけど
手計算できそうな実例ないですか?

246 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 09:12:38 ]
GHC 6.8.3リリース



248 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 11:53:17 ]
ナイス

249 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 14:40:13 ]
>>244
initial object(始対象)じゃなくて terminal object(始対象)だお。

集合の圏で terminal object からの arrow というと一点集合に相当する。
集合の圏では任意の一点集合 x に対して f x = g x ならば f = g
「point(一点集合)を使わずに関数が等しいことを表現できる」=>「ポイントフリー」ということだと思う。


250 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 18:25:28 ]
>>249
失礼、書き間違えた。
terminal object(終対象)だな。

251 名前:249 mailto:sage [2008/06/18(水) 18:26:24 ]
× terminal object(始対象)
○ terminal object(終対象)
だった。


252 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 11:33:25 ]
俺やべぇ
気がついたらポイントフリースタイルで5行も書いてたぜ
これはもはや関数型スパゲッティだな

253 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 12:48:07 ]
任意のλ式はSKコンビネータで書き換えられるとか言うのを見て
実際に適当なλ式で変換してみたら出てきた式はとても読める
代物ではなかったのを思い出した


254 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 15:00:42 ]
ありゃ一種の難読化だよな

255 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 18:06:18 ]
>>253
SKコンビネータも、名前付きにできると若干読みやすそうだけど。
っていうか、それが出来たら、どんな高級言語とも変らんという話になって、逆に面白さがないか。

256 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 19:22:12 ]
>>255
そこでunlambdaですよ!

257 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 00:27:42 ]
>>255
つ super combinator



258 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 17:45:00 ]
以下の関数fをもっと簡単にする方法ありませんか?

f [] = []
f (_:[]) = []
f (x:xs) = (x, head xs) : f xs

259 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 17:52:53 ]
簡単に、というより再帰を使わずにできませんか?

260 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 18:05:14 ]
f xs = zip xs (tail xs)

261 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 18:15:27 ]
f xs = zip xs (drop 1l xs)

262 名前:261 mailto:sage [2008/06/23(月) 19:03:55 ]
すまん。tail の l を残してしまった。

f xs = zip xs (drop 1 xs)

263 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 19:21:38 ]
zip [] ⊥ = []
らしいから>>260>>261は等価かな
こういうのを意識しないといけない場面だと非正格性が気持ち悪い

264 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 00:09:28 ]
>>263
⊥って勃起してるのw?

265 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 01:03:13 ]
いやむしろ tail で書けて気持ちいいだろ。

266 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 08:32:09 ]
>>267
そういうつもりで「正格」という言葉を使った

269 名前:初心者修業中 mailto:sage [2008/06/24(火) 09:53:02 ]
関数結合の(.)って優先順位が高いので、
どうしても括弧が増えて見ぐさい気が…。

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

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

こんな感じ

sigma = tail $. scanl (+) 0

標準ではなさそうなんですが、
やっぱ、問題ありですかね?


270 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 09:55:22 ]
慣れの問題

271 名前:初心者修業中 mailto:sage [2008/06/24(火) 10:13:14 ]
ああ、勘違いしてました。
関数の優先順位はどの演算子よりも上ですね。

これで問題ないのか

sigma = tail . scanl (+) 0

>>270
レスありがとうございます。
早く慣れたいです。
まだ、頭で考えないとよくわからない。
(考えてもわからない時ありw)

272 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 11:35:10 ]
>>266
「厳密には」も何も最初っからそう

273 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 12:56:24 ]
>>266
> 覚えていないといけない
覚えてなくてもプログラム書くのにはなにも困らない。
等価性とか考えだすと全部正格のほうが楽かもしれんけど。

274 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 18:49:23 ]
>>273
書くときは良くても読むとき困る
例えば>>260のコードが空リストに対しても正しく動作するかどうか確かめるのに、
いちいちPreludeの仕様を読まないといけない

zipみたいに明確な定義のある関数ならまだいいけど、
例えばhPutStrLn undefined ""の値が
1. ⊥
2. 実行時にエラーになるアクション
3. ()を返すアクション
のどれになるかは仕様では決まっていないはずで、ちょっと厄介

275 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 15:49:33 ]
ム板のやつらはなんでこんなに視野が狭いんだろうといつも思う。

277 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 17:38:53 ]
3の場合

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

>>276
正直くだらないネタ以外はここではなく他の所に書く。



278 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 18:27:02 ]
質問です

HaskellでGPGPU関連の話題ってありませんか?

279 名前:274 mailto:sage [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.もあり得なくはない

結局、非正格がデフォルトなせいで関数の仕様に書かなければいけない事項が多いのが問題
それを不用意にうやむやにすると関数の振る舞いが実装に依存してしまう
それほど頻繁に問題になることではないけど、たまに面倒

280 名前:275 mailto:sage [2008/06/25(水) 21:28:51 ]
>>279
> レビューとかデバッグとかしてるならそうはいかないだろ
うん。

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

> それほど頻繁に問題になることではないけど、たまに面倒
そういうこったね。

281 名前:275 mailto:sage [2008/06/25(水) 21:32:14 ]
> 誤解させたかもしれんが、HugsもGHCも2.の振る舞いをする
> 実行した時点でundefinedが評価されてエラー発生ね

そういうつもりでしたか。
ちなみにそれだと1.はどういうつもりだったのですか?

282 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 21:49:44 ]
>>281
hPutStr undefined "" `seq` 0
を評価してエラーが発生すれば1.だよな
実際試したらHugsでもGHCiでもエラーは発生しなかった

283 名前:275 mailto:sage [2008/06/25(水) 22:26:04 ]
なるほど。というか>>279をちゃんと読んでませんでしたごめんなさい。

284 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 21:37:05 ]
一通りよく取り上げられる教科書は読んだんですが、Arrowなどの
比較的新しい技法についてわかりやすく書かれた文書はどの辺
でしょうか。

285 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 23:11:25 ]
本家から辿って論文を読むのがいいと思うよ。

286 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 23:16:36 ]
Arrow アーーー

287 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 23:28:26 ]
arrowねぇ・・・イマイチだねぇ・・・
プログラミング的にはこれといってメリットないよ。



288 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 00:23:45 ]
>>284
www.haskell.org/haskellwiki/Arrow

289 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 00:05:34 ]
arrowで量子コンピュータのシミュレーションやってます
めっちゃべんりですっっっっs

290 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 01:15:42 ]
ユニタリ変換の理解が一つの山かも。

291 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 01:22:40 ]
ユニタリ変換?高校生でも知ってるよ

292 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 10:42:43 ]
皆さん、エディタは何使って書いてますか?

293 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 10:48:09 ]
emacsしか選択肢ないんじゃね?
eclipseは糞だし。

294 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 11:10:10 ]
vim

295 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 11:45:12 ]
notepad.exe

296 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 12:32:37 ]
vimやemacsだと使い勝手のいいプラグインあるんでしょうか。

自分もEclipseはちょっと嫌ですねぇ。

297 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 12:44:03 ]
www.haskell.org/libraries/haskell.vim その他いろいろ

$ hugs -Evim



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

何かの資料とか、HugsやGHCでの実現方法のソースとかあったら教えてくだしあ


299 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 16:38:24 ]
>>298
GHCはとりあえず全部左結合として解析(parser/Parse.y)して、
後のrenameのパスで結合性宣言をもとに組み立て直してる(rename/RnExpr.lhs)

300 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 16:57:55 ]
>>292
俺もvimだわ
なんか文法と相性良さげだし

301 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 17:16:47 ]
>>299
そういう手があったか。いや、全然関係ないパーサを先日作ってたんだが。
パス(1パスコンパイラとか2パスコンパイラとかのパス)にこだわっていては
非富豪的かねぇ。

302 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 18:10:34 ]
左結合にするってのは、
とりあえずリンクトリストにしといてから、
あとでパーズしなおすって事。

303 名前:デフォルトの名無しさん mailto:sa [2008/06/28(土) 18:39:00 ]
>>292 俺はAgda使ってるよ。結構使いやすい。

304 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 20:10:12 ]
project eulerに接続できねーぞ!!!
どうなってんだ糞

305 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 20:19:06 ]
質問です

グラフの研究で路線データ(や道路のデータなど)が使いたいのですが、
そういうデータを手に入れるにはどうすればいいですか?

306 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:47:48 ]
>>305
質問です

Haskellと関係ありますか?

307 名前:298 mailto:sage [2008/06/28(土) 22:27:19 ]
>>299,302
thx、参考になった。
細かく追えてないけど、かなりがんばらないとparseできないってことか。




308 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 08:23:28 ]
とりあえず左結合って要するにS式だよね。

309 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 18:44:49 ]
Real World Haskell
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 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 02:44:41 ]
中身読めるよ
book.realworldhaskell.org/beta/

表紙が決まったんだね。ヘラクレスオオカブト?

311 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 03:40:51 ]
後の兜本である。

312 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 22:40:44 ]
オライリーからHaskellの本が出るなんてありえない。
そう思っていた時期が僕にもありました

313 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 23:40:42 ]
2008/09
ちょおまw



314 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 08:14:01 ]
初心者用のスレで関数型の話をすると罵られる。なぜだろう。

316 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 12:30:55 ]
初心者には関数型が高尚すぎて理解できないからです。

317 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 22:36:35 ]
しつもんです
らむだけいさんってなんですか?



318 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 23:38:52 ]
世界遺産の一種です



319 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 23:44:40 ]
ttp://wwwfun.kurims.kyoto-u.ac.jp/MtLambda.html

320 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 05:32:31 ]
全部ひらがなだとぱっと見、人名かなんかかと思った。羅武田圭さんとか。

321 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 16:58:13 ]
俺がムラタだ

322 名前:36 ◆K0BqlCB3.k mailto:sage [2008/07/11(金) 01:58:31 ]
hackage.haskell.org/trac/ghc/wiki/DataParallel/WorkPlan
とっとと仕事しろやボケ

323 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 09:38:42 ]
まあ遅延評価だから

324 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 10:04:21 ]
等無駄計算

325 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 16:03:12 ]
>>322
なにエラソーに言ってんだよ。しょーもない評論家なくせして。

326 名前:デフォルトの名無しさん mailto:sage [2008/07/19(土) 00:59:56 ]
名村啓?

327 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 23:31:18 ]
do記法で

'aとか''aとか出てきますが
どのような意味なのでしょうか



328 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 01:16:27 ]
>>327
具体的なコード書いてみて

329 名前:デフォルトの名無しさん [2008/07/21(月) 15:09:50 ]
>>327
a'とかa''じゃなくて?
ちなみにそれならただの変数名だよ。

330 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 15:13:03 ]
>>329
見直したらそうでした
許してくださいw
ごめんなさい

331 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 23:32:45 ]
\_ -> k

この\_ってC++のtemplate <t>みたいなもんですか?

332 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 23:38:07 ]
全然違います

333 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 23:43:54 ]
>>332
じゃあ何なのでしょうか?

334 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 23:55:35 ]
ttp://www.codelogy.org/archives/2008/04/haskell_4.html
ていうかなんか一冊入門書買うことをおすすめする

335 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 01:00:32 ]
なんか夏まっさかりって感じ?


336 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 01:40:52 ]
質問の仕方スレもいるな
Haskellでぐぐっていくつか読めばわかるぐらいのことで
これって型でしょ
違います
じゃあなんなんだよ
つ やさしいHaskell入門


337 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 19:44:30 ]
おい、おまえらの仲間が「初心者のための〜」スレで暴れてるから早く回収してくれ



338 名前:デフォルトの名無しさん mailto:sage [2008/07/26(土) 20:22:33 ]
狂犬に噛まれて狂犬が増えるって
怖くね?

339 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 01:34:24 ]
あれは仲間じゃない


340 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 02:01:40 ]
そもそもスレタイからして興味ない話だし。
向こうで完結して。

341 名前:36 ◆K0BqlCB3.k mailto:sage [2008/07/27(日) 02:23:52 ]
さて、この夏、何かおもしろいことでもしようかな。

342 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 10:47:30 ]
お前らの中にアホがいます
他のスレを荒らすならここを荒らしますよ?

343 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 12:10:53 ]
>>342
ほー、やってみてください。本当にできるのですか?

344 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 13:11:28 ]
夏厨誕生物語

A 「この夏、何かおもしろいことでもしようかな。」
B 「ならスレ荒らししてみれば?」
A 「簡単にできるのですか?」
B 「こうやれば邯鄲」
A 「ネ申キター!d!マジ面白いね。他スレ荒らしてクルーwktk」

345 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 05:48:39 ]
注目ワード“高階プログラミング”って何だ?
ttp://ascii.jp/elem/000/000/157/157495/

346 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 06:00:24 ]
>>345
面白かった。サンクス。

347 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 19:32:59 ]
仕事でHaskellできるなんて羨ましいなぁ。



348 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 20:30:02 ]
>>345
nobsunだね。

349 名前:デフォルトの名無しさん [2008/08/06(水) 20:47:23 ]
ハイカラなシャツ着てる

350 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 22:06:03 ]
この会社ってホームページ見た感じ普通のSI会社に見えるけど、
山下さんなんかがいるってことは特殊な会社?

Haskellの開発コンサルということだけど、一般企業の業務システム
なんかを対象にしてるのかな。金融系とか合ってそうだけど、
普通の土方システムには豚に真珠かな。

351 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 22:30:36 ]
>>350
看板役みたいなものだよ。
よくあること。
SRAでも青木淳みたいなのを雇っているけど、青木は普通の仕事はしていないね。
金にならないことを自由にやっているって感じ。
ちなみに、青木の部下はかわいい女の子限定。

352 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 05:56:03 ]
まあ、天才ならなんでも許されるってことだ。

353 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 07:30:34 ]
>>351
青木はSRAやめたよ

354 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 08:39:56 ]
>>345 nobsunのコードは以前からスゲーと思ってたけど、こんな会社のこんな人なんだ。知らなかった。
会社の事業だけ見ると、Haskell関係なさそうだね。Higher Order Programmingってなんだ?造語か?
もっと記事をよく見てみる。

355 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 08:55:02 ]
>>354
ちょ、おまwww

356 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 09:12:13 ]
Higher Order Programming: プログラミングを丸投げするためのプログラムを書くこと


357 名前:デフォルトの名無しさん [2008/08/07(木) 09:45:57 ]
継続ベースのWebフレームワークってHaskellにもありますでしょうか。



358 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 12:53:37 ]
>>350
あそこって、gaucheかんけいなひとがおおそうなんだけど。

359 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 12:58:00 ]
>>358
そりゃそうだ。普通のJaverやC++マが金を取ってこなきゃ、
みんなgaucheとかに走ったら誰が食い扶持を稼ぐんだって。

360 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 13:19:40 ]
二等兵には二等兵の仕事があるわな。

361 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 13:46:18 ]
むしろ、パンダと飼育員。


362 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 13:54:11 ]
俺はまだ士官候補訓練兵だ

363 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 16:12:52 ]
あの写真を見て
小野伸二を思い出したんだけど。nobsunはやっぱり天才なんですかね。

364 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 19:03:09 ]
俺は山田ルイ53世を思い出した。すまん>nobsun
ルネッサ〜ンス!

365 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 19:05:14 ]
あの芸人、この前番組内であからさまにいじめられてたぞ。
最近テレビの前で普通にいじめる先輩芸人が多くないか?

366 名前:デフォルトの名無しさん [2008/08/07(木) 19:55:17 ]
そんなことより「Real World Haskell」の発売が10月に延びてる・・・

367 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 20:41:53 ]
book.realworldhaskell.org/beta/

にある最終章、「A concurrent RESTful web application」が読みたいんだけど、
これは本買わないとダメってこと?



368 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 21:15:32 ]
最近少しずつ読み進めていたんだが
そうか、本になるのか…買おうかな>RealWorldHaskell

369 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 23:21:20 ]
RealWorldHaskellってHaskellの批判本なのに
なんでみんな買うの?

こんなにHaskellって腐ってます
ゴミですって随所に書かれているのにw

370 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 23:24:06 ]
買おうかなと言ったのが一人いるだけなわけだが
脳内カウンターが回りまくりですかな

371 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 00:09:00 ]
ん?批判本なんだ?

372 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 00:12:48 ]
そう思っている人がいるかどうかは定かではないですが、
そう書き込んだ人間が一名いるようです。
また、買おうかなと書き込むことと買うことは別です。
プログラマたる者、このくらいの論理性は持って欲しいです。
部分と全体を混同するなんて、継承に毒されすぎです。

373 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 02:02:00 ]
>>372
論理じゃなくて、揚げ足取りっていいませんか?
買おうかなと書き込んだということは、買う意思が比較的強いということでしょう。
0か1かじゃないんですよ。
物事は確率的なのです。

374 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 02:42:06 ]
>>373
> 買おうかなと書き込んだということは、買う意思が比較的強いということでしょう。

著作権者や出版社勤務者が宣伝のために書いたかも知れませんよ

375 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 02:42:51 ]
>>374
そういう可能性もある。
確率の問題。

376 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 02:50:39 ]
>>369
ソース

>>370
君が一人しか見てないだけ

377 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 03:22:29 ]
なんとなくpractical common lispのhaskell版と言う印象なんだけどな。
オレイリーから関数型言語ぼんが出るのは初めてじゃ内科?
国内ではgauche本があるがね。


379 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 03:42:03 ]
フランスではocamlの本が出てた

380 名前:デフォルトの名無しさん [2008/08/08(金) 11:58:00 ]
washって継続ベースなの?

381 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 14:34:11 ]
>>379マジだ
ttp://www.amazon.fr/dp/2841771210/
フランスでは流行ってるんだな


382 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 14:42:46 ]
感覚的には日本のRubyと同じ感じじゃないすかね。

383 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 16:16:02 ]
>>381
いつの本の話してんだか。
この本の和訳プロジェクトはつぶれたね。


384 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 19:15:39 ]
>>382
全然違う。Rubyは世界的にPythonを急追している。

385 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 23:55:14 ]
急追して、、いたけど結局ダメだった、というのが現在のところだよ
俺も1.9がちゃんとしたモノになるまではrubyは使うべきではないと思う。

386 名前:デフォルトの名無しさん [2008/08/08(金) 23:59:16 ]
そうか?
そもそも本当に10月に発売できるか分からんぞ。

387 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 00:21:55 ]
コレすでに3回発売日伸びてる
年内出れば御の字



388 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 04:23:59 ]
>>384
世界的にみても、わかって言語を選んでいる人よりも
バズワード追ってるだけの人のほうが多いからね。

390 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 06:09:31 ]
Haskellって本当にLLって言っていいのかな。
基本コンパイラだし、インタプリタも軽量とは言い堅いし。。。

391 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 06:13:31 ]
LLじゃないだろw

392 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 08:06:03 ]
> 基本コンパイラだし
GHCばかり取り上げられてHugs涙目

393 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 08:07:11 ]
>>392
そんなあなたをはぐはぐ。w あーっ!ではないよ。

394 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 08:22:00 ]
初心者なんですが、Haskellが型については静的であることを選択した
理由って何かあるんでしょうか。純粋であることや遅延評価が、静的
型やコンパイル時の最適化を要請するということなんでしょうか?

395 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 08:27:55 ]
GHCはHaskell解釈系ランキング第一位!

「やっぱりGHCだね」

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

遅延評価なのはコンパイル時の最適化にプラスなのかなぁ?
これは理論的に停止できる関数は必ず停止できるっていう、
これまたある種の安全性?が主な目的だと思うけど
( if true (answer foo) (nonStop baa) ) みたいな文を考えよう(Haskellの文法忘れたから適当)。

397 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 10:14:15 ]
別に"動的型付け-純粋-非正格-インタプリタ型"の関数型言語もあり得るよな
効率はどうなんだろう、"動的型付け-正格"の言語よりさらに遅いことは想像が付くが



398 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 10:28:23 ]
>>394
Goferがそうだったから。
で、なんでGoferがそうだったのかというと、Mirandaがそうだったから。


399 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 10:37:45 ]
>>396
遅延評価は最適化にマイナスだよ。少なくともメモリ空間の最適化には全く向かない。

400 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 10:44:26 ]
遅延評価なんて
今日はやらない

401 名前:396 mailto:sage [2008/08/09(土) 10:50:37 ]
>>399
そうだよね。
コンパイル技術がすげー発達して高速になれば、話は変わるだろうけど。
(まぁ、コンパイル技術が「すげー発達」すれば、どのコンパイル言語でもマシン語と同じスピードが出るんだから、意味ない話)

あと「理論的に停止できる関数は必ず停止できる」は意味不明だとか、
文じゃなくて式だとか、気づいたけど後の祭り、いわゆるアポステオリorz

402 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 11:02:51 ]
>>395
Guarded Horn Clauses

403 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 11:31:02 ]
手続き型言語は、ノイマン型計算機を抽象化することで生まれてきたので、
評価方式としては、式、文の逐次的解釈が当然になる。

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

効率がどうのこうのというより、
新しいプログラミングパラダイムを産み出したので、
(例えば無限リスト、無限木の積極的利用)
研究され続けているんだと思う。


404 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 11:32:55 ]
>>402
GLOBAL HONORED CROWN www.noah.co.jp/ghc.php

405 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 11:37:31 ]
関数型とか意味がない言語だと思うけどねぇ
何ができるってわけでもないし
HaskellでWindowsは作れないしLinuxも作れない
Webサーバも作れないしDBも作れない
意味がない

406 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/09(土) 11:44:54 ]
>>405
www.thenewsh.com/~hws/

407 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/09(土) 11:45:52 ]
ごめん、今からインディージョーンズ見に行くから急いでるから!



408 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 11:47:37 ]
まあ普通はモデルを現実に合わせるよな。
代入だらけのプログラムをSSAとかいう形式に変換するとか。

409 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 11:48:09 ]
>>394
純粋関数型言語・遅延評価で、
型なし・インタプリタ言語ってあるよ。

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

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

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

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

動的型っていうのは、関数の世界では「型無し」ってことになると思うんだけど、
いずれにせよアドホックなエラー処理が必要になって、
純粋関数型的にアドホックなエラー処理というのは少なくとも美しくない。

410 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 12:17:29 ]
>>409
遅延評価でインタプリタ。破壊的関数が作れないというものなら、R言語くらいしか知らない。

411 名前:394 mailto:sage [2008/08/09(土) 12:56:14 ]
皆さんレスありがとうございます。

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

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

>>409
純粋関数型であること(参照透明であること)と動的型が食い合わせ
悪いというのがちょっと分かりませんでした。動的型は実行時不具合
の問題が付きものと思うのですが、参照透明との関係をよろしければ
少し詳しく教えていただけマスでしょうか。

412 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 13:08:18 ]
そもそも関数型言語に意味が無い

413 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 13:13:08 ]
>>411
動的型を使うと、アドホックなエラー処理が必要になるよね?
っていうか、それがないと動的型を使ううまみがないと思うんだけど。

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

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

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

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


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

僕が考えているのは、そんな感じ。

414 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 13:17:44 ]
上っ面を語り合って自己満足か
Haskellに多いやつらの典型だなw

415 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 13:18:59 ]
グリーンスパンの第10法則が発動すると、どんな言語で書こうと
動的でマルチパラダイムな言語で書いたのと同じになる。

416 名前:394 mailto:sage [2008/08/09(土) 13:33:07 ]
>>413
なるほど、理解しました。ありがとうございます。

417 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 13:50:48 ]
>>405
せいぜい生きる力を養ってください



418 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 13:54:52 ]
>>416
implementationの本を読むといいよ
Peyton Jonesのがpdfで読めるはず

419 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 14:11:34 ]
>>418
俺はPJのが好きだな。
静的型付けとグラフ簡約が運命的な出会いであることがわかった。

420 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 14:19:55 ]
>>413
なんか議論が無茶苦茶じゃないか?
例えば「型エラー」を「0除算エラー」に置き換えても論理展開が変わらん

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

それから、GHCではerrorやundefinedで発生したエラーをIOモナド上で捕捉できる。念のため

421 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 14:26:59 ]
だな。Haskellの例外処理で不足があることはそうそうないと思う。
あと、動的型のメリットを例外処理だけに限定するのは視野が狭すぎる。
LISPのメリットはアドホックな例外処理か?そうじゃないと思う。

422 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 14:39:32 ]
>>420-421
納得できないのなら、それで良いです。
僕も、べつにそんなに優れた論拠だと思ってないから。

423 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 14:55:35 ]
俺も>>413はひどい文章で内容もないと思う。
>>416が理解したのが驚愕。

424 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 15:20:10 ]
本当だ、マジで何言ってるのかわからん
すげえ

425 名前:394 mailto:sage [2008/08/09(土) 15:22:47 ]
動的型のメリットは型を単に書かなくて済むことだとは思えないんですが。

それだけであれば、コンパイルで発見する不具合をテスト時に見つけよう
とする、つまり面倒なことを後回しにしてるだけ、ってことになりませんか?


426 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 15:23:15 ]
別に動けばいい

427 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 15:30:45 ]
何でも指せるポインタってのはメチャ便利なんですよ。
S式なんて最たるもので、静的な型付けは不能あるいはワイルドカード的。
静的か動的かはトレードオフの問題。




428 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 15:42:04 ]
>>425
不具合を見つけるタイミングが遅くなるという対価を払って、記述の利便性および変更の容易さという報酬を得る
ちゃんと取引として成立してるじゃないか

もちろん「型を書かなくて済む」こと以外にも利点はある
特定の静的型付け言語ではそもそも型を付けられないようなコードが許容されるとか

429 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 17:38:51 ]
>>425
lispを使ってる限りの印象だが
都合のよい所だけ型宣言が出来るというのは柔軟性につながるかな。
プログラムの最適の仕方も静的/動的で違いがあると思うよ。
型なんで考えずにアルゴリズムだけ作っちゃえができるからね。
それでも型を意識したプログラミングをすることはあるが。
でも、haskellでもポリモつかえばある程度型無視ラピッドプログラミング
は可能じゃないか?

430 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 17:41:42 ]
じゃあOCamlでいいじゃん

431 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 17:44:14 ]
>>430
haskellって参照透明性ってかなりのメリットだと思ってるけど。


432 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 17:49:41 ]
注意してかけばいいだけの話
Hashkellはメリットを殺すデメリットしかないだろ

433 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 17:56:37 ]
正直、exists型が標準になれば動的型付けは不要じゃね?
en.wikibooks.org/wiki/Haskell/Existentially_quantified_types

434 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 17:57:26 ]
>>430
OCamlはstrictだから。残念。

435 名前:394 mailto:sage [2008/08/09(土) 19:55:26 ]
>>428
コンパイル時に問題が抽出されることと、テストによって抽出されるのでは
質的な違いがあるんじゃないですか?テストは結局は人間がやるものだし、
不具合の可能性を低めるということにしかならないけど、コンパイルでの
不具合検査は対象となるプログラムの論理的正しさを証明していることに
なるかと思います。

容易に変更ができたとして、不具合がどこに潜んでいるのか分かりにくい
というのは非常に問題あると思いますよ。コンパイルで分かるのならば、
これは明白でしかも機械的に全てが晒されますから安心です。

436 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 20:20:59 ]
Rubyは危険だしセキュリティリスクしか
そんざいしないしな

437 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 20:23:09 ]
>>435
確かに、バグがどの段階で発見されるかには質的な違いがある
でも、静的な型検査だって全てのバグを検出できる訳じゃないから、
結局、動的検査との安全性の違いは程度問題

その上で、静的な型検査の利点がコストを上回るという判断は当然ありえるし、
そう判断したなら静的型言語を使えばいい



438 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 20:28:12 ]
>>435
静的型チェック馬鹿ですやん

439 名前:394 mailto:sage [2008/08/09(土) 20:39:50 ]
>>437
例えば、参照透明ということについてはどうでしょうか?こちらも、副作用を許容
すれば、プログラム中に登場する変数の中身が何に変異しているかどうかが
分からなくなり、実行してみないと問題が検出できない、ということになります。

参照透明を強要するのも、型を強要するのも、結局その辺がクリアできない
プログラマというのはそれらに関連する不具合を出してしまうんだと思いますが
どうでしょうか。気をつければいい、というのは簡単で規模が小さなシステムでは
言えることで、そうでなければ膨大なテスト工程が必要になってしまうのでは?

440 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 20:46:48 ]
OCamlが参照透明じゃないから嫌ってどういう事を言ってるの?
refとかで破壊的な変数が作れるから嫌とかそういうレベルの話じゃないよね。

それだったらref使わなければいいだけだから。
逆に、Haskellの参照透明で良い所ってどのへんなの?
OCamlのでも、ErlangのでもなくHaskellの参照透明性が良い理由を説明してほしいんだが。

441 名前:394 mailto:sage [2008/08/09(土) 21:04:32 ]
>>440
参照透明でない、ということは値が望んだ通りの値であることを
保証するためにどこまでも神経質にテストをしなければならない、
ってことですよね。

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

Haskellに自分が惹かれている大きな理由の一つは、この辺の
頑固さを貫いていることですね。

442 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 21:19:02 ]
参照の透明性があれば、
それだけでテストが必要なくなるわけでも、
テストが簡単になるわけでもない。
そうなるのはトイプログラムだけ。

嘘だと思うなら、GHC, Hugsなどのバグトラックをみてみればいい。

443 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 21:21:51 ]
テストが減ることを数学的に証明してみせれ。

444 名前:437 mailto:sage [2008/08/09(土) 21:22:55 ]
>>439
何が言いたいのか良く分からん
俺は「気をつければいい」なんて一言も言ってないよ
>>428に書いたように、動的か静的かの間でトレードオフが成立すると言っているだけ

>>441
OCamlの変数は変更不可だよ
変更できるのは参照(ref)で、これは変数とは別物
だから、口約束するまでもなく変数の値が変わらないことは保証されてる

445 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 21:26:07 ]
>>440
参照透明性を壊さないと入出力できないのが嫌

446 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/09(土) 21:37:36 ]
>>443
数学的に無理だから、統計的に証明するわけですよ。
実際に〜〜でした、ってね。

ヒューマンインターフェース系の論文が参考になるんじゃないかな。
あっちは全部そんな感じ。

447 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 21:38:56 ]
>>441
Haskellでもやろうと思えばIORefとかで事実上破壊的な操作が可能になるわけですが、
これについてはどうお考えで?

「HaskellでIORefは使うな」っていうプログラミングルールを設定することは
「OCamlでref使うな」っていうルールを設定することと本質的に違わないと思うんだけど
それについてはどうなんすか。



448 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/09(土) 21:40:14 ]
インディージョーンズ、あれは予算が無いからあんなにちゃっちい水晶髑髏なのか?
どう見てもアクリル製のガワの中に反射板入れただけやん。
UFOとかエイリアンとか、考古学じゃなくてSFやん。
突っ込みどころ満載な映画でした。

かしこ

449 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 22:13:11 ]
monadとラムダの簡単な練習いっぱい
したいです。どこがいい問題集頂戴

450 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 22:23:39 ]
>>449
do記法を使わずにliftM、liftM2、joinを実装
Continuationモナドを実装

451 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/09(土) 23:30:03 ]
>>450
また何も考えずにそういうこと言う。

>>449
ja.doukaku.org/

452 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/09(土) 23:31:04 ]
英語が読めるなら
projecteuler.net/

453 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 05:05:51 ]
>>451
モナドとλの練習なら>>450はいい案じゃないか。
いっぱいじゃないけど質的にいい。

454 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 05:08:55 ]
そんなことが書きたいんじゃなかった。

>>419
PJのって何?本もpdfもPJのでしょ?

455 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 08:02:29 ]
PJは
Implementation of Functional Programming
Implementing Functional Languages,(D. Lesterと共著)
を書いていて両方公開。
www.haskell.org/haskellwiki/Books

456 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 08:05:37 ]
>>449
www.haskell.org/haskellwiki/Tutorials

457 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 13:23:16 ]
>>454
すまん、>>455のImplementing...のほうを言いたかった。



458 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/10(日) 13:39:12 ]
>>453
>>449は本当にモナドとラムダの練習のためだけに問題をほしがっているのかどうかってこと。
それに、初心者は何か目に見えて動かせるものを書きたがるものさ。
誰かに見られることを想定して書くのと、「動けばそれでいい」だけで書くのとでは、
やっぱり前者の方がいろいろ調べたりすることで勉強になる。

459 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 15:23:20 ]
>>455
そこ載ってなくね?w
research.microsoft.com/~simonpj/Papers/slpj-book-1987/index.htm
research.microsoft.com/~simonpj/Papers/pj-lester-book/

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

>>458
そうですね。

460 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 16:23:15 ]
載ってるよー

グラフ簡約と運命的な出会いというと遅延評価じゃないかね。
特にPJ的には。

461 名前:419 mailto:sage [2008/08/11(月) 14:41:51 ]
>>460
まあグラフ簡約は前提として、それを効率的に実装するには静的型付けがイイんだよ、
と、約20年前に読んだ時に思った。

462 名前:419 mailto:sage [2008/08/11(月) 14:44:37 ]
20年前じゃなくて15年前だった。かなり記憶が混乱してるな、俺 orz

463 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 16:05:22 ]
>>461
あまり理解できてなかったんじゃない?w

464 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 16:13:31 ]
>>463
かもしれない。
できれば君が読んでポイントだと思ったところを挙げてくれると皆の参考になると思う。

465 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 16:20:35 ]
PJの最初の本だと、
例え動的型チェックをやろうとも、そのコードは、
他の普通のコードと一緒でスーパー・コンビネータになって、
グラフ簡約されるだけだから、コンパイル時に型チェックを済ませることが、
スーパー・コンビネータのグラフ簡約上、特に有利だとは思えません。

466 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 17:39:55 ]
横から口はさんですまんが、静的型がついていたほうがパターンマッチが速くならね?

467 名前:デフォルトの名無しさん [2008/08/13(水) 09:02:33 ]
Haskellの継続ってSchemeとは違いありますか?



468 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 10:48:15 ]
call/cc のようなものはありません

469 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 14:58:55 ]
>>471
だとすると、smlのcall/ccを使ったco-routineみたいなことはできないということ?

473 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 22:46:51 ]
オラ本の執筆遅れてます
著者にプレッシャヨロ

476 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/13(水) 22:51:05 ]
どうせ買わないので暖かい目で見守るだけです。

477 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 23:21:14 ]
Schemeのcall/ccってその時点の継続を勝手にキャプチャして渡してくれる
んですよね?Haskellではそういうのは無いと思っていいんでしょうか?



478 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 00:04:58 ]
>>477
モナド無しでということなら無い。
そもそもcall/ccは副作用があるし。

479 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 13:47:21 ]
>>474ができると言ってるじゃないか

480 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 17:35:34 ]
あれはモナド有りでの話だよ。

481 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 18:53:40 ]
ごめん、>>479>>477へのレスね

482 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 18:54:49 ]
山本モナド

483 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 19:35:13 ]
Haskellはボブマリーの言語?
lethain.com/entry/2008/aug/14/global-popularity-of-programming-languages/

484 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 20:24:00 ]
コメント欄も読もうな

485 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 22:50:09 ]
ttp://profile.myspace.com/index.cfm?fuseaction=user.viewprofile&friendid=123319698

こうゆう落ちもある。

486 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 12:30:17 ]
Xmonad/Config archive - HaskellWiki
haskell.org/haskellwiki/Xmonad/Config_archive
の設定ファイル郡を理解できるぐらいまでHaskellについて知りたいんですが
どこから勉強すればいいんでしょう?
知識はXmonadやGhcをソースからインストールできる程度です

487 名前:デフォルトの名無しさん [2008/08/17(日) 13:44:52 ]
>>443 >>446 静的で強い型を持つ言語は、単純な実行時エラーを防ぐので
テストは軽減する。haskellなどはそのことが数学的に証明されているので
プログラマはぬるぽやoutofboundsなどの基本的な間違いにであうことなく、
本質だけを考えることができる。



488 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 14:23:37 ]
パターンマッチに失敗すること多くない?
たとえば「空でないリスト」型が欲しいとき、ぬるぽ的な実行時エラーを防げるの?

489 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 14:47:05 ]
ぬるぽは無いけどout_of_bounds発生させまくりですが
依存型のある言語なら防げるかも知れんけど

490 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 15:31:08 ]
>>487
おまえ初心者スレにいたHaskell信者だろ。

491 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 18:08:12 ]
はいはい両者リングアウト

492 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 18:14:59 ]
>>488
それヘボすぎ

493 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 18:26:58 ]
モナドがIOに使えるのは分かった。けどどうしてそれをIO以外にも使ってるの? >Haskell
誰か教えて下さい

494 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 18:36:20 ]
Maybe(笑)を証明するため

495 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 18:36:41 ]
便利だから

496 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 18:42:38 ]
どんな時に便利ですか?

497 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 18:59:33 ]
モナドのすべて
ttp://www.sampou.org/haskell/a-a-monads/html/
の以下の部分を読むとわかるかも

Maybe というモナド
ひとつの例
リストもモナド



498 名前:497 mailto:sage [2008/08/17(日) 19:11:05 ]
第 II 部:標準的モナドのカタログ
の各モナドの利用場面や動機を見るのもいいかもしれない

499 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 19:15:59 ]
一応リストモナドやMaybeモナドが計算に使える、というのは理解しているつもりですが、
便利だからという理由以外にモナドをIO以外に使う理由はあったりしますか?
それだけの理由で使うには扱いが難しくて、プログラムを組む度に頭がオーバーヒートしそうになる

慣れの問題かそれとも理解不足か・・

500 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 19:25:15 ]
>>489
そこでmaybeもなどですよ。

501 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 20:06:22 ]
モナドという抽象的な枠組みを考えることで
IO, Maybe, List, etcの計算の合成を統一的に扱えるってのが最大の利点なんではないかと。

単に使うだけなら主に慣れの問題だと思う。
いろんな例を見て慣れていけば少しずつ理解もできていくんではないかと。

502 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 20:09:49 ]
自分の作ったモナド上でdo式を書くと、世界の法則を書き換えてるような気分になってちょっと面白い

503 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 20:33:06 ]
>>501
レス有難うです
慣れの他に密度の問題もあるかもしれないと思ったり。
他の言語より1行あたりの密度が濃いものになりやすい気がする。
というか濃縮されすぎてわけが分からなくなりやすい気がする。

504 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 20:38:12 ]
>>501
計算を統一的に扱うだけであれば、普通の型クラスでいいんですよね?

モナドは値ではなくて型コンストラクタに対するクラスなので、ちょっと違う
と思うんですが。

505 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/17(日) 20:39:51 ]
モナドっていうと仰々しいイメージがあるかもしれないけど、
所詮はただの代数的データ型とそのデータ型に対して一貫性あるAPIのセットに過ぎないよ。
ところで、 データ型とAPIのセット のことをなんて呼べばいいの?

506 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 20:40:10 ]
Stateモナドとかの(s -> (a,s))みたいな変な定義が気持ち悪い
型クラス(b,s) -> (a,s)に型bを部分適用したって考えれば意味は通るけど……

507 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 21:08:43 ]
>>505
それが「型クラス」、ではないのでしょうか?MonadやFunctorはちょっと
毛色が違うという認識は勘違いでしょうか?



508 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 21:17:01 ]
www.hyuki.com/haskell/20041228215300

Ord、Eq、Show などの データ型とそのAPIのセット は「型クラス」
Functor、Monad、MonadPlus などの データ型の構築子とそのAPIのセット は「型構築子クラス」

509 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 21:31:22 ]
それ単にOrdとかの『類』は*で引数をとらないけど
Functorの『類』は*->*みたいに引数をとる、って違いにしか見えない
分けて考えるのはおかしいと思う

510 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 21:37:45 ]
>>509
型クラスと型構成子クラスじゃ抽象度が違うよ。

511 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 21:49:13 ]
俺も>>509みたいに感じるなあ
抽象度が違うのは理解できるが

512 名前:507 mailto:sage [2008/08/17(日) 21:58:16 ]
抽象度の違う型クラスを持つことで、値の計算遷移とは別レベルの
遷移を持つことが可能だ、という印象を持つんですけどどうなんでしょうか。

普通の計算を行う裏側で別の次元での計算が行われ、且つそれが
結合法則を満たしている、というのがモナドの定義と考えるのは
どうですか?自分は圏論などのこと全く無知なのでHaskellの構文
からの直感的な印象だけなんですけど。

513 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 21:59:06 ]
じゃあ類が*->*->*(関数(->)とかタプル(,)とか)に対する型クラスとかは
もっと抽象度が違うので別の名前が必要なのか?型構築子構築子クラスとか。
有名な人が書いてるから鵜呑みにしてるだけなんじゃないの?

514 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 22:31:24 ]
>>512
だいたいあってんじゃね?
見えてる部分で適当に処理を書いたら裏で適当に処理してくれる、
普通のプログラミング言語じゃfor文やif文みたいな処理構造、
あるいはマクロとして提供されるものと同等の処理ができるんだけど、
実態は単に型クラスでしかないので俺定義できるし、高階関数使えるし、表記もシンプルで、いろいろ小細工が利くのが利点。
たとえば、IOみたいにコンストラクタを隠したりすれば脱出不可な構造を作れるってわけ。

結合法則を満たしているってのは、まぁ別に特別なことじゃない。
EqやOrdにも反射律とか推移則とか守らないといけないルールがあるけど、
よっぽどのことがない限り変な実装はしないだろうから、一般のプログラミング言語ではそこまで突っ込まない
でもモナドって実態がよくわかんないから、ルールを明記してる。そんだけでしょう。

515 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 22:45:32 ]
念のため補足。
>処理構造(略)同等の処理ができるんだけど
普通の言語では処理構造のものが、モナドが利用されてる例としてはErrorモナドとかContinuationモナドとかがあったね。

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

個人的にはMonad則は、
値に関して順次実行できる何かで、値に対して何もしない処理もできる何かだ、というルールだと解釈してる。

516 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 22:50:03 ]
変な実装=全順序じゃない、と読み替えてくれ。
コンピュータのメモリ節約を考えれば生の浮動小数点型を使うのもまっとうな実装だわw

517 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 23:19:23 ]
ごめん、誤解を招くといやなのでもう一つ補足……
>値に関して順次実行できる何か
これは実行順序じゃなくて値の計算する方向を言ってるだけだよ。
g.f x がxにfを適用してgを適用するってのと同じことだよ。
実行順序は普通のモナドもIOモナドも方向は決まってないよ。



518 名前:初心者修業中 mailto:sage [2008/08/17(日) 23:37:55 ]
ん?
実行順序を明確にするのがIOモナドの目的の一つ
と認識していますが。

そういう意味ではないのかな…

519 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 23:41:24 ]
Haskellをみて日本のhaskellコミュって元気なの?
他の言語に比べて内と外をわけすぎるようなそんな印象をもってる。
なんでだろ?

520 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 00:02:55 ]
Maybeの特化にしか見えません

522 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/18(月) 00:25:49 ]
>>519
世界的に全く元気がありません。
ちょこっと変なライブラリを書いたと思えばそれっきり離れていっている人も多数。

523 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 03:17:18 ]
>>522
元気無い理由って何でしょうか。他に元気ある言語ってあるのかな。

525 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 04:14:24 ]
ruby

526 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 10:21:37 ]
「こういう奴」と書けばどんな奴を指してるのか分かってもらえると思ってるような、
想像力の貧しい奴がこのスレに多いような気がする

529 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 13:36:03 ]
末尾が「気がする」で終わってるレスは
全部気のせいのような気がする

530 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 15:08:49 ]
なんという自己言及レス

531 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 15:12:16 ]
関数型らしくて言いじゃないか

532 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 15:41:06 ]
>>531
つ座布団1枚

533 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 21:50:15 ]
* -> * -> * ってどんなとき使うの?

534 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 22:25:25 ]
アナルトレイン

535 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 07:45:46 ]
  ( ゚д゚)゚д゚)゚д゚)
  /  つ つ  つ
  (_(_  ノ ノ  ノ
  し∪ ∪ ∪

536 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 10:10:53 ]
>>505
> ところで、 データ型とAPIのセット のことをなんて呼べばいいの?

プログラミング言語一般での話なら「抽象データ型」でしょうね。

537 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 11:50:46 ]
>>533
関数(->)とかタプル(,)とか



538 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 20:24:46 ]
485でおま。
それでなのです。 >ときどきの雑記帖の中の人

539 名前:デフォルトの名無しさん mailto:sage [2008/08/21(木) 14:40:13 ]
Arrow は * -> * -> * のクラス
MonadTrans は (* -> *) -> * -> * のクラス

540 名前:デフォルトの名無しさん mailto:sage [2008/08/21(木) 21:20:37 ]
book.realworldhaskell.org/beta/

これの30章が消えてるんだけど・・・。

541 名前:デフォルトの名無しさん mailto:sage [2008/08/21(木) 22:05:29 ]
本買えよ

542 名前:デフォルトの名無しさん mailto:sage [2008/08/21(木) 23:26:23 ]
30章だけが読みたいんだよ。

ところで、HaskellでPetStoreってあるの?

543 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/21(木) 23:56:58 ]
>>542
横からすみませんが、
Pet Storeをよく知らないのでちょこっと検索したんですが、
これっていったい何が面白いんですか?

544 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 00:08:29 ]
>>543
面白くは無いんだけど、色んな言語やフレームワークで同じもの作る
ことで比較をするためのものでしょ。同じアプリがこんな感じで作れ
ちゃうぞ、という。


545 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 11:40:45 ]
Haskellでウェブアプリというとふつう本か

546 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/22(金) 12:37:40 ]
最近では新しい言語はWEBアプリが書きやすくないと人が入ってこないらしく、
ライトウェイト言語がブームみたいだね。
HaskellはライトウェイトではないからWEBアプリ向きとは全然思えないんだけど、
RubyでRubyOnRailsが考えられたみたいにHaskell独自のWEB向きキラーアプリが
出てこないとHaskellの人気はこれからもずっと平行線だと思うよ。

547 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 12:41:19 ]
>>546
WEBアプリが書きやすいっていうより、APIとかWEBコンテナが標準装備されてないとダメという感じがする。
Javaの功罪は大きい。



548 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 12:41:59 ]
まだ横ばいならたいしたもんだ

549 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 12:48:26 ]
>HaskellはライトウェイトではないからWEBアプリ向きとは全然思えないんだけど、
ライトウェイトって何?動的に型を付ければライトウェイト?
それとwebとどういう関係があるの?

550 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 13:05:36 ]
あまり考えずに気の向くままに書いてもあっさり動くのが
ライトウェイトってことじゃないか?
web案件は短期だったりアジャイルだったりでライトウェイトに
開発できるのが求められてるってのはある

551 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 13:10:45 ]
WEBアプリの開発者は、JavaかRubyのHowto本から入ってる。
だから、WEBアプリ開発者は、身体のどこかに、プログラミング言語のJavaかRubyに似てない部分に拒否反応を持ってる。

552 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 13:11:10 ]
ここでHaskellは人間の思考過程に最も近いから
考えが即座にコードにうつせるため開発期間が最短であると主張する人がどこからか登場
                    ↓

553 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 13:23:23 ]
                    |
                ( ゚д゚ )↓
                 (⊃⌒*⌒⊂)
                  /__ノ''''ヽ__)

554 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 13:27:58 ]
>>550
それならHaskellもライトウェイトで良くね?

555 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 14:05:36 ]
明示的なコンパイル作業が必要ないってのはLLの必要条件な気がする。

556 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 14:18:04 ]
LLとかWebアプリとか、
だから普及しないとか、
どうでもよくねえ?
好きな事、楽しい事すればいい。

557 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 14:22:47 ]
>>555
runghcがあるじゃないか
もうちょっと速ければと思うことはあるけど



558 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 14:34:05 ]
>>556
そういう立場も理解できるけど、俺は普及してほしい
ライブラリのメンテとか人が足りてないじゃん

559 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 14:46:33 ]
>>552
Prologには負けるんじゃない。

560 名前:36 ◆K0BqlCB3.k mailto:sage [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

561 名前:36 ◆K0BqlCB3.k mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 15:03:43 ]
LLでHaskell関係のプレゼンとかしてる人いるみたいだけど?

563 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 15:07:56 ]
WebアプリとLL(と呼ばれている言語)との間には全く関係はないけど、
Webアプリのかなり大部分は一般的にLLと呼ばれている言語で書かれているだろう。
そういう"LL"はテキスト処理がしやすいからってのがあるだろうな。
まあHaskellがそういう意味で人気にならなくても別にどうでもいいけど。

ここでmondic Parser Combinatorを持つHaskellが
最もテキスト処理に適した言語であると主張する人がどこからか登場。
                    ↓

564 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 15:38:43 ]
HaskellもLL言語だよ

565 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 15:45:06 ]
これどうなの?
ttp://happs.org/

566 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 16:09:31 ]
Parser Combinatorがあるからテキスト処理ならHaskell最強だろ。







満足した?

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

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

だから、無理にwebに擦り寄らずとも良いと思うんだけどね。むしろ、破壊的操作より安全性を
大切にされる金融などのところで目立つ存在になってくれたらいいんじゃないか?




568 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/22(金) 18:09:07 ]
>>567
もし金融などで使われることを想定するなら、
haskellの並列処理に関する部分も早く実装してほしいところですね。
(まだ未完成)

569 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 18:44:00 ]
某氏のhapps解説はお流れ?

>>567
> 破壊的操作がほとんどできない
なんで?

570 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 18:58:34 ]
なんでそんなにHaskellの応用分野を限定したがるんだw

>>567
コンパイルするならmod_haskellがあっても恩恵は小さいだろ
>破壊的操作がほとんどできないし
Haskellで入出力書いたことあるか?
>ファイル操作は基本的に苦手
これも良く分からん
flock使うのにわざわざライブラリを落としてこないといけないとか、そういうこと?

571 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 19:43:28 ]
ウイルス対策ソフトのように危機感を煽るのはいいが、
既存のシステムを補強するのではなく全部作り直せというのは、ちょっとね

572 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 19:54:17 ]
>>570
Prologを事務処理に使うと、住所や氏名情報などで爆発的にアトムが
発生し、Heap領域を埋め尽くして、GCが頻発するという事態となる。
もちろん数百万レコードを越える処理単位の話だが。
Haskellの場合この問題は起きないの?

573 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 20:37:03 ]
Webアプリが苦手ってことは無いと思うんだけどな。今後Webベースのアプリは
まだ増殖するだろうから、そっちで使いやすいフレームワークやDSLが出ないと
使う人は頭打ちだと俺も思う。

研究者の論文レベルのものも面白いだろうけど、上から下までHaskellベースで
かかれたWebアプリとかで目立つものが出てほしいよ、個人的には。

574 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 20:53:32 ]
>>572
アトムの爆発ってのはPrologスレで言及されてる現象のことでいい?
そもそもPrologのアトムってのが良く分からんので何が問題なのか理解できん
Lispのシンボルみたいな物と思っていいのかな
それなら相当するものはHaskellにはないよ

575 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 21:35:41 ]
>>574
Lispのシンボルみたいな物、ですね。
記号をどう処理しているのですか。

576 名前:デフォルトの名無しさん [2008/08/22(金) 21:53:05 ]
>>540
30章ってなんの章だったの?

577 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 22:12:26 ]
>>575
「記号」と言われてもいまいちピンと来ないんだが、何にせよ、
普通の手続き型言語が「記号」を処理するのと大差ない方法で処理してると思う

取り得る種類がコンパイル時に決まっているなら列挙型
そうでないなら整数とか文字列
文字列の比較のコストが問題になるなら自分でシンボルテーブルのようなものを用意する、とか



578 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 22:34:03 ]
>>576
>>310-314

579 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 09:45:26 ]
>>572
Prologでも、
1レコード512バイトをsub_atomで30項目に分解したり、更にsplitの
処理をしたりすると確かにアトムが大量発生するだろうが、
Stringとして読み込んで、終始String処理に徹すれば、アルファベットの
数、つまり高々数万のアトムで済むんじゃないの?
Stringすなわちリスト処理になると遅いから嫌なのかな。


580 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 10:00:27 ]
宣言的言語をリアルタイム処理に使いたくない病にかかってる。
資源が十分にあると理屈では分かっていても、終わったら電源切っても大丈夫な処理じゃないと拒否反応がでる。

581 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 10:09:14 ]
>>579
処理速度もあるかも知れませんが、アトムだと、
foo([株式会社|R],R).
と書けるところが、Stringだと
foo(List,R) :- append("株式会社",R,List).
と書かなくてはならないということがあります。
appendを高速化する機構が欲しくなりますね。


582 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 10:35:10 ]
それって代数的データ型を使ってこんな感じで良いんじゃない?

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

foo :: [Atom] -> [Atom]
foo (Kabushiki : r) = r


583 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 11:43:27 ]
Prologでまったり Part3
pc11.2ch.net/test/read.cgi/tech/1193354806/

584 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 12:43:04 ]
>>581
この話おかしいよ。
foo([株式会社|R],R). の方は、
すでに株式会社というアトムが切り出されていて、リストの構成要素になっている。
一方、
foo(List,R) :- append("株式会社",R,List). のListはString。ここは、
foo(["株式会社"|R],R).
でなきゃ、フェアじゃない。


585 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 13:58:45 ]
>>572
> Prologを事務処理に使うと、住所や氏名情報などで爆発的にアトムが発生し

第五世代コンピュータプロジェクトの成果を是非参照下さい。

586 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/23(土) 14:16:16 ]
>>585
よく知らないけどソフトウェア科学会会誌7月号に第五の話題が載っていたよ

587 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 14:21:10 ]
成果って、「prologって役立たずじゃん」という結論を得たこと?



588 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/23(土) 14:28:53 ]
>>587
それは短絡的な人たちの根拠のないうわさ。
第五は基礎研究なので企業の人たちが求めるような成果が出ないのは当たり前のこと。

589 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 14:31:33 ]
Prologの話は他でやってくれ
んで問題点を整理してまたいらっしゃい

590 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/23(土) 14:33:31 ]
詳しいことは忘れたけど、
述語論理による仕様記述を使った鉄道のプロジェクトが企業側で行われた例があったような。
なんだったっけ?

591 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 14:45:22 ]
Prologはどうでもいいのだが、Haskellで金融(とくに保険業)のアブリを
開発する場合、何か問題になる点はないのか。

592 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 14:54:20 ]
>>591
必要なメモリサイズを予測しにくい点とか。full lazyな処理系全般に言えると思うけど。

593 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 14:57:02 ]
金融系システムにHaskellを使うメリット自体が思いうかばん。
いいじゃん、Javaでつくるのが流行ならJavaで作らせれば。
どうせ枯れたシステムなんだから。

594 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 15:00:18 ]
>>592
full lazyな処理系って、よくわからない。

595 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/23(土) 15:11:43 ]
どんな言語で書いたとしても、必要なメモリの量は実際に動かしてみないとわからないよ。

596 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 15:17:46 ]
haskellっていいプロファイラあんの?

597 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 15:26:42 ]
>>595
COBOLなんかは確定してると思うけど。



598 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 15:42:16 ]
>>597
してない。
SORTなどに内部的に使う記憶容量が不明。

599 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 15:43:11 ]
Haskellのようにデフォルトで遅延評価する言語は、
計算をできるかぎり遅延させようとするから、
下手な書き方するとすぐメモリリークする

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

>>596
GHC付属のプロファイラは優秀だと思う

600 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/23(土) 15:47:59 ]
>>596
profオプションをつけてコンパイルしたらランタイムシステムにプロファイラが組み込まれるよ。
詳しくはマニュアルで。

601 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 16:19:23 ]
>>598
ん?確定はしてなくても最大どれかけかかるかは確定してるでしょ。
グラフ簡約のヒープ消費は予測もつかんぞ。

602 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 16:27:11 ]
>>601
確定してるのかしてないのかどっちだw

603 名前:初心者修業中 mailto:sage [2008/08/23(土) 16:37:52 ]
Haskellでメモリーリークが起きるのですか?

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

FFIを使った場合の事でしょうか…。

604 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 17:15:44 ]
>>599 の例としては↓の話かな。
d.hatena.ne.jp/desumasu/20060909/1157800884

この場合のメモリーリークは単なるメモリの解放忘れって事ではなくて、
期待した解放タイミングと実際のそれとのギャップの事みたいだね。

605 名前:初心者修業中 mailto:sage [2008/08/23(土) 17:42:49 ]
これも「メモリーリーク」と呼ぶのでしょうか?

*Main> foldr (+) 0 [0..1000000]
*** Exception: stack overflow


606 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 18:05:58 ]
プログラマが意図してないで、リファレンスが残るようなコーディングを
しちゃってる、というのをリークに含めることもある。

607 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 18:34:57 ]
>>605
それは「マヌケ」と呼びます。



608 名前:初心者修業中 mailto:sage [2008/08/23(土) 18:57:56 ]
stack overflowが発生する時、

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

と呼ぶという認識でよろしいでしょうか?

609 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 19:14:20 ]
リークってのは「漏れ」のこと。
GCのある言語だと、>>606しか起こり得ない。
>>605の「溢れ」とは全然違う。

610 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 19:20:46 ]
>>605
それはスタックオーバフロの例外であって、エラーとは違う。
メモリリークしているわけではないよ。

611 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 19:22:12 ]
C言語みたいに型があいまいな言語ではメモリリークが起こりうるが、
Haskellみたいに強い静的型付けされている言語にはメモリリークなんてありえないよー

612 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 19:26:56 ]
スタックオーバーフローとメモリーリークは
現象として全然違うと言う事ですね。
分かります。

613 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 19:53:14 ]
>599や>604が挙げているような例はC言語で
良く言われる「メモリーリーク」とは違う現象だな。

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

Cの場合はただの確保したメモリの解放し忘れ。
Cでも再帰的なメモリー確保をすれば
Haskellみたいな事も起きうるはずだが。

614 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 20:06:48 ]
>>611
強い静的型付けとメモリーリークの有無はほとんど関係がありません。
GCの方がずっと関係が深いです。


615 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 20:09:24 ]
Pascalのnewとfreeだっけ?
あれ考えれば分かるよな。
強い型付けでも簡単にメモリーリークは起きる。

616 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 20:56:45 ]
foldl でも stack overflow するんだよね。
Data.List.foldl' 使えばいいんだけど。

617 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 21:35:43 ]
なんで foldl でスタック溢れるの?末尾再帰が最適化されてないの?



618 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 21:48:31 ]
>>604のリンク先に書いてある
末尾再帰は最適化されるよ

619 名前:初心者修業中 mailto:sage [2008/08/23(土) 23:53:01 ]
>>617
遅延評価だからと認識しています。
↓参考
haskell.g.hatena.ne.jp/jmk/20060710/1152516465

620 名前:617 mailto:sage [2008/08/24(日) 00:40:37 ]
>>618-619
なるほど、非常によくわかりました。
(つーか前出のリンク読まずにレスして申し訳ない)

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

まあ seq 使うとか、回避の仕方がないわけじゃないからいいのかな?

621 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 00:54:46 ]
↓にも関連した話が載ってる。
itpro.nikkeibp.co.jp/article/COLUMN/20070403/267180/?P=2

622 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 13:10:00 ]
■■学校を作ろう!■■
VIP発でサイトを作ろうと思うんだ。(詳しくはWikiを見てくれ)
パートスレになるんでパー速(GEP)に移動している。
今スタッフを募集しているから、来てくれないか?

■Wiki
www36.atwiki.jp/vipvipschool/
■募集スタッフ
プログラム担当(特にErlang、Perl)
デザイナー(サイト上のアイコン、ロゴなど)
WEBデザイナー(サイトデザイン案に沿って、htmlやCSSを書ける)
他にも宣伝担当なども募集している。
■スレ
ex14.vip2ch.com/test/read.cgi/news4gep/1219068297/

623 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 16:41:26 ]
「特にErlang」…

実用性でいうとやっぱErlangなのかな…

624 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 18:20:21 ]
>623
大規模なWebサービスを構築するのに向いていると
考えたから企画者がErlangを採用したんだろうね。

625 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 09:10:25 ]
大規模な、ってのがクセ者で、
実情は単にDBのテーブルが大きいだけだったりするよな。
そもそもウェブアプリでDB以外どこが肥大化するよ?

626 名前:デフォルトの名無しさん [2008/08/25(月) 09:11:28 ]
画面?

627 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 09:20:29 ]
>>625
複数のwebサービスから情報集めたり、もしくはhttp以外のプロトコルで通信して情報を取得しなきゃいけなかったり、
別プロセスで並列キューに入れて処理しなきゃいけなかったり、システムそのものが大きくなるとこはあると思う。
それともデータサイズの規模に限定した話?



628 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 09:53:32 ]
>>625
とりあえずErlang + YAWSの事例くらいは、
念頭においてくれないと、話にならないのでは?

629 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 09:55:11 ]
>>627
> 複数のwebサービスから情報集めたり、

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

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

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

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

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

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

コード自体はほとんどCMS系フレームワークをユーザ定義コンテナを定義する程度で
用が済むことが多いと思います。特に、>>622のような、いかにもCMSっぽいシステムでは。

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

よいCMS系フレームワークを、
容易に開発できるかどうかって話をしているんだと思いますよ。

631 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 10:54:21 ]
>>630
なるほど、わかりました。
格納するコンテンツの量は結局DBのサイズの問題になると思うので、
それ以外の「大規模」の要因というと、
・同時接続数(パフォーマンス)
・登録ユーザー数
ぐらいでしょうか。
それとも単純にコードサイズを指して「大規模」という話なんでしょうかね。
「学校」というドメインが明確になっているので、
一般のCMSフレームワークほど汎用化は要求されないし、
どのような要因でコードサイズが「大規模」化するのか興味があります。

632 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 12:22:00 ]
>>624
Apacheとか使わずErlangでサーバー構築するんじゃないの?

633 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 12:26:39 ]
キッチンシンクアプローチか……

634 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 13:01:50 ]
Erlangをわざわざ使うということは、数百レベルの並列プロセスを
マルチコアで何とかしようと考えていると見て間違いない。
Webだとすれば、WebServer以外考え難い。生徒数千でほぼ
同時にアクセスがあるとか。

635 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 13:13:15 ]
しかし、>>622 はなんでErlangスレに書いてないんだ?w


636 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 13:16:41 ]
単に初期メンバーにErlang使いが居ただけなじゃいの?

637 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 13:16:52 ]
Erlangスレ見たことない方ですねw



638 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 13:42:02 ]
Erlangはどうでもいいんだけれど、
HaskellでもPerl使いを確保しておいて、単体の機能は専らCPANから取り出させて、
確保されているインターフェイスを介してHaskellで利用するというやり方は
多くなるんじゃないかな。短時間で開発する一手法としてね。

639 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 13:57:49 ]
ならないね。

640 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 14:13:29 ]
>>638 落日のPerlを使うかどうか。 規格書の通りに一からすべて開発するのは確かに大変だね。

641 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 00:29:58 ]
>>629
大規模になる要因なんていくらでもあるじゃん。
今時は単にUIがWebで、バックエンドが複雑化してるものも少なくないしね。
分散業務システムで多種類のプロセスを相手にすりゃ自然と規模は大きくなるかと。
何でもかんでもインターネット上でパブリックに利用可能な整理されたサービスばかりじゃないからね。
学校だって企業並みにシステムが複雑化してるとこもあるから、強ち単純とは言えないんじゃないかと。
まあ何はともあれ、ロジックが複雑になればなるほど、関数型の恩恵は大きくなるわな。

643 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 01:08:51 ]
といったって、googleも複雑なシステムとか言われてるけど、
googleを支える技術とか読んでもそんなに複雑とは思えないんだよなぁ。
台数は1台だけど自宅で似たようなことやってるもん。

644 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 08:11:38 ]
>>641
P のような再帰的な型のモナドを、
効率のために継続モナド(ReadP)で包むのは定石。
Haskell への慣れっていうより、
モナドや継続モナドへの慣れの問題な気がする。

P は問題によって様々だけど、
ReadP のとこは Control.Monad.Cont の
一般的な継続モナドと(型を除いて)同じなので、
それを理解しておくと問題に集中できていいかもよ。

645 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 08:13:32 ]
つ チラシの裏

646 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 08:21:08 ]
>>642
それはバックエンドで動いている他プロセスが複雑なのであって
ウェブアプリが複雑なわけではないのでは?

647 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 08:32:48 ]
>>625
機械翻訳とかではなくて?



648 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 18:52:43 ]
www.cs.chalmers.se/~augustss/AFP/monads.html でしょ

650 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 19:00:04 ]
>>649
そうです、でもこれだけ読んでもこれで何がしたいのか俺には正直よく分かりませんな。。
例がなくても理論だけ聞けば全て分かるタイプの人なら大丈夫なのかもしれませんが。

651 名前:デフォルトの名無しさん mailto:sage [2008/08/28(木) 06:47:20 ]
>>648
P みたいなのを継続ベースともいうけど、
ReadP を使うのは純粋に効率のためで、
そこに書いてあるのとは話が違うような。

652 名前:デフォルトの名無しさん mailto:sage [2008/08/28(木) 11:12:38 ]
> 純粋に効率のためで

そう単純化されても…

653 名前:デフォルトの名無しさん mailto:sage [2008/08/28(木) 14:48:42 ]
いや、単純だし…

654 名前:デフォルトの名無しさん mailto:sage [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で使える。
www.cs.chalmers.se/Cs/Grundutb/Kurser/afp/2006/Papers/parser-claessen.pdf
ここにも効率がって書いてあるけどどんな場合なのかさっぱりだ。。

655 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 14:13:46 ]
ReadPはdata宣言じゃなくてnewtype宣言だから、
記述上は包まれた形になってるけど、実装では包みが外れた形になる。

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

Pは直接的にはうまく束ねることができないから、一旦仮想的なReadPで束ねてるって感じ?

656 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 15:53:54 ]
>>655
どうもありがとうございます。

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

>Pは直接的にはうまく束ねることができないから
これってどういう意味で仰ったんですか?
P を束ねてパーサとして使うことも、実際できる(>>654のget'など)のでわざわざどうしてReadPにするのか、
Pの>>=が左結合的に作用するのが問題らしいんですけどそれが問題になる具体的なケースについて
私にはサッパリ思い付かなかったので先人たる皆様にお聞きしたかった次第です。


657 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 18:19:15 ]
>>657-661
とても分かりやすい解説どうもありがとうございます!
ちょっと解決の糸口がつかめた感じがします、これからじっくり考えてみたいと思います。
とてもご丁寧にありがとうございました。

流石だ。。。

663 名前:デフォルトの名無しさん mailto:sage [2008/08/30(土) 18:34:32 ]
Haskellが宣言型言語とか最初に言い出したのは誰なのかしら

664 名前:デフォルトの名無しさん mailto:sage [2008/08/30(土) 18:44:45 ]
imperative language ←→ declarative language の対比で
ごく自然発生的なものだと思うが?

665 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 00:07:29 ]
宣言型言語 = what(何をしたいか)を記述
手続き型言語 = how(どうやるか)を記述

クロージャをいかに早めに潰すかに苦心するHaskellは後者ですな

666 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 00:38:36 ]
>>665
宣言型言語=述語論理を記述

と思ったらHaskellも述語論理の仕様記述言語に非常に近い特徴を持っていることに気づく。

667 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 03:38:00 ]
>>665
> クロージャをいかに早めに潰すかに苦心
ってどういうこと?



668 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 09:45:13 ]
>>667
関数のインライン展開のようなものじゃないか
よく分からんが
関数リテラルなら展開しやすいが高階関数の戻り値のクロージャは展開しにくい気がする
だからどう書くか (how) を工夫する

人間が問題を「宣言」するだけでコンパイラが問題を解いてくれる
というのは
素朴な解決策は簡単に見つかるのだが最適化が難しい (が機械的にできる) 問題に限定されるはず

669 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 15:47:12 ]
計算資源が有限なため、howが分からないとwhatも記述できないという罠

670 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 15:59:09 ]
本質的には what -> how の書き換えと how -> how の最適化は似たようなもんだからな。
最適化は手続き型でもやってるから、非手続き型の人はwhatの部分を強調してみたりC/C++より速くなると言ってみたり。

LLの人は最適化にあまり拘らないし、テストさえ通ればhowを直接書いてもいいやって感じだけど。

671 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 17:18:22 ]
>>667
>>600前後の流れ参照
要するに未評価の式(これはクロージャで実装されてる)を溜め込まないように注意する必要がある

672 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 20:51:42 ]
しかし、そんなこと言ってたらprologだって宣言型と言えなくなるんじゃない?


673 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 21:42:38 ]
お前らは
人間の性格はA型B型O型AB型の4種類に分けることができる
とか思ってそうだよな。

674 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 23:36:24 ]
なんでも過不足なく分類できると思い込む愚かさ
血液型と性格をろくな検証なしに簡単に結びつけてしまう短絡さ
どっちをさしてるのか紛らわしいので例としては不適

675 名前:デフォルトの名無しさん mailto:sage [2008/09/01(月) 01:06:10 ]
>>674
おもしろおかしい

676 名前:デフォルトの名無しさん [2008/09/01(月) 07:57:32 ]
www.realworldhaskell.org/blog/2008/08/22/our-writing-is-now-complete/
書き終わったって。

677 名前:デフォルトの名無しさん mailto:sage [2008/09/01(月) 15:40:49 ]
zipで(ry



678 名前:デフォルトの名無しさん mailto:sage [2008/09/02(火) 14:15:50 ]
>>666
試しにZあたりの実行系でもつくってみればw

679 名前:デフォルトの名無しさん mailto:sage [2008/09/02(火) 17:56:25 ]
>>678
何が言いたいのははっきり言え。
小馬鹿にするだけでは情報価値ゼロだぞ。

680 名前:デフォルトの名無しさん mailto:sage [2008/09/03(水) 08:50:51 ]
述語論理なめんな、ってことじゃね?
せめてホーン論理に限定するとかじゃないと話にならんだろ。

681 名前:デフォルトの名無しさん [2008/09/03(水) 23:53:10 ]
関数とKleisli以外のメジャーなArrowってあるの?っていうかArrowって死滅したの?

682 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 00:04:13 ]
>>676
おお!でも英語疲れる。訳書出版の予定はないの?

683 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 01:25:52 ]
>>681
死滅しそうなのはHaskellだが、新しいHaskellのライブラリはほとんどArrowベースだよ。

684 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 11:41:24 ]
このスレって嘘多いよな。

685 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 12:00:02 ]
このスレって〜

ってレス多いよな。

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

ありえないです、低ランク大・・・
やっぱりランクの低い大学出身のやつは信用できない・・・

687 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 15:19:00 ]
そして増える意味不明なレス



688 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 15:20:04 ]
>>684
素人なのでどの変がうそなのか教えてください

689 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 15:45:52 ]
686みたいな奴がhaskellを使うとはとても思えんのだが、
何しに来てるのかね?

690 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 15:50:35 ]
>>689
Haskellがどういうものだと思っているんですか?

691 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 17:36:25 ]
>>686は今マルチされてるコピペ、スルー推奨です。

692 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 19:33:03 ]
>>690
全角数字を見るといらっとくる人が使う言語

693 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 19:35:16 ]
確かにイラっときた

694 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 21:21:38 ]
>>693
それはカルシウム不足

695 名前:デフォルトの名無しさん [2008/09/06(土) 23:15:53 ]
Haskellで良いコード綺麗なコードというのはどんなコードですかね。

出来るだけ変数使わない方がいいとか、何が何でもポイントフリーにするとか、
あるいはそれ以外でも、何でも。

696 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 23:55:28 ]
>>695
y f = f (y f)

697 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 00:05:33 ]
>>695
haskellでは数学的にきれいなコードが「きれいなコード」と呼ばれます。



698 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 00:12:32 ]
良いコード:
意味のあるところでControl.*を使う
悪いコード:
ポイントフリーのためにControl.ApplicativeやControl.Arrowをimport

699 名前:デフォルトの名無しさん [2008/09/07(日) 00:15:18 ]
っていうか、ポイントフリーってなにがいいの?せっかくパターンマッチがあるのに。

>>687
ライブラリはそうだろうけど、普通のアプリを書くときは?

700 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 00:33:20 ]
単純な場合には無駄に変数が増えず、シンプルに分かりやすくなるから良い。
複雑な場合には無理をしても分かりにくくなるだけだから悪い。
パターンマッチとは使いどころが違う。

701 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 00:34:19 ]
>>699
圧倒的に短く書けるからだよ。
それにポイントフリーだと関数の入出力の流れみたいなのがまっすぐ表せるから、処理の全貌が見通しやすい

702 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 00:41:52 ]
まっすぐだけど、流れが逆じゃん。
というわけで>>>使うのはやっぱダメ?逆なのに脳味噌合わせるべきなの?

703 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 00:46:48 ]
GUIアプリを書くときはどういうのが綺麗なんだ?

704 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 00:59:26 ]
>>702
逆なの? y = f x より x f = y が脳味噌に合ってるの?

705 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 01:12:53 ]
>>705
あ、前半がStringに戻してないのはご愛敬と言う事で、よろしく。

707 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 01:32:55 ]
>>705
String に戻さないといけないなら
filter ((10 <) . read) だろう。ラムダでもいいけど。
まあ、その辺はこだわるとこでもないかと。

> なんでやねん。
f (g x) と (f . g) x の向きは関係あるんですよ。
数学でも向き的事情から x^f という記法を使うこともある。



708 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 02:23:43 ]
>>702
左から右だろうが右から左だろうがどっちでも一緒だろ。
俺には違いが分からん。

709 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 02:27:05 ]
>>702
こういう反抗したい年頃のやつが言語を汚くしていくんだろうな。
なんでもないものを指差して「使いにくい」などと言ったり、まるでガキ。

710 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 03:31:39 ]
現代日本では横書き文字は左から右だから、
その方が自然に感じるのは当然と思います。

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

慣れの問題かもしれませんが、
そんなにおかしな意見とは思えません。

711 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 07:34:52 ]
まあ関数合成の向きが右から左なのは>>707の説明の通りだし、Haskellに限らず数学でも同じルールだからな。数学でも気持ち悪いって云う人は結構居るしまあそんなに変わった意見でもあるまい。

712 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 21:48:37 ]
社内コーディング規約でここにスペースを入れろとかそういうのよりは高尚が感じがするかもしれないけれど
所詮バイクシェッド
乱用すれば読みにくいし、パズルみたいにポイントフリーするのは間違ってる
数学的に綺麗綺麗とか、圏論的に自然とかというけれど、誰でも圏論がわかるわけじゃないし。

しかし、いかにポイントフリーで書くか、という事を考えると確かにおもろいよ

713 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 21:56:43 ]
亀だが

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

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

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



714 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 22:31:52 ]
s/HDL/VHDL/

715 名前:デフォルトの名無しさん mailto:sage [2008/09/08(月) 21:55:12 ]
>>713
ArrowっぽいHDL作りたいな

716 名前:デフォルトの名無しさん mailto:sage [2008/09/09(火) 18:48:21 ]
Real World Haskell
November 15, 2008

待ち遠しい。

717 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 22:50:22 ]
過度の並列化で複雑化するゲーム開発
コスト削減の鍵は純粋関数型言語らしい
www.watch.impress.co.jp/game/docs/20080911/epic.htm



718 名前:36 ◆K0BqlCB3.k mailto:sage [2008/09/12(金) 22:54:50 ]
>>717
そうだろうね。
俺はずううっと前からそう論文に書いてたけど。
だんだんpi-calculusの人気が出てきたね。

719 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 23:58:55 ]
> Sweeney氏は純粋関数型言語のもつ並列処理安全性に着目しており、
>将来的にゲームプログラミングはそういった処理系に移行していくべきだとした。
>Sweeney氏はそのひな形として言語“Haskel”を挙げているが、
>ゲーム開発のメインストリームたり得る言語はまだ登場しておらず、将来に期待しているという。

なんでHaskellは駄目なんだろう。
ライブラリ含めた開発環境の問題か処理系の最適化の問題か
それとも言語仕様レベルで本質的に向いていないのか。

720 名前:デフォルトの名無しさん [2008/09/13(土) 00:06:19 ]
前者じゃない?

721 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 00:09:07 ]
こんなことでもないと注目せんのだな

722 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 00:48:51 ]
遅延評価に漬かりまくりで、ダメなのでは?
遅延評価って言ってみれば、後ろからの逐次でそ?
無限リスト使えないHaskellってHaskell?

723 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 07:07:42 ]
LazyがいやならSMLやOCAML使えばいいだけ。何が不足よ?

724 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 08:23:12 ]
>>723
前方参照,where構文

725 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 09:32:44 ]
>>724
LETで何が不足よ?

726 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 10:42:16 ]
>>717,>>719からのコンテキストを読んでくれよ。

727 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 18:14:08 ]
質問です

たとえばJavaなどではクラスのインスタンスをオブジェクトと呼びますが、
Haskellの代数的データ型に格納されたデータのことをなんと呼べば良いですか?



728 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 18:21:45 ]
>>727
関数

729 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 19:00:09 ]
>>727
「オブジェクト」に対応する用語は普通は「値」でいいんじゃないか

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

data Point = Pt Int Int

x = Pt 0 3
-- xはPoint型の値
-- xのフィールドの値は0と3

730 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 20:26:27 ]
Haskellのプログラミングスタイルのことはなんて呼べばいいですか?
ストリーム指向?

731 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 20:30:20 ]
関数指向

732 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 23:55:40 ]
Haskell系のShellでオススメってある?

733 名前:36 ◆K0BqlCB3.k mailto:sage [2008/09/17(水) 00:00:30 ]
>>732
シェルって何のこと?
言語とは関係ないと思うけど。
シェルスクリプトのことを言っているの?

734 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:07:44 ]
>>733
HSHみたいなやつ

探してみた奴だとどれも開発止まってて…

735 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:09:07 ]
Haskell風構文のシェルっていくつかあるんだな、ググって初めて知ったわ

736 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:15:11 ]
Haskell系の自然言語でオススメってある?

737 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:22:13 ]
lojbanとか?
自然言語じゃないけど



738 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 15:52:29 ]
Yiとか使ってる人いるの?

739 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 17:56:30 ]
Yi って 彝 ?

740 名前:デフォルトの名無しさん [2008/09/17(水) 18:20:56 ]
ぅぃ?

741 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 18:31:27 ]
haskell.org/haskellwiki/Yi
使ったこと無いなぁ。

742 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 17:29:49 ]
ひょんなことからerlangを勉強し始めたが、構文はともかく、思想としては面白いな。
並行指向プログラミングというのかな?
このパラダイムはオブジェクト指向よりも現実志向のパラダイムのように思う。
Haskellでも並列化がうまくいけばerlangみたいな仕組みを実装できるかもしれない。

# erlangの構文は糞 糞 糞 糞杉

743 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 18:18:31 ]
ぅぃゅ

744 名前:デフォルトの名無しさん [2008/09/19(金) 20:28:25 ]
コンカレントハスケル?

745 名前:デフォルトの名無しさん [2008/09/19(金) 20:34:40 ]
ああ、コンカレントは並行だったか・・・

746 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 11:00:42 ]
>>743
私はProlog屋なので、erlangの構文のクソ部分に敏感でない。
お手数かけて恐縮だが、糞の部分を列挙していただけると有難いのだが。

747 名前:a36 ◆K0BqlCB3.k mailto:sage [2008/09/20(土) 12:04:07 ]
>>742
たぶん、その思想というのはpi-calculusのことかな。



748 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 13:08:03 ]
ここのみんなからするとgtk2hsって綺麗なの?

749 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 13:29:19 ]
Erlangってpi-calculusベースなのか

750 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 13:56:48 ]
>>746
743ではないけど、
receive...endとか、カリー化できないとかではないですか?

751 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 14:52:33 ]
>>723
元記事ではSTMが挙げられてるけど、OCamlだと無くね?

>>749
綺麗って何が?Gtk2Hsを使ったコード?
それならあまり綺麗じゃないんじゃない。
GUIを綺麗に書くためのハイレベルなライブラリは
いろいろあるけど、どれも決定打にはなってないような。

752 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 15:23:34 ]
>>751 >>749 じゃなくて >>748 ?

753 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 15:27:39 ]
>>752
>>748な俺からでもそれはわかる。


754 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 00:46:57 ]
gtk2hsと言えば、
gtk_rc_parse_string相当の関数や、
gtk_widget_modify_cursor(これは新しいからか)相当の関数が見付からなくて諦めたことがあります。。
いや私の検索能力が低いだけだと思うんですが、かなり頑張ってもどうしても見つかりませんでした。。。
皆さんgtkやpango、gdkの関数を捜すときってやっぱり根性ですか?
大抵はキャメルケースにすれば大丈夫ですがそうでない時はかなり困りますよねー。。

755 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 12:17:25 ]
いや、検索能力の問題じゃなくて、実際に無いんじゃない?
Gtk2Hsのソースgrepしてみて無かったら無いような。

756 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 08:20:06 ]
webで読んでるけどreal world haskell凄いヴォリュームだな
一週間やってもまだ終わらん
製本版はもう鈍器レベルだな


757 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 09:55:41 ]
なにか面白いこと書いてあった?



758 名前:a36 ◆K0BqlCB3.k mailto:sage [2008/09/22(月) 15:02:13 ]
これでしょ
book.realworldhaskell.org/read/

759 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 16:29:27 ]
url知らないって意味じゃなくて、自分では読む気が無いってことだよ。

760 名前:a36 ◆K0BqlCB3.k mailto:sage [2008/09/22(月) 16:37:06 ]
ぱっと見た感じでは、名前の通り実際にHaskellで開発する時に「背中に手が届く」本になってる感じ。
たとえばデータベースと通信する方法とか、
GUIを作るときのライブラリとかツールとかの紹介とか、
どちらかというと「Haskell逆引きクイックリファレンス」
みたいな感じだね。
目新しいことは何もないけど、逆引きリファレンスとしてはいろんなライブラリとか紹介されていて便利かな。

761 名前:a36 ◆K0BqlCB3.k mailto:sage [2008/09/22(月) 16:39:11 ]
いろいろサンプルコードも載ってるからわかりやすい。
文章の良よりコードの両方の方が多いから英語が苦手な人でもわかると思う。

762 名前:a36 ◆K0BqlCB3.k mailto:sage [2008/09/22(月) 16:39:49 ]
良 → 量
コードの両方 → コードの量

763 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 12:09:05 ]
>>763
Hugsを標準モードじゃなくて拡張モードで起動すればいい
hugs -98

765 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 12:51:18 ]
>>764
無事読み込めました。ありがとうございます

766 名前:デフォルトの名無しさん [2008/09/24(水) 15:23:46 ]
do構文で、変数の使用が強制されるのはなんとかならんの?
.とか$とかの気の利いたバージョンない?

767 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 15:27:56 ]
何を言ってるのかよく分からんが >>= とか?



768 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 15:36:59 ]
>>=だけですっきりいけるならdo構文使わないでしょ(ってこともないか?少なくとも俺は)。
do構文でモナドを「外す」ためだけに一時変数がやたら必要になるのがイヤって話。
つまるところ>>=になっちまいそうな気もするけど、
便利な演算子なり特殊なカッコなりで、無駄な変数使わずに何とかならんかなぁ、と。


769 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 16:11:24 ]
なにか具体例見せてくれ

770 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 16:44:57 ]
n <- m
a <- n

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

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

a <- join (join m)
とか。

773 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 16:53:15 ]
>>770,771,772
ありがとう。特にjoinは使った事なかった。
俺がアホでした。


775 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 16:56:54 ]
あれ?やっぱ違うや。求めてるのとjoin。いや、それはそれで勉強になったけど。

776 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 17:01:37 ]
というか、liftM3ですね。とりあえず釣って来ます。

777 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 17:21:21 ]
ちなみに、
do args <- getArgs
   cnt <- getContents
   return otherFunc args True cnt
だったら?



778 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 17:27:31 ]
>>773みたいな構文は俺も欲しい
このスレで前に同じことを書いた記憶がある
Template Haskellを使えばなんとかなるかな

>>777
liftM3 otherFunc getArgs (return True) getContents
不恰好だけど

779 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 18:18:11 ]
おおっ、あるのね。
俺の見る程度の範囲じゃ<*>とかはあんま見ないけど、そういえばapは見るな。
まあ、>>698とか見ると、>>778の書き方が普通は落とし所って所かも知れんけど、調べてみます。

781 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 23:58:13 ]
長くて貼れなかった部分(すみません)のログを見てみると
cygwinのフォルダにあるheaderファイルの発見に失敗しているようでした。

終電の時間が近いので、検索パスの追加をした所で今日は帰ります

783 名前:デフォルトの名無しさん [2008/09/25(木) 00:01:22 ]
仕事でハスケル使ってんの?

784 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:25:45 ]
言語設計学者の悲願の言語だけど、開発環境はまだ全然整備されていないから、ほぼ0

785 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 03:02:05 ]
学生だろ?

786 名前:デフォルトの名無しさん [2008/09/25(木) 03:18:09 ]
学生のうちから終電まで勉強してんのかよ。
そんなんじゃ社会に出てからもたんぞ。

787 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 03:51:42 ]
Schemeのcondみたいのはどう書くのがよいでしょうか?
case でマッチング無しガードのみにすればとりあえず出来るけど、dummyや_が冗長。
case dummy of
   _ | conditionA -> bar
     | conditionB -> foo
   otherwise -> baz




788 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 04:41:08 ]
そこだけ別函数にしちゃえば良いんじゃ?

789 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 12:37:19 ]
>>786
何という優しさ。

790 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 19:56:07 ]
こういうsyntax sugarが欲しいなあ。

data X = A | B | C | D

case x of
A | B -> 1
C | D -> 2

791 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 19:58:51 ]
確かに欲しい
でも縦線だとガードに見えるから別の記号が要るな

792 名前:781 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/09/26(金) 13:22:23 ]
>>790
そういう、かゆいところに手が届くのは、やっぱりLISP系最強なんだろうか。


794 名前:デフォルトの名無しさん mailto:sage [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 名前:初心者修業中 mailto:sage [2008/10/01(水) 23:29:57 ]
>>794
バイナリモードじゃないとダメなんじゃないでしょうか?
こんなのがありました

ttp://ha6.seikyou.ne.jp/home/yamanose/haskell/wave2.html

796 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 23:38:17 ]
>>795
ありがとうございます。
BinaryModeって付けないと駄目なのと、
あとPtrを経由してデータを取ってくるんですね。

これで勝つる!

797 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 00:03:06 ]
べつにPtrを経由しなくても>>794の方針でいけるよ
効率を気にするなら別だけど



798 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 00:27:22 ]
Ptrを経由しないとバイナリ表現のFloatから
HaskellのFloatを得る手段が難しいよ。
thread.gmane.org/gmane.comp.lang.haskell.cafe/44845/focus=44927

799 名前:初心者修業中 mailto:sage [2008/10/02(木) 00:56:54 ]
>>797
テキストモードの場合、、
control-ZをEOFと認識したり、CRLFを LFに変換すると
GHCのマニュアルにありますが、
問題ないのでしょうか?

800 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 09:32:32 ]
で、整数のendianはどうするとか色々とケチがついていくにしたがって、重くて遅いコードに変身していくわけだ。

803 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 13:03:52 ]
やっぱり>>800にはバグがあった
-  | sf == 255 = sign / 0
+  | ep == 255 = sign / 0

>>802
[Word8]からWord32を作って、そこからFloatにすればシステムのendiannessを気にする必要ないよ
この場合PtrやUArrayを経由するのでもencodeFloatでも良い

805 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 21:41:10 ]
QuickCheckすげー
盲目的なランダムテストだけじゃないのな

概念的には、(ieee754で表現される)外部フォーマットのデータを読んで、
ネイティブのFloatに変換して使いたいのか、
それともieee754データとしてそのまま扱いたいのかでやることが変わってくるな
実際にはどうせieee754を採用してるアーキテクチャでしか動かさないから、ショートカットが効くわけだけど



808 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 01:51:57 ]
QuickCheckってどうも使い方が解らない。
テストが元実装と結局ほとんど同じにならない?
元実装は仕様をすでに表してるわけで、その仕様にあってるか確認するコードは、
結局同じになるのは必然だと思うんだけど。
仕様から演繹出来る他の事を確認しろって事かな?
でも、演繹で導かれる事が、元仕様とは別の理由で成り立つ事もあるよね?


809 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 03:06:21 ]
>テストが元実装と結局ほとんど同じにならない?
ならない。>>805-806を見れば分かる通り

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

>でも、演繹で導かれる事が、元仕様とは別の理由で成り立つ事もあるよね?
もちろん
だれもテストで全ての誤りを発見できるとは思ってない

810 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 14:26:34 ]
あと、ランダムテストが有効な場合とそうでない場合があるよね。
>>805-806はあまりランダムである必要が無いかも。
きわどいケース(上の場合だと0、非正規化数、無限大、NaN)を
並べ上げにくい場合にランダムテストが有効な気がする。

811 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 14:35:10 ]
ああそうか、例えばソートの例の場合、
「正しくマージソート出来てるか」じゃなくて
「正しくソート出来てるか」のテストになるからか。

前者はQuickCheckに関わらず外部テストでは確かめようがないから、
「ソートする」じゃなくて「マージソートする」という仕様はソースレビューするしかないのか。

812 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 16:36:28 ]
単なる関数じゃあまり意味がなくて、
結果としてのアウトプットが特徴的で綺麗な性質を持ち、
かつ、その性質自体が目的である場合に威力を発揮するって感じか。
その類の物は、性能が競われる事が多い気がするから、その辺りのサポートもあると良いかも。

813 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 18:39:53 ]
うわ俺バカ丸出し。&nbsp;って書きたかった。

815 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:31:09 ]
datを直接見るようにすればnbspなんて使わなくてもインデントされるよ

816 名前:デフォルトの名無しさん mailto:sage [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 名前:初心者修業中 mailto:sage [2008/10/08(水) 15:33:21 ]
>>816
・runhaskell はHaskellのソースプログラムを実行するコマンド
・cabal はパッケージをインストールするコマンド
…と認識しています。

参考

ttp://haskell.g.hatena.ne.jp/illillli/20080224



818 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 23:08:47 ]
オラ本でねーぞコラ


819 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 00:31:08 ]
cabal なんてコマンドあるの?
あるとしたら runghc Setup と打つより楽だからじゃ?

820 名前:初心者修業中 mailto:sage [2008/10/09(木) 01:00:41 ]
>>819
参考

ttp://haskell.g.hatena.ne.jp/illillli/20080224
cabal-installというパッケージにcabalというユーティリティがあった。
パッケージのダウンロードからインストールまでを自動化してくれるようだ。

821 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 04:00:42 ]
今んとこ、RubyGemsを目指して整備中って事で、
最終的にSetup.hsはなくなるかオプショナルになってcabalコマンドに統一されるんじゃない?
page.freett.com/shelarcy/log/2007/diary_03.html#when_we_can_use_caball-install
hackage.haskell.org/trac/hackage/wiki/RubyGems

現時点でのそれら重複してるコマンドの詳細は判らないけど、installについては、
cabal install monadius
monadius
で遊べるってのは、Setup.hsでは無理だろう。


822 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 04:20:27 ]
>>821
RubyGemsなんて目指されると非常に困る。

823 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 12:13:24 ]
ん?どんな風に?

824 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 19:03:11 ]
>>824
length (concat taillist) == 0
の部分を
all null taillist
にでもすれば別に非効率的でもない気がする

俺ならtransposeを使うな
rot90 = transpose . reverse

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

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

というふうになっております。

827 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 19:39:20 ]
どうしてもrot90でtransposeを定義しなきゃいけないの?
そうでなくて単にtransposeが必要ってだけならその定義は捨てて
import Data.Listしてtransposeを使えば良いんじゃない?



828 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 19:45:38 ]
transposeって標準の関数ではないんですか?

829 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 19:53:59 ]
>>827

課題では、自分でtransposeを定義しろ、とのことでした。

830 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 20:20:13 ]
>>828
Prelude関数ではないのでData.Listをインポートしないと使えない。

>>829
だったら >>825 が最初に言ってる変更をするか、rot90を使わずにtransposeを定義すれば。

831 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/10/10(金) 07:01:54 ]
あ、any じゃ list == [] のときまずいという話もあるか。

834 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 00:49:41 ]
>>823
パッケージの管理方法にいろいろと問題がある。

835 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 01:26:24 ]
>>834
具体的に言ってくれよ。そして開発者達にも。

836 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 22:14:59 ]
・unsafeInterleaveIOを使う
・Data.Treeを使うのをやめて、明示的なIOを伴う木を定義して使う

好きな方を選んでくれ



838 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 22:22:13 ]
一応言っておくが、HaskellのIOは基本的に遅延しないし、普通はそれで正しい
IOは実行順が重要なことが多く、遅延させて順番をうやむやにすると厄介なことになりやすい
それだとどうしても不便というときのためにunsafeInterleaveIOがある

839 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 10:12:08 ]
f a b c の部分適用として f a b と書くことはできますが、(\a -> f a b c) にあたる部分適用を a を省略して書く方法はありますか?

840 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 11:26:17 ]
flip使え

841 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 17:56:42 ]
flip (flip f b) cはさすがに悪趣味だろ

842 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 19:45:59 ]
こんなのもありました。

(flip.(flip f)) b c

3引数flip
haskell.g.hatena.ne.jp/mr_konn/20061223/1166869265

845 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 19:54:21 ]
>>844>>841 の変形だね。
あと、内側の括弧は無くてもOK

846 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 21:45:30 ]
f # b c みたいな構文(# は未適用引数を表す)があったら便利だったかもね

847 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 23:03:15 ]
SRFI 26 みたいな?



848 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 23:47:19 ]
\x->f x b c

849 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 08:29:54 ]
>>848
>>839

850 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 11:19:22 ]
>>846
それだと
f # b c -- \a -> f a b cと同等

(f #) b c -- (\a -> f a) b cと同等
を区別する必要が出てきて面倒だな

851 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 13:03:16 ]
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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 11:50:00 ]
すげえ、読みやすいな

856 名前:デフォルトの名無しさん [2008/11/05(水) 07:40:02 ]
GHC 6.10.1リリースあげ

857 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 08:34:43 ]
((f.) . g) a b
みたいなテクニックが沢山載ってるようなページを教えてください



858 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 12:38:02 ]
>>858
unboxed tupleってやつだね。
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 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 14:29:51 ]
>>859
ありがとうございました
拡張構文なんですね

861 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 23:45:00 ]
weakリダクションって何?

862 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 00:23:23 ]
>>862
無理
Haskellの関数は文字通り関数なので、引数を放り込んで結果を観察する他に使い道は無い

864 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 00:43:20 ]
中間形式のグラフみたいなの見れないのん?

865 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 01:15:29 ]
中間形式のグラフって何?
グラフ簡約のことを言ってるのなら、グラフが作られるのは実行時だし、
要するに「未評価の式」を表してるだけだから、それを見ても>>862みたいなことをする助けにはならんよ

866 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 01:27:35 ]
少なくとも書こうとしてるプログラムの中からは見れない。
Haskellって厳格な言語で、その手の変なことは基本的にできないよ。
何をやりたいのか知らないけど、インタプリタ的なものを書いて、
それをライブラリとして使えば?

867 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 01:38:05 ]
ん、普通にMaybeとかそれ以前にListモナドとか使えば普通に実現出来るって云うかモナドのすべて読んだ方が良いと思うよ



868 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 02:16:43 ]
関数から引数への参照は、関数が展開されても複数の場所から同じ場所を参照するという話と、
先にグラフを作って、実行時に、そこにデータを流し込むような感じの説明があったから、
処理系をそのまま利用して、かなり高速なデータベースが作れると思ったんですけどダメですかね。

実現できればprologよりも表現能力が高いから面白そうだと思ったんですが。

869 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 03:27:38 ]
>関数から引数への参照は、関数が展開されても複数の場所から同じ場所を参照する
これはその通り

>先にグラフを作って、実行時に、そこにデータを流し込む
これはぜんぜん違う
多分どこかで誤読してると思う

870 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 11:40:05 ]
>>867
zs <- everything
append [1..100] [1..100] zs
こういうやり方じゃ生きてるうちに終わらないかもよ。
Listモナドは、もちろんユニフィケーションや制約伝播なんて無くて、
総当りで解を求めようとする非決定性計算ってだけなんで。

871 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 11:50:02 ]
yet another embedding of pure Prolog into Haskell
okmij.org/ftp/Prolog/Arithm/DefinitionTree.hs

いまいち使い方はわからんけど、ググったら見つかったので貼っておく。

872 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 20:48:35 ]
>>870
failや[]で枝狩り


873 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 00:44:22 ]
>>872
変数をどう表現して、何をどう枝刈るの?


874 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 08:25:24 ]
887 名前:デフォルトの名無しさん[] 投稿日:2008/11/22(土) 00:28:37
Real World Haskellは糞本だと思う

875 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 12:49:16 ]
出版されたの?

876 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 23:01:38 ]
出版されたかは知らないけど訳してる人がいる
ttp://d.hatena.ne.jp/mokehehe/20081124/rwh

877 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 23:27:23 ]
始まったばかりにしても、ひでえ訳



878 名前:デフォルトの名無しさん [2008/11/25(火) 23:41:58 ]
Real World Haskellって翻訳本が出ると思いますか?
マイナーな言語だけど、微妙にブームになってるし
来年ぐらいに出版されたりするかなあ?

879 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 23:48:26 ]
確かに一時期あったけど、とっくに沈静化したような…>ブーム

880 名前:a36 ◆K0BqlCB3.k mailto:sage [2008/11/25(火) 23:50:52 ]
>>879
最近は沈静化したように見せかけて、ジワジワきてるよ。
各大学の卒研レベルではHaskellやったりしてるところが増えてきてる。

881 名前:デフォルトの名無しさん [2008/11/26(水) 00:04:13 ]
うーん、訳の出来とは別になんか期待できなさそうな感じ


882 名前:a36 ◆K0BqlCB3.k mailto:sage [2008/11/26(水) 00:08:27 ]
原文自体平易な英文なので今後のことを考えるなら英文に慣れるために原文で読むことをお勧めします。

883 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 00:12:16 ]
まだ10章までしか読めてないけど
ふつケルの次くらいに読む分には悪くないと思う>RWH

タダだし

884 名前:デフォルトの名無しさん [2008/11/26(水) 00:17:39 ]
本買おうと思ったけど、WEBで読めるわけだし
翻訳本が出るまでそれですまそうかなw

885 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 00:19:34 ]
RWHクソだろ〜
11章からはページを増やすためにネタを書きましたって
レベルのオナねたのオンパレードだぞ

886 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 00:36:34 ]
RWHってネットでもう出回ってるんだなw

887 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 00:45:56 ]
出回ってるつーかあれを最近本にしたんでしょ?



888 名前:デフォルトの名無しさん [2008/11/26(水) 00:49:09 ]
存在型ってなんですか?

889 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 01:23:56 ]
バキシルとか大麻のことだ

890 名前:デフォルトの名無しさん [2008/11/26(水) 01:48:33 ]
ありがとうございます。

891 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 07:48:38 ]
>>888
Cardelli読め

892 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 13:02:02 ]
Haskell: The Craft of Functional Programming

Programming in Haskell
のどちらがお勧めですか?ふつけるの次くらい。

893 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 21:24:32 ]
>>884
下手糞な翻訳の恐れ大。最近多いね、いや昔からか

894 名前:デフォルトの名無しさん [2008/11/26(水) 22:52:49 ]
Programming in Haskellはいいよ。ふつけるの前でもいいです。

895 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 19:14:12 ]
>>892
自分はふつけるの後にCraftでした。というか、その間にSICPが
あるので、あんまり参考にならないかな。ふつける読んでも
ちょっとピンとこなかったんですね、よくまとまってるとは思うのですが。

自分は普通の文系プログラマで、関数型プログラミングの世界とは
無縁だったので、SICPをくぐる必要があったと感じてます。


896 名前:デフォルトの名無しさん [2008/11/27(木) 19:30:50 ]
Craftはいつ第3判が出るのですか?

897 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 19:55:34 ]
Craft第2版以降で目立ったHaskellの技法というと、Arrowぐらいでしょうか。

あとはReal Worldみたいな実用面を書いたものになりますかね。



898 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 20:02:06 ]
ガンズのニューアルバムが出るころに出版されるそうです。

899 名前:デフォルトの名無しさん mailto:sage [2008/11/28(金) 20:17:32 ]
それは出版されないってのとどう違うのだ

900 名前:デフォルトの名無しさん mailto:sage [2008/11/28(金) 22:32:12 ]
泳げる頃にh(ry

901 名前:デフォルトの名無しさん mailto:sage [2008/11/28(金) 23:59:30 ]
1版ならともかく3版なら別に出なくてもいいんじゃね

902 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 00:04:26 ]
Implementing Functional Languages: a tutorial

ってのをやってますが、練習問題の回答とかどっかに転がってますでしょうか。

903 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 11:25:49 ]
>>902
著者本人が公開してる。あとは自分で探せクズ。

904 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 11:27:36 ]
>>903
おめーがクズだろ
この引きこもりw

905 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 21:15:40 ]
自演乙

906 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 22:05:13 ]
Haskellで書かれた数式処理ソフトがあると聞いたのですが
maximaと比べると
言語から直接利用するときの利用しやすさは、どんな感じなのでしょうか?

907 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 09:20:37 ]
PJの答を探しているクズ、どこのゼミ生かしらんが、これで次の輪講はアウトだなwww



908 名前:902 mailto:sage [2008/11/30(日) 09:56:28 ]
>>907
自分では探してみましたが、部分的なコードだけしか見つけられませんでした。

ちなみに、自分は学生ではないんです。輪読の場があったりしたら入りたい
ですけど、ちょっと今は時間的に厳しいかな。ネットでやってたりするといいん
ですが。

909 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 16:00:41 ]
探すもなにも、入手方法ちゃんと書いてあるじゃんwww

910 名前:デフォルトの名無しさん [2008/11/30(日) 21:28:44 ]
>>896
2021年4月19日に出るみたいです。
まだ相当先ですね。

911 名前:デフォルトの名無しさん mailto:sage [2008/12/01(月) 20:25:35 ]
どんどん延期してると思ったら
今度はありえないくらいに延ばしたな・・・

912 名前:デフォルトの名無しさん [2008/12/07(日) 12:54:19 ]
ghci の補完って windows じゃ効かないんですかね。
Linux 上だとちゃんと動いて便利だったのでショックです。

ネット探してみると rlwrap 使えとかあったけど
rlwrap って動的な補完(スコープ内の関数一覧等)
って可能なんでしょうか。

913 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 13:54:21 ]
そんな高度な補完はemacsのinferior-haskellとかeclipseの拡張でもできるかどうか怪しいな

914 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 13:56:28 ]
英語配列30g早く!

915 名前:902 mailto:sage [2008/12/07(日) 20:05:48 ]
>>909
書いてありました。これって個人でも送ってくれるのでしょうかね。

ただ、まだ半分ぐらいなんですけど、問題簡単なので別に解答不要
になりそうです。ありがとうございました。

916 名前:デフォルトの名無しさん mailto:sage [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"))
なんですかね?

右結合的になったり匿名関数に変換されたりと難しいです

917 名前:a36 ◆K0BqlCB3.k mailto:sage [2008/12/13(土) 19:06:24 ]
>>916
一緒です。
でも
putStr "a\n">>putStr "b\n">>putStr "c\n"
と書いた方がきれいですよ。



918 名前:a36 ◆K0BqlCB3.k mailto:sage [2008/12/13(土) 19:06:57 ]
あと、括弧なくても良いですよ。

919 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 10:36:09 ]
なるほど、そう言えばlambda式ってかなり優先順位が高いんでしたね
ありがとうございました

920 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 15:42:38 ]
F#からポロロッカしてきました

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

モナドとか継続とかはわりとどうでもいいんですが

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

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



922 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 17:06:40 ]
undoldって何かと思ったけど、unfoldの間違いだよね?


923 名前:920 mailto:sage [2008/12/14(日) 17:19:51 ]
間違いですw

>>921
ありがとう
Introduction〜とRealWorldHaskellをぽちってみました
下は高杉…

924 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 12:51:01 ]
要するにfoldってのは累積を計算しているのだから、
その累積演算を関数に独立させると、foldの性質上、継続的になるのです。
mapだとこうはなりません。

927 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 22:40:24 ]
>>926
ところがどっこい、この説明のすぐ後で、
「CPSを使ってmapとfilterを書け」なんて演習問題が出されてるわけですよ。

それを考えると、foldlの定義からcfold'へ持っていってあげたほうが
親切かもしれません。



928 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 22:53:36 ]
あっと、「この説明」ってのは
「yet another haskell tutorial の cfold' の説明」のことね。

929 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 23:38:03 ]
>>927
cfold'は、元のfold*の引数に渡す演算自体が継続的になるのに対して、
mapでは引数に渡す演算ではなくて、:が継続的になるわけです。
だからYAHTでは微妙に表現を変えています。
map f = foldr (\x -> ((f x) :)) []
ですから当たり前ですけども。

930 名前:デフォルトの名無しさん mailto:sage [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での変換のスタンダードな方法はもう固まってきてるでしょうか。
blog.kfish.org/2007/10/survey-haskell-unicode-support.html によると、
メジャーな方法が3つあるらしいですが、どれか、もしくはどれかがdefactoになっているでしょうか。
Haskell'でも使えるのがいいですが…。

932 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 22:14:48 ]
utf8-stringっぽいかな‥‥






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<225KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef