関数型プログラミング ..
[2ch|▼Menu]
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関連の話題ってありませんか?

279:274
08/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
08/06/25 21:28:51
>>279
> レビューとかデバッグとかしてるならそうはいかないだろ
うん。

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

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

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

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

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

283:275
08/06/25 22:26:04
なるほど。というか>>279をちゃんと読んでませんでしたごめんなさい。

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

285:デフォルトの名無しさん
08/06/26 23:11:25
本家から辿って論文を読むのがいいと思うよ。

286:デフォルトの名無しさん
08/06/26 23:16:36
Arrow アーーー

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

288:デフォルトの名無しさん
08/06/27 00:23:45
>>284
URLリンク(www.haskell.org)

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

290:デフォルトの名無しさん
08/06/28 01:15:42
ユニタリ変換の理解が一つの山かも。

291:デフォルトの名無しさん
08/06/28 01:22:40
ユニタリ変換?高校生でも知ってるよ

292:デフォルトの名無しさん
08/06/28 10:42:43
皆さん、エディタは何使って書いてますか?

293:デフォルトの名無しさん
08/06/28 10:48:09
emacsしか選択肢ないんじゃね?
eclipseは糞だし。

294:デフォルトの名無しさん
08/06/28 11:10:10
vim

295:デフォルトの名無しさん
08/06/28 11:45:12
notepad.exe

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

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

297:デフォルトの名無しさん
08/06/28 12:44:03
URLリンク(www.haskell.org) その他いろいろ

$ hugs -Evim

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

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


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

300:デフォルトの名無しさん
08/06/28 16:57:55
>>292
俺もvimだわ
なんか文法と相性良さげだし

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

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

303:デフォルトの名無しさん
08/06/28 18:39:00
>>292 俺はAgda使ってるよ。結構使いやすい。

304:デフォルトの名無しさん
08/06/28 20:10:12
project eulerに接続できねーぞ!!!
どうなってんだ糞

305:デフォルトの名無しさん
08/06/28 20:19:06
質問です

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

306:デフォルトの名無しさん
08/06/28 21:47:48
>>305
質問です

Haskellと関係ありますか?

307:298
08/06/28 22:27:19
>>299,302
thx、参考になった。
細かく追えてないけど、かなりがんばらないとparseできないってことか。


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

309:デフォルトの名無しさん
08/07/01 18:44:49
Real World Haskell
URLリンク(www.amazon.co.jp)

> 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:デフォルトの名無しさん
08/07/02 02:44:41
中身読めるよ
URLリンク(book.realworldhaskell.org)

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

311:デフォルトの名無しさん
08/07/02 03:40:51
後の兜本である。

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

313:デフォルトの名無しさん
08/07/02 23:40:42
2008/09
ちょおまw



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

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

317:デフォルトの名無しさん
08/07/09 22:36:35
しつもんです
らむだけいさんってなんですか?

318:デフォルトの名無しさん
08/07/09 23:38:52
世界遺産の一種です



319:デフォルトの名無しさん
08/07/09 23:44:40
URLリンク(wwwfun.kurims.kyoto-u.ac.jp)

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

321:デフォルトの名無しさん
08/07/10 16:58:13
俺がムラタだ

322:36 ◆K0BqlCB3.k
08/07/11 01:58:31
URLリンク(hackage.haskell.org)
とっとと仕事しろやボケ

323:デフォルトの名無しさん
08/07/11 09:38:42
まあ遅延評価だから

324:デフォルトの名無しさん
08/07/11 10:04:21
等無駄計算

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

326:デフォルトの名無しさん
08/07/19 00:59:56
名村啓?

327:デフォルトの名無しさん
08/07/20 23:31:18
do記法で

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

328:デフォルトの名無しさん
08/07/21 01:16:27
>>327
具体的なコード書いてみて

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

330:デフォルトの名無しさん
08/07/21 15:13:03
>>329
見直したらそうでした
許してくださいw
ごめんなさい

331:デフォルトの名無しさん
08/07/21 23:32:45
\_ -> k

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

332:デフォルトの名無しさん
08/07/21 23:38:07
全然違います

333:デフォルトの名無しさん
08/07/21 23:43:54
>>332
じゃあ何なのでしょうか?

334:デフォルトの名無しさん
08/07/21 23:55:35
URLリンク(www.codelogy.org)
ていうかなんか一冊入門書買うことをおすすめする

335:デフォルトの名無しさん
08/07/22 01:00:32
なんか夏まっさかりって感じ?


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


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

338:デフォルトの名無しさん
08/07/26 20:22:33
狂犬に噛まれて狂犬が増えるって
怖くね?

339:デフォルトの名無しさん
08/07/27 01:34:24
あれは仲間じゃない


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

341:36 ◆K0BqlCB3.k
08/07/27 02:23:52
さて、この夏、何かおもしろいことでもしようかな。

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

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

344:デフォルトの名無しさん
08/07/27 13:11:28
夏厨誕生物語

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

345:デフォルトの名無しさん
08/08/06 05:48:39
注目ワード“高階プログラミング”って何だ?
URLリンク(ascii.jp)

346:デフォルトの名無しさん
08/08/06 06:00:24
>>345
面白かった。サンクス。

347:デフォルトの名無しさん
08/08/06 19:32:59
仕事でHaskellできるなんて羨ましいなぁ。

348:デフォルトの名無しさん
08/08/06 20:30:02
>>345
nobsunだね。

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

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

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

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

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

353:デフォルトの名無しさん
08/08/07 07:30:34
>>351
青木はSRAやめたよ

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

355:デフォルトの名無しさん
08/08/07 08:55:02
>>354
ちょ、おまwww

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


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

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

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

360:デフォルトの名無しさん
08/08/07 13:19:40
二等兵には二等兵の仕事があるわな。

361:デフォルトの名無しさん
08/08/07 13:46:18
むしろ、パンダと飼育員。


362:デフォルトの名無しさん
08/08/07 13:54:11
俺はまだ士官候補訓練兵だ

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

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


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

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