関数型プログラミング ..
[2ch|▼Menu]
33:デフォルトの名無しさん
08/05/19 00:53:52
>>32
まことのことわり。
コレは絶対の真理。

34:デフォルトの名無しさん
08/05/19 00:55:36
真理・・・いつもどんな時も変わることのない、正しい物事の筋道。真実の道理。
例:HaskellスレはHaskellを論ずる為に存在している

これでおk?

35:デフォルトの名無しさん
08/05/19 00:55:40
理系の雑談っていつもこんななの?

36:デフォルトの名無しさん
08/05/19 00:59:02
>>33-34
そこから >>31 を導出するのは至難だなw

37:デフォルトの名無しさん
08/05/19 01:04:01
「真理」は既に絶対的なものだから「絶対的な真理」という表現は「絶対的」が重複しているってことだろ

38:デフォルトの名無しさん
08/05/19 01:06:01
>>35
理系に限らず2chの雑談はどこもこんな感じです。

39:デフォルトの名無しさん
08/05/19 01:07:30
今日はいつにもましてバカが多いな
春か?春だからなのか?

40:デフォルトの名無しさん
08/05/19 01:19:01
>>37
修飾語は強調する為にも使うけど、意味内容の重複は許されないという主張?

41:デフォルトの名無しさん
08/05/19 01:25:54
程度の存在しない物に強調もクソもないだろ

42:デフォルトの名無しさん
08/05/19 01:31:46
あ、強調って分かり辛かったか。念押しだと考えてみな。

43:デフォルトの名無しさん
08/05/19 13:06:15
程度の存在しない物に念押しもクソもないだろ

44:デフォルトの名無しさん
08/05/19 13:50:33
まさに自転車置場の議論

45:デフォルトの名無しさん
08/05/19 18:57:28
+++ってどういう意味なんですか?
+とか++とかもあってよくわからないのですが

46:デフォルトの名無しさん
08/05/19 19:25:42
>>30
× haskell4000年の歴史
○ AD

47:デフォルトの名無しさん
08/05/19 19:41:15
>>45
解らないなら使うな以上

48:デフォルトの名無しさん
08/05/19 19:46:25
>>45
(+) は Integralクラスのインスタンス、つまり数の加法。
(++) は リストの結合。[1, 2, 3] ++ [4, 5, 6] は [1,2,3,4,5,6]。
(+++) は Arrowの合成かなにかに使う。Arrowは俺も良くわかんないし、まあ知らんでもプログラムは書けるから気にするな。

49:デフォルトの名無しさん
08/05/19 19:46:29
>>45 型を見てみろ

50:デフォルトの名無しさん
08/05/19 19:49:24
>>48
失敬!(+)はIntegralじゃなくてNumクラスのインスタンスの加法だな。

51:デフォルトの名無しさん
08/05/19 20:03:27
質問です。

「16文字のString型」という定義は型定義の段階でできるのでしょうか?

52:デフォルトの名無しさん
08/05/19 20:11:35
>>48
ありがとうございます

53:デフォルトの名無しさん
08/05/19 20:14:01
>>51
絶対の真理

54:20
08/05/19 22:42:22
「文系」という一言でスレがこんなに伸びるとは思いませんでしたw。
ちなみに自分は理系人間に対しては羨望の眼差しで見ています。

The Fun of Programming って読んだ方いらっしゃいますでしょうか。


55:デフォルトの名無しさん
08/05/19 23:25:55
今日先輩にHaskellできると
彼女ができると聞いたのですが
みなさんは彼女いてますか?

56:デフォルトの名無しさん
08/05/19 23:39:55
>>55
55人ぐらいいるよ。

57:デフォルトの名無しさん
08/05/20 03:13:47
>>16
そんな教科書ばっか読んでなにがしたいの?

>>20
Haskellで書かれたアプリのコード読め。

58:デフォルトの名無しさん
08/05/20 22:55:17
Monagiusは勉強になる。

59:デフォルトの名無しさん
08/05/20 23:03:23
monadiusはもはや古いぞ。
今はもっと洗練されてる。

60:デフォルトの名無しさん
08/05/21 00:08:32
Little Haskeller読んで学習中。日本語版もホスイ

61:デフォルトの名無しさん
08/05/21 01:40:02
>>60
それってリトル隙間の姉妹本?

62:デフォルトの名無しさん
08/05/21 02:51:30
mod_haskell.soまだー?

63:デフォルトの名無しさん
08/05/21 03:51:48
>>62
まってないで作って公開しろ

64:デフォルトの名無しさん
08/05/21 23:00:47
>>59
今って例えばどれ?

65:デフォルトの名無しさん
08/05/22 03:04:27
URLリンク(www.geocities.jp)
古いというか、力技で作ったって感じ。
>>59はFRPを念頭においてるんだろうけど、
FragのObjectBehaviorなんかが洗練されてるのかは微妙。

66:デフォルトの名無しさん
08/05/22 19:37:06
質問です。

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

67:デフォルトの名無しさん
08/05/23 01:04:34
>>27
数学基礎論がまるで分からないんだね。

68:初心者修業中
08/05/23 02:23:32
>>66
data Hoge = Hoge0|Hoge1|Hoge2|Hoge3|…|Hoge10

これじゃ駄目?

69:デフォルトの名無しさん
08/05/23 07:10:08
数学できない奴くるな

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

71:デフォルトの名無しさん
08/05/23 13:47:07
Tackling the awkward squad

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

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

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

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

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

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

77:デフォルトの名無しさん
08/05/23 16:03:56
だからオブジェクト指向が生き残るのですね

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

79:デフォルトの名無しさん
08/05/23 18:31:30
難読化

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

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

82:36 ◆K0BqlCB3.k
08/05/23 19:21:01
ミスってコテハンつけちゃったぜ

83:デフォルトの名無しさん
08/05/23 19:39:51
>>82
warrockに帰れwww

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

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

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

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

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


89:デフォルトの名無しさん
08/05/24 04:49:01
分かってねーな

90:デフォルトの名無しさん
08/05/24 04:59:31
分かってねーなじゃわからないっす。

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

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

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

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

95:92
08/05/25 01:35:15
>>94
そういう意図の質問でした。ありがとう。

96:初心者修業中
08/05/25 02:31:03
>>94

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

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


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

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

99:デフォルトの名無しさん
08/05/25 07:33:24
f x: xにfを適用するアクション
1 + 2: 1と2を加えるアクション

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

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

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

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


102:デフォルトの名無しさん
08/05/25 10:49:58
>>99
関数とアクションは同じものなの?

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

104:デフォルトの名無しさん
08/05/25 11:19:31
LINPACKとか言ってるおっさん
氏ねよw

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

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

106:デフォルトの名無しさん
08/05/25 11:39:54
>>100

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

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

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

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

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

111:デフォルトの名無しさん
08/05/25 13:24:07
>>105
そうそう、その時点その時点でのベストを尽くします。そして、過去の仕事に対するリスペクトも忘れません。

112:デフォルトの名無しさん
08/05/25 15:24:57
質問です

たとえば
data Hoge = Hoge { x1 :: Word32, x2 :: Word32, x3 :: Word16, x4 :: Word16}
のようなHogeを[Word8]と相互変換する便利な方法ってないでしょうか?

113:デフォルトの名無しさん
08/05/25 15:29:12
使ったことないけどSerTHとか?

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

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

116:デフォルトの名無しさん
08/05/25 16:02:02
Template Haskellの方もちょっと見てみます

117:デフォルトの名無しさん
08/05/26 00:05:41
計算理論の基礎
計算機プログラムの構造と解釈

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

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

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

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


121:デフォルトの名無しさん
08/05/26 14:08:03
こっちでいいかと
スレリンク(informatics板)

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

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

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

125:デフォルトの名無しさん
08/05/26 22:24:27
絵を描いて学ぶ・プログラマのためのラムダ計算
URLリンク(d.hatena.ne.jp)

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

127:デフォルトの名無しさん
08/05/26 22:45:04
そもそも計算とはいったいなんなんだ?


128:デフォルトの名無しさん
08/05/26 23:36:50
後者関数ってなんだぉ?

129:デフォルトの名無しさん
08/05/27 00:14:01
やっぱ手書きしねーと理解できねーよw


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

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

132:デフォルトの名無しさん
08/05/27 16:49:17
質問です

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

133:デフォルトの名無しさん
08/05/27 19:16:35
>>132
URLリンク(d.hatena.ne.jp)
なんかどうよ。

134:デフォルトの名無しさん
08/05/27 20:06:04
>>132
URLリンク(ll.jus.or.jp)
5ページ目
Haskell による Arrowised Functional Reactive
Programming という実装


135:デフォルトの名無しさん
08/05/27 22:54:50
Yampaってコンパみたいなもん?

136:デフォルトの名無しさん
08/05/28 07:20:03
>>127N.D.Jones, Computability and Complexity
その他良本情報はこちら
URLリンク(www.kurims.kyoto-u.ac.jp)


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

138:デフォルトの名無しさん
08/05/31 13:59:28
>>137
URLリンク(www.haskell.org)

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

140:デフォルトの名無しさん
08/05/31 20:44:19
comb :: Maybe a -> (a -> Maybe b) -> Maybe b

このときの

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

141:デフォルトの名無しさん
08/05/31 21:04:28
うん

142:デフォルトの名無しさん
08/05/31 21:41:20
違うだろw

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

143:デフォルトの名無しさん
08/05/31 21:51:45
()でくくるとどうなるのw?

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

145:デフォルトの名無しさん
08/05/31 22:22:38
>>143
a -> Maybe b
っていう関数を引数にとるっていうことだよ

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

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

…と認識しています。


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

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


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

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

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

149:デフォルトの名無しさん
08/05/31 22:39:34
>>147
>どうやら上の人曰く間違っているようで
間違ってないよ

150:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/05/31 22:56:33
>>142が突っ込んでるのは

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

の部分。

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

こっちは合ってる。

152:デフォルトの名無しさん
08/05/31 23:54:09
カリー化とは何か?を書いた方がいいんではないでしょうか。

↓ではお願いします。

153:デフォルトの名無しさん
08/05/31 23:58:34
この関数適用は出来損ないだ。食べられないよ。

154:初心者修業中
08/06/01 01:08:22
カリー化とは、
複数の引数を持つ関数を
引数一つの関数の組み合せとする事。

…と認識しています。

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

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

157:デフォルトの名無しさん
08/06/01 09:01:04
ガラムマサラとかも入れた方がいいのでは?

158:デフォルトの名無しさん
08/06/01 10:27:15
エバラ化、桃屋化

159:デフォルトの名無しさん
08/06/01 10:28:14
味の素化

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

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

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

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

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

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

と書けばおk

165:デフォルトの名無しさん
08/06/01 17:10:16
なるほどw

166:デフォルトの名無しさん
08/06/01 23:06:52
複数引数の邪悪な関数をこらしめるのがカリー化です。

167:デフォルトの名無しさん
08/06/01 23:33:45
それだけならタプルで渡せばいいだけじゃそ

168:デフォルトの名無しさん
08/06/01 23:44:14

=>

これがよくわからん


169:デフォルトの名無しさん
08/06/01 23:47:32
<コ:彡

170:デフォルトの名無しさん
08/06/02 00:31:27
兄者…

171:初心者修業中
08/06/02 01:36:10
>>168
:は、リストの先頭に要素を結合する演算子

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


…と認識しています。

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



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

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

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

178:初心者修業中
08/06/05 00:54:30
>>177
日本語でお願いしますm(_ _)m

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


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

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

181:デフォルトの名無しさん
08/06/05 09:05:56
アホな質問するスレがあるところ

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

183:デフォルトの名無しさん
08/06/05 18:54:01
「haskell使ってる」と言うと、みんなに尊敬して貰えること

184:デフォルトの名無しさん
08/06/05 19:19:05
>>180
高速化を考え出すと、すごくたいへんなところ。

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

186:デフォルトの名無しさん
08/06/05 21:59:49
>>183
このスレ見てたらそう思えんわな、、、


187:デフォルトの名無しさん
08/06/05 22:55:55
知らない人は知らないし、知ってる人はわかるもんな
しかしいい言語だ

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

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

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

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

191:デフォルトの名無しさん
08/06/06 00:12:41
>>190
そういう説もあります。
そうでないという説もあります。

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

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

195:初心者修業中
08/06/06 05:35:07
>>193
私はまだtraceに手を出すつもりはありませんが、
ググってみました。

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

第15回 Haskellでのデバッグのコツをつかむ
URLリンク(itpro.nikkeibp.co.jp)
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:デフォルトの名無しさん
08/06/06 07:41:25
[(x,y) | x <- [1..], y <- [1..], x+y = 10]

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

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


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

201:デフォルトの名無しさん
08/06/06 08:54:12
>>199
間違ってるやん!

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

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

204:デフォルトの名無しさん
08/06/06 10:16:24
>>190
Pythonに見られるインデントによる制御構造の是非
スレリンク(tech板)l50

205:初心者修業中
08/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:デフォルトの名無しさん
08/06/06 15:16:52
GHC 6.8.3 まだー?

207:デフォルトの名無しさん
08/06/06 18:05:51
>>206
作って公開してくれ。

208:デフォルトの名無しさん
08/06/07 00:31:44
無明関数って何がうれしいの?

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

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

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

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

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

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

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

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

216:デフォルトの名無しさん
08/06/07 11:20:46
名前があってもなくてもポインタ渡すのです

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

217:デフォルトの名無しさん
08/06/07 11:33:06
>>216
よくわからないぉ
もう少し詳しく説明してぉ?

218:デフォルトの名無しさん
08/06/07 11:43:32
無明関数…悟りでも得たいのか?


219:デフォルトの名無しさん
08/06/07 11:46:43
>>218
間違えただけだぉ気にしないで

220:デフォルトの名無しさん
08/06/07 11:47:44
>>218
悟りは得るものではなく開くものです。

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

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

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

223:デフォルトの名無しさん
08/06/07 12:28:02
カリー化
(new Satori(x)).open(y)

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

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


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

227:デフォルトの名無しさん
08/06/07 12:54:26
あー、でも f って名前つけちゃったな


228:デフォルトの名無しさん
08/06/07 13:11:01
>>225-226
ここはHaskellのスレですよ

229:初心者修業中
08/06/07 13:17:55
>>225
Control.Monad.Fix にありますね。

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


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

233:デフォルトの名無しさん
08/06/07 16:01:17
>>232に同意

234:デフォルトの名無しさん
08/06/07 16:19:36
名前が付いてるからダメ

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

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

238:デフォルトの名無しさん
08/06/09 21:46:25
The Haskell School of Expressionで勉強してます。

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

URLリンク(www.elbeno.com)

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

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

240:デフォルトの名無しさん
08/06/16 15:00:34
うん

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

242:デフォルトの名無しさん
08/06/16 18:52:01
どの範囲の関数まで使用を認めるかによるな

>>241
Control.Monad.ap :: (Monad m) => m (a -> b) -> m a -> m b
を(->) rモナドについて使えば、Sコンビネータそのもの

243:デフォルトの名無しさん
08/06/17 22:58:00
ポイントフリーのポイントって何?
何が自由なの?

244:デフォルトの名無しさん
08/06/17 23:28:00
ポイント = initial objectからのarrow
ポイントフリースタイル = ポイントを使わない関数定義

245:デフォルトの名無しさん
08/06/18 00:11:23
(Monad m) => m (a -> b) -> m a -> m b

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

246:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/06/18 09:12:38
GHC 6.8.3リリース

248:デフォルトの名無しさん
08/06/18 11:53:17
ナイス

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

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


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

251:249
08/06/18 18:26:24
× terminal object(始対象)
○ terminal object(終対象)
だった。


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

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


254:デフォルトの名無しさん
08/06/20 15:00:42
ありゃ一種の難読化だよな

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

256:デフォルトの名無しさん
08/06/20 19:22:12
>>255
そこでunlambdaですよ!

257:デフォルトの名無しさん
08/06/21 00:27:42
>>255
つ super combinator

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

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

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

260:デフォルトの名無しさん
08/06/22 18:05:14
f xs = zip xs (tail xs)

261:デフォルトの名無しさん
08/06/23 18:15:27
f xs = zip xs (drop 1l xs)

262:261
08/06/23 19:03:55
すまん。tail の l を残してしまった。

f xs = zip xs (drop 1 xs)

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

264:デフォルトの名無しさん
08/06/24 00:09:28
>>263
⊥って勃起してるのw?

265:デフォルトの名無しさん
08/06/24 01:03:13
いやむしろ tail で書けて気持ちいいだろ。

266:デフォルトの名無しさん
08/06/24 06:18:25
>>265
でも
zip (tail xs) xs

zip (drop 1 xs) xs
は等価じゃない
つまり、zipでは第一引数が先に評価されるということを覚えていないといけない分、ややこしい
(厳密には評価順の問題じゃなくて「zipは第一引数について正格で第二引数について非正格」ということだけど)

267:デフォルトの名無しさん
08/06/24 07:48:57
>>266 どういうこと?
例えば
f (x1 : x2 : x3 : xs) -> x1 + x3
だったら、引数のリストの最初の要素と3番目の要素について正格ってこと?

268:デフォルトの名無しさん
08/06/24 08:32:09
>>267
そういうつもりで「正格」という言葉を使った

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

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

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

こんな感じ

sigma = tail $. scanl (+) 0

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


270:デフォルトの名無しさん
08/06/24 09:55:22
慣れの問題

271:初心者修業中
08/06/24 10:13:14
ああ、勘違いしてました。
関数の優先順位はどの演算子よりも上ですね。

これで問題ないのか

sigma = tail . scanl (+) 0

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

272:デフォルトの名無しさん
08/06/24 11:35:10
>>266
「厳密には」も何も最初っからそう

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

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

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

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

277:デフォルトの名無しさん
08/06/25 17:38:53
3の場合

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

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

278:デフォルトの名無しさん
08/06/25 18:27:02
質問です

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


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5214日前に更新/225 KB
担当:undef