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 「ネ申キター!㌧!マジ面白いね。他スレ荒らしてクルー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
ルネッサ~ンス!
365:デフォルトの名無しさん
08/08/07 19:05:14
あの芸人、この前番組内であからさまにいじめられてたぞ。
最近テレビの前で普通にいじめる先輩芸人が多くないか?
366:デフォルトの名無しさん
08/08/07 19:55:17
そんなことより「Real World Haskell」の発売が10月に延びてる・・・
367:デフォルトの名無しさん
08/08/07 20:41:53
URLリンク(book.realworldhaskell.org)
にある最終章、「A concurrent RESTful web application」が読みたいんだけど、
これは本買わないとダメってこと?
368:デフォルトの名無しさん
08/08/07 21:15:32
最近少しずつ読み進めていたんだが
そうか、本になるのか…買おうかな>RealWorldHaskell
369:デフォルトの名無しさん
08/08/07 23:21:20
RealWorldHaskellってHaskellの批判本なのに
なんでみんな買うの?
こんなにHaskellって腐ってます
ゴミですって随所に書かれているのにw
370:デフォルトの名無しさん
08/08/07 23:24:06
買おうかなと言ったのが一人いるだけなわけだが
脳内カウンターが回りまくりですかな
371:デフォルトの名無しさん
08/08/08 00:09:00
ん?批判本なんだ?
372:デフォルトの名無しさん
08/08/08 00:12:48
そう思っている人がいるかどうかは定かではないですが、
そう書き込んだ人間が一名いるようです。
また、買おうかなと書き込むことと買うことは別です。
プログラマたる者、このくらいの論理性は持って欲しいです。
部分と全体を混同するなんて、継承に毒されすぎです。
373:デフォルトの名無しさん
08/08/08 02:02:00
>>372
論理じゃなくて、揚げ足取りっていいませんか?
買おうかなと書き込んだということは、買う意思が比較的強いということでしょう。
0か1かじゃないんですよ。
物事は確率的なのです。
374:デフォルトの名無しさん
08/08/08 02:42:06
>>373
> 買おうかなと書き込んだということは、買う意思が比較的強いということでしょう。
著作権者や出版社勤務者が宣伝のために書いたかも知れませんよ
375:デフォルトの名無しさん
08/08/08 02:42:51
>>374
そういう可能性もある。
確率の問題。
376:デフォルトの名無しさん
08/08/08 02:50:39
>>369
ソース
>>370
君が一人しか見てないだけ
377:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/08/08 03:22:29
なんとなくpractical common lispのhaskell版と言う印象なんだけどな。
オレイリーから関数型言語ぼんが出るのは初めてじゃ内科?
国内ではgauche本があるがね。
379:デフォルトの名無しさん
08/08/08 03:42:03
フランスではocamlの本が出てた
380:デフォルトの名無しさん
08/08/08 11:58:00
washって継続ベースなの?
381:デフォルトの名無しさん
08/08/08 14:34:11
>>379マジだ
URLリンク(www.amazon.fr)
フランスでは流行ってるんだな
382:デフォルトの名無しさん
08/08/08 14:42:46
感覚的には日本のRubyと同じ感じじゃないすかね。
383:デフォルトの名無しさん
08/08/08 16:16:02
>>381
いつの本の話してんだか。
この本の和訳プロジェクトはつぶれたね。
384:デフォルトの名無しさん
08/08/08 19:15:39
>>382
全然違う。Rubyは世界的にPythonを急追している。
385:デフォルトの名無しさん
08/08/08 23:55:14
急追して、、いたけど結局ダメだった、というのが現在のところだよ
俺も1.9がちゃんとしたモノになるまではrubyは使うべきではないと思う。
386:デフォルトの名無しさん
08/08/08 23:59:16
そうか?
そもそも本当に10月に発売できるか分からんぞ。
387:デフォルトの名無しさん
08/08/09 00:21:55
コレすでに3回発売日伸びてる
年内出れば御の字
388:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/08/09 04:23:59
>>384
世界的にみても、わかって言語を選んでいる人よりも
バズワード追ってるだけの人のほうが多いからね。
390:デフォルトの名無しさん
08/08/09 06:09:31
Haskellって本当にLLって言っていいのかな。
基本コンパイラだし、インタプリタも軽量とは言い堅いし。。。
391:デフォルトの名無しさん
08/08/09 06:13:31
LLじゃないだろw
392:デフォルトの名無しさん
08/08/09 08:06:03
> 基本コンパイラだし
GHCばかり取り上げられてHugs涙目
393:デフォルトの名無しさん
08/08/09 08:07:11
>>392
そんなあなたをはぐはぐ。w あーっ!ではないよ。
394:デフォルトの名無しさん
08/08/09 08:22:00
初心者なんですが、Haskellが型については静的であることを選択した
理由って何かあるんでしょうか。純粋であることや遅延評価が、静的
型やコンパイル時の最適化を要請するということなんでしょうか?
395:デフォルトの名無しさん
08/08/09 08:27:55
GHCはHaskell解釈系ランキング第一位!
「やっぱりGHCだね」
396:デフォルトの名無しさん
08/08/09 09:06:49
>>394
静的なのは、最適化も大きいだろうけど、
むしろ安全性を狙ってるという要素が大きいんだろう。
遅延評価なのはコンパイル時の最適化にプラスなのかなぁ?
これは理論的に停止できる関数は必ず停止できるっていう、
これまたある種の安全性?が主な目的だと思うけど
( if true (answer foo) (nonStop baa) ) みたいな文を考えよう(Haskellの文法忘れたから適当)。
397:デフォルトの名無しさん
08/08/09 10:14:15
別に"動的型付け-純粋-非正格-インタプリタ型"の関数型言語もあり得るよな
効率はどうなんだろう、"動的型付け-正格"の言語よりさらに遅いことは想像が付くが
398:デフォルトの名無しさん
08/08/09 10:28:23
>>394
Goferがそうだったから。
で、なんでGoferがそうだったのかというと、Mirandaがそうだったから。
399:デフォルトの名無しさん
08/08/09 10:37:45
>>396
遅延評価は最適化にマイナスだよ。少なくともメモリ空間の最適化には全く向かない。
400:デフォルトの名無しさん
08/08/09 10:44:26
遅延評価なんて
今日はやらない
401:396
08/08/09 10:50:37
>>399
そうだよね。
コンパイル技術がすげー発達して高速になれば、話は変わるだろうけど。
(まぁ、コンパイル技術が「すげー発達」すれば、どのコンパイル言語でもマシン語と同じスピードが出るんだから、意味ない話)
あと「理論的に停止できる関数は必ず停止できる」は意味不明だとか、
文じゃなくて式だとか、気づいたけど後の祭り、いわゆるアポステオリorz
402:デフォルトの名無しさん
08/08/09 11:02:51
>>395
Guarded Horn Clauses
403:デフォルトの名無しさん
08/08/09 11:31:02
手続き型言語は、ノイマン型計算機を抽象化することで生まれてきたので、
評価方式としては、式、文の逐次的解釈が当然になる。
関数型言語は、ラムダ式から出て来たから、
その評価形式をどうするかというのが一つのポイントになる。
遅延評価は最左最外簡約の研究から出て来た。
効率がどうのこうのというより、
新しいプログラミングパラダイムを産み出したので、
(例えば無限リスト、無限木の積極的利用)
研究され続けているんだと思う。
404:デフォルトの名無しさん
08/08/09 11:32:55
>>402
GLOBAL HONORED CROWN URLリンク(www.noah.co.jp)
405:デフォルトの名無しさん
08/08/09 11:37:31
関数型とか意味がない言語だと思うけどねぇ
何ができるってわけでもないし
HaskellでWindowsは作れないしLinuxも作れない
Webサーバも作れないしDBも作れない
意味がない
406:36 ◆K0BqlCB3.k
08/08/09 11:44:54
>>405
URLリンク(www.thenewsh.com)
407:36 ◆K0BqlCB3.k
08/08/09 11:45:52
ごめん、今からインディージョーンズ見に行くから急いでるから!
408:デフォルトの名無しさん
08/08/09 11:47:37
まあ普通はモデルを現実に合わせるよな。
代入だらけのプログラムをSSAとかいう形式に変換するとか。
409:デフォルトの名無しさん
08/08/09 11:48:09
>>394
純粋関数型言語・遅延評価で、
型なし・インタプリタ言語ってあるよ。
変態言語 Lazy K がそれ。
ある意味では Make とかもそうかも。
少なくとも、
純粋関数型言語・遅延評価と、
コンパイル言語かインタプリタ言語か
っていうのはあまり関係ない。
純粋関数型言語・遅延評価は、
シンプルな手続き型よりもインタプリタを書くのが難しい、
っていうのはあるかもしれないけど。
純粋関数型言語であることと静的型であることは、少し関係があるかも。
純粋関数型言語でかつ動的型というのは、概念的にあまり良い食い合わせではないとは思う。
動的型っていうのは、関数の世界では「型無し」ってことになると思うんだけど、
いずれにせよアドホックなエラー処理が必要になって、
純粋関数型的にアドホックなエラー処理というのは少なくとも美しくない。
410:デフォルトの名無しさん
08/08/09 12:17:29
>>409
遅延評価でインタプリタ。破壊的関数が作れないというものなら、R言語くらいしか知らない。
411:394
08/08/09 12:56:14
皆さんレスありがとうございます。
論理的に組み合わせ悪いというよりは、静的型のメリットを選んだ
ということなんでしょうか。
静的型VS動的型というのは、安全VS自由ということだと思うんですが、
Haskellは安全を選んだということなのかな。純粋関数型としては、
副作用に関連する不具合から自由なのが売りだと思うので、更に
静的型によって徹底的に信頼性を上げてるという感じなんでしょうか。
>>409
純粋関数型であること(参照透明であること)と動的型が食い合わせ
悪いというのがちょっと分かりませんでした。動的型は実行時不具合
の問題が付きものと思うのですが、参照透明との関係をよろしければ
少し詳しく教えていただけマスでしょうか。
412:デフォルトの名無しさん
08/08/09 13:08:18
そもそも関数型言語に意味が無い
413:デフォルトの名無しさん
08/08/09 13:13:08
>>411
動的型を使うと、アドホックなエラー処理が必要になるよね?
っていうか、それがないと動的型を使ううまみがないと思うんだけど。
ここでいうアドホックなエラー処理っていうのは、
対象オブジェクトの型をプログラムで認識して、
意図しないオブジェクトが来たときにエラー処理するってことだけど。
このエラー処理にIOを使わないなら、
それは多相型やクラスを使っても同じ結果が得られるよね。
だから、Haskellに動的型を組み込む必要性は、
意図しないオブジェクトが来たときIOを使ったエラー処理をしたいときに限られると思う。
で、純粋関数型言語は参照透明性ゆえにIO処理するの苦手。
まぁ、動的型っていうのはプログラム中で型を認識できないと意味ないよね?
っていう時点で、カリー・ハワード対応との関係で微妙っていう気にするけど。
僕が考えているのは、そんな感じ。
414:デフォルトの名無しさん
08/08/09 13:17:44
上っ面を語り合って自己満足か
Haskellに多いやつらの典型だなw
415:デフォルトの名無しさん
08/08/09 13:18:59
グリーンスパンの第10法則が発動すると、どんな言語で書こうと
動的でマルチパラダイムな言語で書いたのと同じになる。
416:394
08/08/09 13:33:07
>>413
なるほど、理解しました。ありがとうございます。
417:デフォルトの名無しさん
08/08/09 13:50:48
>>405
せいぜい生きる力を養ってください
418:デフォルトの名無しさん
08/08/09 13:54:52
>>416
implementationの本を読むといいよ
Peyton Jonesのがpdfで読めるはず
419:デフォルトの名無しさん
08/08/09 14:11:34
>>418
俺はPJのが好きだな。
静的型付けとグラフ簡約が運命的な出会いであることがわかった。
420:デフォルトの名無しさん
08/08/09 14:19:55
>>413
なんか議論が無茶苦茶じゃないか?
例えば「型エラー」を「0除算エラー」に置き換えても論理展開が変わらん
>このエラー処理にIOを使わないなら、
>それは多相型やクラスを使っても同じ結果が得られるよね。
動的型の重要な利点は、型をいちいち書かなくてもいいという利便性だよな
多相型やクラスを使って動的型をシミュレートするのはすごく面倒だから、この利点を享受できない
それから、GHCではerrorやundefinedで発生したエラーをIOモナド上で捕捉できる。念のため
421:デフォルトの名無しさん
08/08/09 14:26:59
だな。Haskellの例外処理で不足があることはそうそうないと思う。
あと、動的型のメリットを例外処理だけに限定するのは視野が狭すぎる。
LISPのメリットはアドホックな例外処理か?そうじゃないと思う。
422:デフォルトの名無しさん
08/08/09 14:39:32
>>420-421
納得できないのなら、それで良いです。
僕も、べつにそんなに優れた論拠だと思ってないから。
423:デフォルトの名無しさん
08/08/09 14:55:35
俺も>>413はひどい文章で内容もないと思う。
>>416が理解したのが驚愕。
424:デフォルトの名無しさん
08/08/09 15:20:10
本当だ、マジで何言ってるのかわからん
すげえ
425:394
08/08/09 15:22:47
動的型のメリットは型を単に書かなくて済むことだとは思えないんですが。
それだけであれば、コンパイルで発見する不具合をテスト時に見つけよう
とする、つまり面倒なことを後回しにしてるだけ、ってことになりませんか?
426:デフォルトの名無しさん
08/08/09 15:23:15
別に動けばいい
427:デフォルトの名無しさん
08/08/09 15:30:45
何でも指せるポインタってのはメチャ便利なんですよ。
S式なんて最たるもので、静的な型付けは不能あるいはワイルドカード的。
静的か動的かはトレードオフの問題。
428:デフォルトの名無しさん
08/08/09 15:42:04
>>425
不具合を見つけるタイミングが遅くなるという対価を払って、記述の利便性および変更の容易さという報酬を得る
ちゃんと取引として成立してるじゃないか
もちろん「型を書かなくて済む」こと以外にも利点はある
特定の静的型付け言語ではそもそも型を付けられないようなコードが許容されるとか
429:デフォルトの名無しさん
08/08/09 17:38:51
>>425
lispを使ってる限りの印象だが
都合のよい所だけ型宣言が出来るというのは柔軟性につながるかな。
プログラムの最適の仕方も静的/動的で違いがあると思うよ。
型なんで考えずにアルゴリズムだけ作っちゃえができるからね。
それでも型を意識したプログラミングをすることはあるが。
でも、haskellでもポリモつかえばある程度型無視ラピッドプログラミング
は可能じゃないか?
430:デフォルトの名無しさん
08/08/09 17:41:42
じゃあOCamlでいいじゃん
431:デフォルトの名無しさん
08/08/09 17:44:14
>>430
haskellって参照透明性ってかなりのメリットだと思ってるけど。
432:デフォルトの名無しさん
08/08/09 17:49:41
注意してかけばいいだけの話
Hashkellはメリットを殺すデメリットしかないだろ
433:デフォルトの名無しさん
08/08/09 17:56:37
正直、exists型が標準になれば動的型付けは不要じゃね?
URLリンク(en.wikibooks.org)
434:デフォルトの名無しさん
08/08/09 17:57:26
>>430
OCamlはstrictだから。残念。
435:394
08/08/09 19:55:26
>>428
コンパイル時に問題が抽出されることと、テストによって抽出されるのでは
質的な違いがあるんじゃないですか?テストは結局は人間がやるものだし、
不具合の可能性を低めるということにしかならないけど、コンパイルでの
不具合検査は対象となるプログラムの論理的正しさを証明していることに
なるかと思います。
容易に変更ができたとして、不具合がどこに潜んでいるのか分かりにくい
というのは非常に問題あると思いますよ。コンパイルで分かるのならば、
これは明白でしかも機械的に全てが晒されますから安心です。
436:デフォルトの名無しさん
08/08/09 20:20:59
Rubyは危険だしセキュリティリスクしか
そんざいしないしな
437:デフォルトの名無しさん
08/08/09 20:23:09
>>435
確かに、バグがどの段階で発見されるかには質的な違いがある
でも、静的な型検査だって全てのバグを検出できる訳じゃないから、
結局、動的検査との安全性の違いは程度問題
その上で、静的な型検査の利点がコストを上回るという判断は当然ありえるし、
そう判断したなら静的型言語を使えばいい
438:デフォルトの名無しさん
08/08/09 20:28:12
>>435
静的型チェック馬鹿ですやん
439:394
08/08/09 20:39:50
>>437
例えば、参照透明ということについてはどうでしょうか?こちらも、副作用を許容
すれば、プログラム中に登場する変数の中身が何に変異しているかどうかが
分からなくなり、実行してみないと問題が検出できない、ということになります。
参照透明を強要するのも、型を強要するのも、結局その辺がクリアできない
プログラマというのはそれらに関連する不具合を出してしまうんだと思いますが
どうでしょうか。気をつければいい、というのは簡単で規模が小さなシステムでは
言えることで、そうでなければ膨大なテスト工程が必要になってしまうのでは?
440:デフォルトの名無しさん
08/08/09 20:46:48
OCamlが参照透明じゃないから嫌ってどういう事を言ってるの?
refとかで破壊的な変数が作れるから嫌とかそういうレベルの話じゃないよね。
それだったらref使わなければいいだけだから。
逆に、Haskellの参照透明で良い所ってどのへんなの?
OCamlのでも、ErlangのでもなくHaskellの参照透明性が良い理由を説明してほしいんだが。
441:394
08/08/09 21:04:32
>>440
参照透明でない、ということは値が望んだ通りの値であることを
保証するためにどこまでも神経質にテストをしなければならない、
ってことですよね。
一人で開発するのであればいいですが、多くの人の手によって
間違いがあってはならないシステムの開発をする際、「それは
禁じ手だから止めてね」と口約束するだけってのは非常に怖い
わけです。だからこそ、テストの工程が膨れ上がる。
Haskellに自分が惹かれている大きな理由の一つは、この辺の
頑固さを貫いていることですね。
442:デフォルトの名無しさん
08/08/09 21:19:02
参照の透明性があれば、
それだけでテストが必要なくなるわけでも、
テストが簡単になるわけでもない。
そうなるのはトイプログラムだけ。
嘘だと思うなら、GHC, Hugsなどのバグトラックをみてみればいい。
443:デフォルトの名無しさん
08/08/09 21:21:51
テストが減ることを数学的に証明してみせれ。
444:437
08/08/09 21:22:55
>>439
何が言いたいのか良く分からん
俺は「気をつければいい」なんて一言も言ってないよ
>>428に書いたように、動的か静的かの間でトレードオフが成立すると言っているだけ
>>441
OCamlの変数は変更不可だよ
変更できるのは参照(ref)で、これは変数とは別物
だから、口約束するまでもなく変数の値が変わらないことは保証されてる
445:デフォルトの名無しさん
08/08/09 21:26:07
>>440
参照透明性を壊さないと入出力できないのが嫌
446:36 ◆K0BqlCB3.k
08/08/09 21:37:36
>>443
数学的に無理だから、統計的に証明するわけですよ。
実際に~~でした、ってね。
ヒューマンインターフェース系の論文が参考になるんじゃないかな。
あっちは全部そんな感じ。
447:デフォルトの名無しさん
08/08/09 21:38:56
>>441
Haskellでもやろうと思えばIORefとかで事実上破壊的な操作が可能になるわけですが、
これについてはどうお考えで?
「HaskellでIORefは使うな」っていうプログラミングルールを設定することは
「OCamlでref使うな」っていうルールを設定することと本質的に違わないと思うんだけど
それについてはどうなんすか。
448:36 ◆K0BqlCB3.k
08/08/09 21:40:14
インディージョーンズ、あれは予算が無いからあんなにちゃっちい水晶髑髏なのか?
どう見てもアクリル製のガワの中に反射板入れただけやん。
UFOとかエイリアンとか、考古学じゃなくてSFやん。
突っ込みどころ満載な映画でした。
かしこ
449:デフォルトの名無しさん
08/08/09 22:13:11
monadとラムダの簡単な練習いっぱい
したいです。どこがいい問題集頂戴
450:デフォルトの名無しさん
08/08/09 22:23:39
>>449
do記法を使わずにliftM、liftM2、joinを実装
Continuationモナドを実装
451:36 ◆K0BqlCB3.k
08/08/09 23:30:03
>>450
また何も考えずにそういうこと言う。
>>449
URLリンク(ja.doukaku.org)
452:36 ◆K0BqlCB3.k
08/08/09 23:31:04
英語が読めるなら
URLリンク(projecteuler.net)
453:デフォルトの名無しさん
08/08/10 05:05:51
>>451
モナドとλの練習なら>>450はいい案じゃないか。
いっぱいじゃないけど質的にいい。
454:デフォルトの名無しさん
08/08/10 05:08:55
そんなことが書きたいんじゃなかった。
>>419
PJのって何?本もpdfもPJのでしょ?
455:デフォルトの名無しさん
08/08/10 08:02:29
PJは
Implementation of Functional Programming
Implementing Functional Languages,(D. Lesterと共著)
を書いていて両方公開。
URLリンク(www.haskell.org)
456:デフォルトの名無しさん
08/08/10 08:05:37
>>449
URLリンク(www.haskell.org)
457:デフォルトの名無しさん
08/08/10 13:23:16
>>454
すまん、>>455のImplementing...のほうを言いたかった。
458:36 ◆K0BqlCB3.k
08/08/10 13:39:12
>>453
>>449は本当にモナドとラムダの練習のためだけに問題をほしがっているのかどうかってこと。
それに、初心者は何か目に見えて動かせるものを書きたがるものさ。
誰かに見られることを想定して書くのと、「動けばそれでいい」だけで書くのとでは、
やっぱり前者の方がいろいろ調べたりすることで勉強になる。
459:デフォルトの名無しさん
08/08/10 15:23:20
>>455
そこ載ってなくね?w
URLリンク(research.microsoft.com)
URLリンク(research.microsoft.com)
>>457
サンクス。目次しか見てないけど、
Implementationがパターンマッチや型など広く扱ってて、
Implementingはコンパイラのコアな部分を主に扱ってる感じ?
静的型付けとグラフ簡約の運命的な出会いというからそうでもない?
まあImplementingのほうを読んでみます。
>>458
そうですね。
460:デフォルトの名無しさん
08/08/10 16:23:15
載ってるよー
グラフ簡約と運命的な出会いというと遅延評価じゃないかね。
特にPJ的には。
461:419
08/08/11 14:41:51
>>460
まあグラフ簡約は前提として、それを効率的に実装するには静的型付けがイイんだよ、
と、約20年前に読んだ時に思った。
462:419
08/08/11 14:44:37
20年前じゃなくて15年前だった。かなり記憶が混乱してるな、俺 orz
463:デフォルトの名無しさん
08/08/11 16:05:22
>>461
あまり理解できてなかったんじゃない?w
464:デフォルトの名無しさん
08/08/11 16:13:31
>>463
かもしれない。
できれば君が読んでポイントだと思ったところを挙げてくれると皆の参考になると思う。
465:デフォルトの名無しさん
08/08/11 16:20:35
PJの最初の本だと、
例え動的型チェックをやろうとも、そのコードは、
他の普通のコードと一緒でスーパー・コンビネータになって、
グラフ簡約されるだけだから、コンパイル時に型チェックを済ませることが、
スーパー・コンビネータのグラフ簡約上、特に有利だとは思えません。
466:デフォルトの名無しさん
08/08/11 17:39:55
横から口はさんですまんが、静的型がついていたほうがパターンマッチが速くならね?
467:デフォルトの名無しさん
08/08/13 09:02:33
Haskellの継続ってSchemeとは違いありますか?
468:デフォルトの名無しさん
08/08/13 10:48:15
call/cc のようなものはありません
469:デフォルトの名無しさん
08/08/13 11:17:46
>>468
MonadCont の callCC :: ((a -> m b) -> m a) -> m a のことじゃないの。
>>467
俺も気になる。違いはあるだろうけど、どう違うのか。
470:デフォルトの名無しさん
08/08/13 11:23:16
やっぱりそうですか。継続ベースのアプリ
作るとしたら、ステートモナドに次のアクション
入れておくとかですかね。
471:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/08/13 14:58:55
>>471
だとすると、smlのcall/ccを使ったco-routineみたいなことはできないということ?
473:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/08/13 22:46:51
オラ本の執筆遅れてます
著者にプレッシャヨロ
476:36 ◆K0BqlCB3.k
08/08/13 22:51:05
どうせ買わないので暖かい目で見守るだけです。
477:デフォルトの名無しさん
08/08/13 23:21:14
Schemeのcall/ccってその時点の継続を勝手にキャプチャして渡してくれる
んですよね?Haskellではそういうのは無いと思っていいんでしょうか?
478:デフォルトの名無しさん
08/08/14 00:04:58
>>477
モナド無しでということなら無い。
そもそもcall/ccは副作用があるし。
479:デフォルトの名無しさん
08/08/14 13:47:21
>>474ができると言ってるじゃないか
480:デフォルトの名無しさん
08/08/14 17:35:34
あれはモナド有りでの話だよ。
481:デフォルトの名無しさん
08/08/14 18:53:40
ごめん、>>479は>>477へのレスね
482:デフォルトの名無しさん
08/08/14 18:54:49
山本モナド
483:デフォルトの名無しさん
08/08/16 19:35:13
Haskellはボブマリーの言語?
URLリンク(lethain.com)
484:デフォルトの名無しさん
08/08/16 20:24:00
コメント欄も読もうな
485:デフォルトの名無しさん
08/08/16 22:50:09
URLリンク(profile.myspace.com)
こうゆう落ちもある。
486:デフォルトの名無しさん
08/08/17 12:30:17
Xmonad/Config archive - HaskellWiki
URLリンク(haskell.org)
の設定ファイル郡を理解できるぐらいまでHaskellについて知りたいんですが
どこから勉強すればいいんでしょう?
知識はXmonadやGhcをソースからインストールできる程度です
487:デフォルトの名無しさん
08/08/17 13:44:52
>>443 >>446 静的で強い型を持つ言語は、単純な実行時エラーを防ぐので
テストは軽減する。haskellなどはそのことが数学的に証明されているので
プログラマはぬるぽやoutofboundsなどの基本的な間違いにであうことなく、
本質だけを考えることができる。
488:デフォルトの名無しさん
08/08/17 14:23:37
パターンマッチに失敗すること多くない?
たとえば「空でないリスト」型が欲しいとき、ぬるぽ的な実行時エラーを防げるの?
489:デフォルトの名無しさん
08/08/17 14:47:05
ぬるぽは無いけどout_of_bounds発生させまくりですが
依存型のある言語なら防げるかも知れんけど
490:デフォルトの名無しさん
08/08/17 15:31:08
>>487
おまえ初心者スレにいたHaskell信者だろ。
491:デフォルトの名無しさん
08/08/17 18:08:12
はいはい両者リングアウト
492:デフォルトの名無しさん
08/08/17 18:14:59
>>488
それヘボすぎ
493:デフォルトの名無しさん
08/08/17 18:26:58
モナドがIOに使えるのは分かった。けどどうしてそれをIO以外にも使ってるの? >Haskell
誰か教えて下さい
494:デフォルトの名無しさん
08/08/17 18:36:20
Maybe(笑)を証明するため
495:デフォルトの名無しさん
08/08/17 18:36:41
便利だから
496:デフォルトの名無しさん
08/08/17 18:42:38
どんな時に便利ですか?
497:デフォルトの名無しさん
08/08/17 18:59:33
モナドのすべて
URLリンク(www.sampou.org)
の以下の部分を読むとわかるかも
Maybe というモナド
ひとつの例
リストもモナド
498:497
08/08/17 19:11:05
第 II 部:標準的モナドのカタログ
の各モナドの利用場面や動機を見るのもいいかもしれない
499:デフォルトの名無しさん
08/08/17 19:15:59
一応リストモナドやMaybeモナドが計算に使える、というのは理解しているつもりですが、
便利だからという理由以外にモナドをIO以外に使う理由はあったりしますか?
それだけの理由で使うには扱いが難しくて、プログラムを組む度に頭がオーバーヒートしそうになる
慣れの問題かそれとも理解不足か・・
500:デフォルトの名無しさん
08/08/17 19:25:15
>>489
そこでmaybeもなどですよ。
501:デフォルトの名無しさん
08/08/17 20:06:22
モナドという抽象的な枠組みを考えることで
IO, Maybe, List, etcの計算の合成を統一的に扱えるってのが最大の利点なんではないかと。
単に使うだけなら主に慣れの問題だと思う。
いろんな例を見て慣れていけば少しずつ理解もできていくんではないかと。
502:デフォルトの名無しさん
08/08/17 20:09:49
自分の作ったモナド上でdo式を書くと、世界の法則を書き換えてるような気分になってちょっと面白い
503:デフォルトの名無しさん
08/08/17 20:33:06
>>501
レス有難うです
慣れの他に密度の問題もあるかもしれないと思ったり。
他の言語より1行あたりの密度が濃いものになりやすい気がする。
というか濃縮されすぎてわけが分からなくなりやすい気がする。
504:デフォルトの名無しさん
08/08/17 20:38:12
>>501
計算を統一的に扱うだけであれば、普通の型クラスでいいんですよね?
モナドは値ではなくて型コンストラクタに対するクラスなので、ちょっと違う
と思うんですが。
505:36 ◆K0BqlCB3.k
08/08/17 20:39:51
モナドっていうと仰々しいイメージがあるかもしれないけど、
所詮はただの代数的データ型とそのデータ型に対して一貫性あるAPIのセットに過ぎないよ。
ところで、 データ型とAPIのセット のことをなんて呼べばいいの?
506:デフォルトの名無しさん
08/08/17 20:40:10
Stateモナドとかの(s -> (a,s))みたいな変な定義が気持ち悪い
型クラス(b,s) -> (a,s)に型bを部分適用したって考えれば意味は通るけど……
507:デフォルトの名無しさん
08/08/17 21:08:43
>>505
それが「型クラス」、ではないのでしょうか?MonadやFunctorはちょっと
毛色が違うという認識は勘違いでしょうか?
508:デフォルトの名無しさん
08/08/17 21:17:01
URLリンク(www.hyuki.com)
Ord、Eq、Show などの データ型とそのAPIのセット は「型クラス」
Functor、Monad、MonadPlus などの データ型の構築子とそのAPIのセット は「型構築子クラス」
509:デフォルトの名無しさん
08/08/17 21:31:22
それ単にOrdとかの『類』は*で引数をとらないけど
Functorの『類』は*->*みたいに引数をとる、って違いにしか見えない
分けて考えるのはおかしいと思う
510:デフォルトの名無しさん
08/08/17 21:37:45
>>509
型クラスと型構成子クラスじゃ抽象度が違うよ。
511:デフォルトの名無しさん
08/08/17 21:49:13
俺も>>509みたいに感じるなあ
抽象度が違うのは理解できるが
512:507
08/08/17 21:58:16
抽象度の違う型クラスを持つことで、値の計算遷移とは別レベルの
遷移を持つことが可能だ、という印象を持つんですけどどうなんでしょうか。
普通の計算を行う裏側で別の次元での計算が行われ、且つそれが
結合法則を満たしている、というのがモナドの定義と考えるのは
どうですか?自分は圏論などのこと全く無知なのでHaskellの構文
からの直感的な印象だけなんですけど。
513:デフォルトの名無しさん
08/08/17 21:59:06
じゃあ類が*->*->*(関数(->)とかタプル(,)とか)に対する型クラスとかは
もっと抽象度が違うので別の名前が必要なのか?型構築子構築子クラスとか。
有名な人が書いてるから鵜呑みにしてるだけなんじゃないの?
514:デフォルトの名無しさん
08/08/17 22:31:24
>>512
だいたいあってんじゃね?
見えてる部分で適当に処理を書いたら裏で適当に処理してくれる、
普通のプログラミング言語じゃfor文やif文みたいな処理構造、
あるいはマクロとして提供されるものと同等の処理ができるんだけど、
実態は単に型クラスでしかないので俺定義できるし、高階関数使えるし、表記もシンプルで、いろいろ小細工が利くのが利点。
たとえば、IOみたいにコンストラクタを隠したりすれば脱出不可な構造を作れるってわけ。
結合法則を満たしているってのは、まぁ別に特別なことじゃない。
EqやOrdにも反射律とか推移則とか守らないといけないルールがあるけど、
よっぽどのことがない限り変な実装はしないだろうから、一般のプログラミング言語ではそこまで突っ込まない
でもモナドって実態がよくわかんないから、ルールを明記してる。そんだけでしょう。
515:デフォルトの名無しさん
08/08/17 22:45:32
念のため補足。
>処理構造(略)同等の処理ができるんだけど
普通の言語では処理構造のものが、モナドが利用されてる例としてはErrorモナドとかContinuationモナドとかがあったね。
>よっぽどのことがない限り変な実装はしないだろうから、一般のプログラミング言語ではそこまで突っ込まない
浮動小数点の比較と等価性で違う実装がされてるとか、変な実装もあるけど。
個人的にはMonad則は、
値に関して順次実行できる何かで、値に対して何もしない処理もできる何かだ、というルールだと解釈してる。
516:デフォルトの名無しさん
08/08/17 22:50:03
変な実装=全順序じゃない、と読み替えてくれ。
コンピュータのメモリ節約を考えれば生の浮動小数点型を使うのもまっとうな実装だわw
517:デフォルトの名無しさん
08/08/17 23:19:23
ごめん、誤解を招くといやなのでもう一つ補足……
>値に関して順次実行できる何か
これは実行順序じゃなくて値の計算する方向を言ってるだけだよ。
g.f x がxにfを適用してgを適用するってのと同じことだよ。
実行順序は普通のモナドもIOモナドも方向は決まってないよ。
518:初心者修業中
08/08/17 23:37:55
ん?
実行順序を明確にするのがIOモナドの目的の一つ
と認識していますが。
そういう意味ではないのかな…
519:デフォルトの名無しさん
08/08/17 23:41:24
Haskellをみて日本のhaskellコミュって元気なの?
他の言語に比べて内と外をわけすぎるようなそんな印象をもってる。
なんでだろ?
520:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/08/18 00:02:55
Maybeの特化にしか見えません
522:36 ◆K0BqlCB3.k
08/08/18 00:25:49
>>519
世界的に全く元気がありません。
ちょこっと変なライブラリを書いたと思えばそれっきり離れていっている人も多数。
523:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/08/18 03:17:18
>>522
元気無い理由って何でしょうか。他に元気ある言語ってあるのかな。
525:デフォルトの名無しさん
08/08/18 04:14:24
ruby
526:デフォルトの名無しさん
08/08/18 08:38:27
>>520
> 1:2:3:[] → [1, 2:3:[]] → [1, 2, 3:[]] → [1, 2, 3]と簡約されるかもしれない。
型が滅茶苦茶だよ。
> この並びがプログラム終了後にコンパイラにわたって、コンパイラがこれを順番に処理していく。
意味不明。なぜプログラム終了後にコンパイラが出てくる。
ランタイムライブラリとごちゃまぜになているぞ。
527:デフォルトの名無しさん
08/08/18 10:05:00
Haskellにこういう奴が多い気がするのはなぜだ
528:デフォルトの名無しさん
08/08/18 10:21:37
「こういう奴」と書けばどんな奴を指してるのか分かってもらえると思ってるような、
想像力の貧しい奴がこのスレに多いような気がする
529:デフォルトの名無しさん
08/08/18 13:36:03
末尾が「気がする」で終わってるレスは
全部気のせいのような気がする
530:デフォルトの名無しさん
08/08/18 15:08:49
なんという自己言及レス
531:デフォルトの名無しさん
08/08/18 15:12:16
関数型らしくて言いじゃないか
532:デフォルトの名無しさん
08/08/18 15:41:06
>>531
つ座布団1枚
533:デフォルトの名無しさん
08/08/18 21:50:15
* -> * -> * ってどんなとき使うの?
534:デフォルトの名無しさん
08/08/18 22:25:25
アナルトレイン
535:デフォルトの名無しさん
08/08/19 07:45:46
( ゚д゚)゚д゚)゚д゚)
/ つ つ つ
(_(_ ノ ノ ノ
し∪ ∪ ∪
536:デフォルトの名無しさん
08/08/19 10:10:53
>>505
> ところで、 データ型とAPIのセット のことをなんて呼べばいいの?
プログラミング言語一般での話なら「抽象データ型」でしょうね。
537:デフォルトの名無しさん
08/08/19 11:50:46
>>533
関数(->)とかタプル(,)とか
538:デフォルトの名無しさん
08/08/20 20:24:46
485でおま。
それでなのです。 >ときどきの雑記帖の中の人
539:デフォルトの名無しさん
08/08/21 14:40:13
Arrow は * -> * -> * のクラス
MonadTrans は (* -> *) -> * -> * のクラス
540:デフォルトの名無しさん
08/08/21 21:20:37
URLリンク(book.realworldhaskell.org)
これの30章が消えてるんだけど・・・。
541:デフォルトの名無しさん
08/08/21 22:05:29
本買えよ
542:デフォルトの名無しさん
08/08/21 23:26:23
30章だけが読みたいんだよ。
ところで、HaskellでPetStoreってあるの?
543:36 ◆K0BqlCB3.k
08/08/21 23:56:58
>>542
横からすみませんが、
Pet Storeをよく知らないのでちょこっと検索したんですが、
これっていったい何が面白いんですか?
544:デフォルトの名無しさん
08/08/22 00:08:29
>>543
面白くは無いんだけど、色んな言語やフレームワークで同じもの作る
ことで比較をするためのものでしょ。同じアプリがこんな感じで作れ
ちゃうぞ、という。
545:デフォルトの名無しさん
08/08/22 11:40:45
Haskellでウェブアプリというとふつう本か
546:36 ◆K0BqlCB3.k
08/08/22 12:37:40
最近では新しい言語はWEBアプリが書きやすくないと人が入ってこないらしく、
ライトウェイト言語がブームみたいだね。
HaskellはライトウェイトではないからWEBアプリ向きとは全然思えないんだけど、
RubyでRubyOnRailsが考えられたみたいにHaskell独自のWEB向きキラーアプリが
出てこないとHaskellの人気はこれからもずっと平行線だと思うよ。
547:デフォルトの名無しさん
08/08/22 12:41:19
>>546
WEBアプリが書きやすいっていうより、APIとかWEBコンテナが標準装備されてないとダメという感じがする。
Javaの功罪は大きい。
548:デフォルトの名無しさん
08/08/22 12:41:59
まだ横ばいならたいしたもんだ
549:デフォルトの名無しさん
08/08/22 12:48:26
>HaskellはライトウェイトではないからWEBアプリ向きとは全然思えないんだけど、
ライトウェイトって何?動的に型を付ければライトウェイト?
それとwebとどういう関係があるの?
550:デフォルトの名無しさん
08/08/22 13:05:36
あまり考えずに気の向くままに書いてもあっさり動くのが
ライトウェイトってことじゃないか?
web案件は短期だったりアジャイルだったりでライトウェイトに
開発できるのが求められてるってのはある
551:デフォルトの名無しさん
08/08/22 13:10:45
WEBアプリの開発者は、JavaかRubyのHowto本から入ってる。
だから、WEBアプリ開発者は、身体のどこかに、プログラミング言語のJavaかRubyに似てない部分に拒否反応を持ってる。
552:デフォルトの名無しさん
08/08/22 13:11:10
ここでHaskellは人間の思考過程に最も近いから
考えが即座にコードにうつせるため開発期間が最短であると主張する人がどこからか登場
↓
553:デフォルトの名無しさん
08/08/22 13:23:23
|
( ゚д゚ )↓
(⊃⌒*⌒⊂)
/__ノ''''ヽ__)
554:デフォルトの名無しさん
08/08/22 13:27:58
>>550
それならHaskellもライトウェイトで良くね?
555:デフォルトの名無しさん
08/08/22 14:05:36
明示的なコンパイル作業が必要ないってのはLLの必要条件な気がする。
556:デフォルトの名無しさん
08/08/22 14:18:04
LLとかWebアプリとか、
だから普及しないとか、
どうでもよくねえ?
好きな事、楽しい事すればいい。
557:デフォルトの名無しさん
08/08/22 14:22:47
>>555
runghcがあるじゃないか
もうちょっと速ければと思うことはあるけど
558:デフォルトの名無しさん
08/08/22 14:34:05
>>556
そういう立場も理解できるけど、俺は普及してほしい
ライブラリのメンテとか人が足りてないじゃん
559:デフォルトの名無しさん
08/08/22 14:46:33
>>552
Prologには負けるんじゃない。
560:36 ◆K0BqlCB3.k
08/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
08/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:デフォルトの名無しさん
08/08/22 15:03:43
LLでHaskell関係のプレゼンとかしてる人いるみたいだけど?
563:デフォルトの名無しさん
08/08/22 15:07:56
WebアプリとLL(と呼ばれている言語)との間には全く関係はないけど、
Webアプリのかなり大部分は一般的にLLと呼ばれている言語で書かれているだろう。
そういう"LL"はテキスト処理がしやすいからってのがあるだろうな。
まあHaskellがそういう意味で人気にならなくても別にどうでもいいけど。
ここでmondic Parser Combinatorを持つHaskellが
最もテキスト処理に適した言語であると主張する人がどこからか登場。
↓
564:デフォルトの名無しさん
08/08/22 15:38:43
HaskellもLL言語だよ
565:デフォルトの名無しさん
08/08/22 15:45:06
これどうなの?
URLリンク(happs.org)
566:デフォルトの名無しさん
08/08/22 16:09:31
Parser Combinatorがあるからテキスト処理ならHaskell最強だろ。
満足した?
567:デフォルトの名無しさん
08/08/22 17:42:48
haskellは型推論がちゃんと効いてる使い方が出来れば、LL的な生産性は確保できるだろう。
だがな、至高の存在で良いじゃないか。
haskellの性質上webプログラミングは不得意分野に思うんだが、mod haskellなんて生まれる
分けでもないし生まれたところで破壊的操作がほとんどできないし、ファイル操作は基本的に
苦手でしょ。webは動的言語の親玉が一番向いてるけどs式アレルギーな人が多いからLLに
なってるんでしょうね。
だから、無理にwebに擦り寄らずとも良いと思うんだけどね。むしろ、破壊的操作より安全性を
大切にされる金融などのところで目立つ存在になってくれたらいいんじゃないか?
568:36 ◆K0BqlCB3.k
08/08/22 18:09:07
>>567
もし金融などで使われることを想定するなら、
haskellの並列処理に関する部分も早く実装してほしいところですね。
(まだ未完成)
569:デフォルトの名無しさん
08/08/22 18:44:00
某氏のhapps解説はお流れ?
>>567
> 破壊的操作がほとんどできない
なんで?
570:デフォルトの名無しさん
08/08/22 18:58:34
なんでそんなにHaskellの応用分野を限定したがるんだw
>>567
コンパイルするならmod_haskellがあっても恩恵は小さいだろ
>破壊的操作がほとんどできないし
Haskellで入出力書いたことあるか?
>ファイル操作は基本的に苦手
これも良く分からん
flock使うのにわざわざライブラリを落としてこないといけないとか、そういうこと?
571:デフォルトの名無しさん
08/08/22 19:43:28
ウイルス対策ソフトのように危機感を煽るのはいいが、
既存のシステムを補強するのではなく全部作り直せというのは、ちょっとね
572:デフォルトの名無しさん
08/08/22 19:54:17
>>570
Prologを事務処理に使うと、住所や氏名情報などで爆発的にアトムが
発生し、Heap領域を埋め尽くして、GCが頻発するという事態となる。
もちろん数百万レコードを越える処理単位の話だが。
Haskellの場合この問題は起きないの?
573:デフォルトの名無しさん
08/08/22 20:37:03
Webアプリが苦手ってことは無いと思うんだけどな。今後Webベースのアプリは
まだ増殖するだろうから、そっちで使いやすいフレームワークやDSLが出ないと
使う人は頭打ちだと俺も思う。
研究者の論文レベルのものも面白いだろうけど、上から下までHaskellベースで
かかれたWebアプリとかで目立つものが出てほしいよ、個人的には。
574:デフォルトの名無しさん
08/08/22 20:53:32
>>572
アトムの爆発ってのはPrologスレで言及されてる現象のことでいい?
そもそもPrologのアトムってのが良く分からんので何が問題なのか理解できん
Lispのシンボルみたいな物と思っていいのかな
それなら相当するものはHaskellにはないよ
575:デフォルトの名無しさん
08/08/22 21:35:41
>>574
Lispのシンボルみたいな物、ですね。
記号をどう処理しているのですか。
576:デフォルトの名無しさん
08/08/22 21:53:05
>>540
30章ってなんの章だったの?