1 名前:デフォルトの名無しさん [04/02/10 22:16] Haskellの公式HP www.haskell.org/ 日本語サイト www.sampou.org/cgi-bin/haskell.cgi www.teu.ac.jp/kougi/koshida/Prog6/index.html 過去ログ、関連スレは>>2-5
89 名前:デフォルトの名無しさん mailto:sage [04/03/25 06:54] >>87 できあがる実行ファイルがでかすぎる
90 名前:デフォルトの名無しさん mailto:sage [04/03/30 23:30] >>89 Minimulコードでどれぐらい?
91 名前:デフォルトの名無しさん mailto:sage [04/03/31 02:56] >>90 @ Mac OS X 10.3 --- Hello.hs module Main where import Graphics.UI.WX main :: IO () main = start hello hello :: IO () hello = do f <- frame [text := "Hello world!"] quit <- button f [text := "Quit", on command := close f] set f [layout := widget quit] --- $ ghc -package wx -o hello Hello.hs で、helloのサイズが7M強。
92 名前:デフォルトの名無しさん mailto:sage [04/03/31 17:53] stripして3M弱だな。
93 名前:デフォルトの名無しさん mailto:sage [04/04/03 19:31] そりゃすげえな
94 名前:デフォルトの名無しさん [04/04/03 19:37] よくしんねぇけど、 ツールキット全部そんなかに入ってんじゃないの? だったら仕方ねぇと思うけど。 外出しには出来ねぇのかな?
95 名前:デフォルトの名無しさん mailto:sage [04/04/07 21:00] GHC を ports の導入されていない FreeBSD に導入したいんだが どうすればいいのだろう?
96 名前:デフォルトの名無しさん mailto:sage [04/04/07 21:11] make install
97 名前:デフォルトの名無しさん mailto:sage [04/04/07 21:13] a) portsを入れてmake install b) packageを持ってきてpkg_add
98 名前:デフォルトの名無しさん mailto:sage [04/04/07 21:47] みんなまずインタプリタで開発して、 安定してきてリリースする間際にコンパイラに移行するの? インタプリタで正常動作してるけど、コンパイラではうまく動かないってこと多い? Haskellってコンパイル撃遅い(というか長い)ッてきいたけどマジ?
99 名前:デフォルトの名無しさん mailto:sage [04/04/07 22:07] >>96 GHC のコンパイルには GHC バイナリが必要です >>97 ports や package は教育上入れてもらえない学生さんなんですよ
100 名前:デフォルトの名無しさん mailto:sage [04/04/08 14:25] >>99 FreeBSD の ftp サーバの ports/distfiles に ghc-<version>-i386-unknown-freebsd-boot.tar.bz2 があるからこれを展開して, ghc のコンパイル時にこの展開先にある ghc を指定してコンパイルすればok. ちなみに ports も同じことをしている(処理が自動化されてるだけ). >>98 コンパイルはたしかに激遅. プログラマが楽するためにコンピュータに頑張ってもらってる感があるね.
101 名前:デフォルトの名無しさん mailto:sage [04/04/08 15:40] マニュアル印刷したいんだけど、1枚のHTMLにしてくんないかな。印刷しづらい。 www.sampou.org/haskell/report-revised-j/
102 名前:デフォルトの名無しさん mailto:sage [04/04/08 15:53] >>101 そんなのちょこっとスクリプト走らせれば楽勝だろ?
103 名前:デフォルトの名無しさん mailto:sage [04/04/08 19:12] >>98 > みんなまずインタプリタで開発して、 おれはそうしてる。GHCiでときどきHugsでチェック。 > インタプリタで正常動作してるけど、コンパイラではうまく動かないってこと多い? そんな経験は無い。
104 名前:デフォルトの名無しさん mailto:sage [04/04/08 20:10] >>100 ありがとう 試してみてうまくいったらまた報告します
105 名前:デフォルトの名無しさん mailto:sage [04/04/08 22:55] NHCの方が良質のコードを生成するって聞いたことあるけど、 もう今は昔の話なのかな?
106 名前:デフォルトの名無しさん mailto:sage [04/04/08 23:14] このスレでも聞いてみる。 Scheme,OCaml,Haskell,Clean、覚えて「損しない」「一番得」 な言語はどれ。ぶっちゃけ周辺ライブラリーが充実してるのどれ。
107 名前:デフォルトの名無しさん mailto:sage [04/04/08 23:20] >>106 得するのは、全部覚えること。 得しないのは、ひとつしか覚えないこと。
108 名前:デフォルトの名無しさん mailto:sage [04/04/08 23:54] >>106 若いなら全部やれ
109 名前:デフォルトの名無しさん mailto:sage [04/04/09 00:27] >>105 コンパイルは速いけどね。 Hugs/GHC共通のHierachical moduleの多くが使えないのが痛すぎる。 今試しに main = interact id をnhc98(FreeBSD-CURRENT, from ports)でコンパイルしたらbus error....
110 名前:デフォルトの名無しさん mailto:sage [04/04/09 00:34] r抜けてたHierarchical
111 名前:デフォルトの名無しさん mailto:sage [04/04/12 16:54] >>106 統計やるならRが結構ナイスだ。
112 名前:デフォルトの名無しさん mailto:sage [04/04/12 22:37] >>110-111 Rスレはこっちに↓あ〜る = 統計解析フリーソフト R = science2.2ch.net/test/read.cgi/math/1062650510/
113 名前:デフォルトの名無しさん [04/04/14 12:02] 工科大の www.teu.ac.jp/kougi/koshida/Prog6/Text08/index.html の問題1 ですが、 > sigma :: (Int -> Int) -> (Int -> Int) > 上記の関数sigmaを,1) ラムダ記法を使って,2) 関数の部分適用を使って,定義せよ.ただし,sigma fは,自然数nに対して > f 0 + f 1 + ... + f n > を計算する関数とする. lambda 版 は以下のように作成しました。 sigmaLambda :: (Int -> Int) -> (Int -> Int) sigmaLambda f = \x -> sum [f i | i <- [0 .. x]] で、部分適用版ですが、 sigma :: (Int -> Int) -> Int -> Int sigma f 0 = f 0 sigma f n = sigma f (n-1) + f n で、いいんでしょうか。 題意のような関数を返すのですが、部分適用という感じがしません。 出題者がどのような回答を期待しているか知りたいのですが。 (あと、なんか lambda版を、内包表現とか使ってて、出題意図に沿ってないような気がするのです)
114 名前:デフォルトの名無しさん mailto:sage [04/04/14 13:37] >>113 > 題意のような関数を返すのですが、部分適用という感じがしません。 addNum'' n m = n + m に部分適用を使ったといっているのだからそれでいいだろう。 sigmaPartial f n = sum [f m | m <- [0..n]] > (あと、なんか lambda版を、内包表現とか使ってて、出題意図に沿ってないような気がするのです) それなら使わなければいいのでは? sigmaLambda = \f n -> if n == 0 then f 0 else sigmaLambda f (n - 1) + f n
115 名前:デフォルトの名無しさん [04/04/14 14:00] sigma,sigma' :: (Int -> Int) -> (Int -> Int) sigma f = \ n -> foldl (\ s i -> s + f i) 0 [0..n] sigma' f = let iter s x = if x < 0 then s else iter (s+f x) (x-1) in iter 0
116 名前:デフォルトの名無しさん mailto:sage -- "let" sucks! [04/04/14 14:37] import Control.Monad.Fix (fix) -- fix f = f (fix x) sigma = flip fix 0 $ \s t f n -> if n < 0 then t else s (t + f n) f (n - 1)
117 名前:デフォルトの名無しさん mailto:sage [04/04/14 14:38] fix f = f (fix f)ね。
118 名前:デフォルトの名無しさん mailto:sage [04/04/19 19:21] Haskell に例外処理の機構はあるの?
119 名前:デフォルトの名無しさん mailto:sage [04/04/19 19:37] ある。 Haskell98でもIOモナドからthrowできる例外(IOError)があるし、 最近のGHC、Hugsでは普通の関数からも例外(Exception)をthrowできる。 catchはIOモナドの中でおこなう。 参照: Control.Exception
120 名前:デフォルトの名無しさん mailto:sage [04/04/20 23:50] Haskell勉強中なんですけど、 「モナドは継続渡しを提供する」という大雑把な理解でいいでしょうか? ・・・違うかな?
121 名前:デフォルトの名無しさん mailto:sage [04/04/24 22:23] なんで Prelude で (!!) は Integer じゃなくて Int で定義されているの?
122 名前:デフォルトの名無しさん mailto:sage [04/04/25 02:07] >>121 実際問題それ以上使うことはないからだろう。 Haskell 98 Report によると maxBound::Int は少なくとも 2^29-1。 (!!)のインデックスは0-originだから、長さ2^29のリストまで扱える。 これ以上の長さのリストを使う場面は……。
123 名前:デフォルトの名無しさん mailto:sage [04/04/25 12:41] 円周率の世界記録に朝鮮したい人はどうすれば?
124 名前:デフォルトの名無しさん mailto:sage [04/04/25 18:11] >>123 自分で最低義すれ。
125 名前:デフォルトの名無しさん mailto:sage [04/04/26 14:54] >>123 円周率は全桁保持していなくても次を計算できたはず。 >>124 アドレスの制限があるから多くの計算機と既存の処理系では 再定義しても無駄。
126 名前:デフォルトの名無しさん mailto:sage [04/04/26 23:48] >>120 こんなん見つけた ttp://www.jaist.ac.jp/~kiyoshiy/writing/wadler_essenceoffunctionalprogramming.pdf ここの資料はjaistのゼミ資料? 他にはHaskellDBが自分的に興味深い. TorqueとかHibernateなんて目じゃない. Haskellだけど…
127 名前:デフォルトの名無しさん mailto:sage [04/04/27 14:27] >>121 haskell@でもちょうど議論されてるね。 上ででたものの他に、こういう意見があった。 Integer派: * Lazyにcreated/destroyedなデータならアドレスの制限を 受けずに大きいものを利用できるはずだ。 * Intは一般的なケースへの最適化であり、 "Premature optimization is the root of all evil." Integerには反対派: Integerにするのは、巨大なリストという特殊な状況への最適化である。 (Integral b) => がよろしい。
128 名前:デフォルトの名無しさん mailto:sage [04/04/27 18:46] Hanatani さんすげーな。 オレもああいう凄腕Haskellerになりたい。
129 名前:デフォルトの名無しさん mailto:sage [04/04/28 12:39] >>128 なんか凄いもの作ったの?
130 名前:デフォルトの名無しさん mailto:sage [04/05/05 01:32] しばらく見ないうちに「関数型言語」のスレがひどいことになってるな。
131 名前:デフォルトの名無しさん mailto:sage [04/05/05 02:34] >>130 Aranskさま〜〜早くこのスレにも御光臨してくださいませ〜〜 Aranskさま〜〜早くこのスレにも御光臨してくださいませ〜〜 Aranskさま〜〜早くこのスレにも御光臨してくださいませ〜〜 Aranskさま〜〜早くこのスレにも御光臨してくださいませ〜〜 Aranskさま〜〜早くこのスレにも御光臨してくださいませ〜〜
132 名前:デフォルトの名無しさん [04/06/27 22:34] たま〜にはあげてみる Haskell Support for the Eclipse IDE eclipsefp.sourceforge.net/ 0.3.0はEclipse最新var.(M9〜正式版)に対応しているぞ。
133 名前:デフォルトの名無しさん [04/06/30 18:10] おお. しかしスクリーンショットがほしい所かも. 後でインスコしてみるか… Fudgets www.cs.chalmers.se/Cs/Research/Functional/Fudgets/ 触ってる人いる? これから弄ってみようと思うのだけど. featureのページに, Declarative flavour. While it is possible to enable GUI programming in a functional language by providing an interface to an imperative GUI toolkit and, in effect, using an imperative sub-language within the functional language, Fudgets provide a declarative style of programming also for the construction of GUIs. とある. なんだか期待大.
134 名前:デフォルトの名無しさん mailto:sage [04/06/30 20:48] >>133 使えたら是非おしえてくれ。 Declarative GUI toolkitって数年前から どれもメンテが止まってるっぽいんだよな。 最近ではwxHaskellがスタンダードになりつつあるけど、 やっぱりHaskellならDeclarativeにやりたい。
135 名前:デフォルトの名無しさん [04/07/17 08:42] Haskell Marathon www.sampou.org/cgi-bin/cahier.cgi
136 名前:デフォルトの名無しさん mailto:sage [04/07/18 09:25] Haskell で Marathon を実装するのかとオモタ。
137 名前:デフォルトの名無しさん mailto:sage [04/07/26 01:14] マラソン参加してみようかな。入門ページ読んだくらいで準備はよいだろうか
138 名前:デフォルトの名無しさん mailto:sage [04/07/29 09:20] マラソン直前に台風直撃の悪寒
139 名前:デフォルトの名無しさん mailto:sage [04/08/09 23:33] LL WeekendでのHaskellに対する聴衆の感想は「Haskellのコードはよくわからない」というのが多かったみたいでつね
140 名前:デフォルトの名無しさん mailto:sage [04/08/10 01:19] 5分だか7分だかでわかれという方が無理があるという話がある。発表者陣はよ くやったと思うよ。 「わたしはもうループも書けなくなってしまって……」というのにワロタ。
141 名前:デフォルトの名無しさん mailto:sage [04/08/11 02:33] LL侍はHaskellを斬ったの?
142 名前:デフォルトの名無しさん mailto:sage [04/08/12 01:39] >>141 「Hello, worldもブラックボックス斬り」されてました。
143 名前:デフォルトの名無しさん mailto:sage [04/08/12 13:41] おれはhaskell haskell haskellだ 関数型の haskellだ 短くて 簡潔で 理解しやすいコードを書けるぜ って、言うじゃない だけど 難しくて monad が理解できませんから 残念! 「Hello worldさえブラックボックス」 斬り
144 名前:デフォルトの名無しさん [04/08/12 20:55] むしろHello, worldだから難しいような気がする
145 名前:デフォルトの名無しさん mailto:sage [04/08/12 21:58] main = do putStr "Hello, World!" で済むから、コード自体は特に難しくは見えない。 ただ、入門者が Hello, World に到達するまでの過程が難しいんだよね……。
146 名前:デフォルトの名無しさん mailto:sage [04/08/12 22:00] >>145 そのdoはいるの?
147 名前:145 mailto:sage [04/08/12 23:13] この場合はいらないけど、先々のことを考えたら入れた方がいいかな、とちょっ とだけ思ったのです。 main = do str <- getLine putStr str みたいに。
148 名前:デフォルトの名無しさん mailto:sage [04/08/13 07:57] いきなりIOから入るのがまずい。 fact→fib→qsortあたりから入れば 得体の知れないモナドをとりあえず回避できる。
149 名前:デフォルトの名無しさん mailto:sage [04/08/13 16:25] 再帰とリスト処理しかできないHaskellちゃん がんばってもせいぜい二分木
150 名前:デフォルトの名無しさん mailto:sage [04/08/13 17:34] 膣門です。 "Hindley-Milner" って、何て読むんでつか?
151 名前:デフォルトの名無しさん mailto:sage [04/08/14 01:49] 誰か「モナドだけで書く Haskell プログラミング」を書いてくれい
152 名前:デフォルトの名無しさん mailto:sage [04/08/15 13:29] >>151 Cでも使ってれば?
153 名前:デフォルトの名無しさん mailto:sage [04/08/15 21:34] そういやHaskellのコンパイルはC経由なんだよね
154 名前:デフォルトの名無しさん mailto:sage [04/08/15 22:04] 末尾再帰の保証とかC経由じゃ無理だろ
155 名前:デフォルトの名無しさん mailto:sage [04/08/15 22:21] GHCで最適化オプション付けるとCのコード吐くんじゃなかったっけ?
156 名前:デフォルトの名無しさん mailto:sage [04/08/16 02:59] >>150 メール出して聞いたら? ttp://www-maths.swan.ac.uk/staff/jrh/ J. Roger Hindley ttp://www.cl.cam.ac.uk/~rm135/ Robin Milner
157 名前:デフォルトの名無しさん mailto:sage [04/08/16 05:57] >>156 もちつけ
158 名前:デフォルトの名無しさん mailto:sage [04/08/16 06:12] >>154 そりゃ当然、Cにする前にプログラム変換するだろ それに大抵のCCには-foptimize-sibling-callsみたいなのがあるだろうし
159 名前:デフォルトの名無しさん mailto:sage [04/08/16 08:24] レベル低いな。っつってもHaskellのことは何も知らないのであれなんだが。。。 ユーザーレベルで言語をマスターするっつーのは、ある処理系を骨までしゃぶり 尽くすことだろ。リスパーのように自作こそ最強だが、複雑な言語ではそこまでは まあ、なかなか出来るもんでもないしな。 GHCのことについて詳しい奴がいないのを見ると、誰もHaskellでまともに プログラム書こうとしてないように見える。結局おまいらは、話のネタに 関数型言語を選んでるだけなんだよ。
160 名前:デフォルトの名無しさん mailto:sage [04/08/16 23:20] ↑Aransk?
161 名前:デフォルトの名無しさん mailto:sage [04/08/17 00:31] Simon Peyton Jones は C-- もやってるのに、自前でオプティマイズ出来ないってのは意外。
162 名前:デフォルトの名無しさん mailto:sage [04/08/17 00:50] >160 Aranskはいちゃもん言うだけでプログラムすら書かんだろ?
163 名前:デフォルトの名無しさん mailto:sage [04/08/18 12:47] wxhaskellについてですが、 サンプルプログラムのBouncingBalls.hsでセグメンテーションフォールトが 起きます。(wxhaskell.sourceforge.net/quickstart.html ) プログラムを起動し、'p'などのアルファベットを入力することで生じます。 そこで小さなプログラムを作って試してみたのですが、 やはり同様な現象が起ります。 $ cat test.hs import Graphics.UI.WX main :: IO () main = start test test :: IO () test = do f <- frame [] p <- panel f [] set f [layout := widget p] set p [on(charKey 'a') := print "test ok"] $ ghc -package wx test.hs -o test $ ./test (ここでキーボードの'a'を入力) セグメンテーション違反です 環境 wxhaskellのバージョンは0.7 wxGTKのバージョンは2.4.2 OSはlinux 他の環境でもこのバグが再現するでしょうか。
164 名前:デフォルトの名無しさん mailto:sage [04/08/19 17:20] >>163 特に問題発生せず 環境 wxHaskell 0.8 wxWidget 2.5.2 MacOS X 10.3 $ ghc -package wx test.hs -o test $ /usr/local/wxhaskell/bin/macos-app -v test できたtestをFinderからダブルクリックで起動 真っ白いパネルが出てくる 'a' 押すと「コンソール」に "test ok" とりあえずバージョンアップしてみれば
165 名前:デフォルトの名無しさん mailto:sage [04/08/22 09:05] wxHaskellを0.8にバージョンアップしたら問題は解決しました。 どうもありがとうございます。
166 名前:デフォルトの名無しさん mailto:sage [04/08/22 09:36] このような関数はどう書けばいいんでしょうか? f (+) [1 2 3] [4 5 6] => [5 7 9]
167 名前:デフォルトの名無しさん mailto:sage [04/08/22 11:30] f g (x:xs) (y:ys) = (g x y) : f g xs ys
168 名前:デフォルトの名無しさん mailto:sage [04/08/22 11:41] f g xs ys = [g x y | (x, y) <- zip xs ys]
169 名前:デフォルトの名無しさん [04/08/22 11:55] これを拡張したn引数(n階?)の関数とn個のリストをとる 関数はどう書くのがいいでしょう。 f n g [x11, x12, ...] [x21, x22, ...] ... [xn1, xn2, ...] => [(g x11 x21 ... xn1), (g x12 x22 ... xn2), ...] みたいな。lispのmapってこんな感じですよね。あちらは 関数のarityがわかるからnは不要ですけど。
170 名前:デフォルトの名無しさん mailto:sage [04/08/22 12:19] f g = map (hoge g) $ zip Haskellはよく知らんので、hogeをどうやって書くのか調べてもよく分からん。
171 名前:デフォルトの名無しさん mailto:sage [04/08/22 16:24] 引数の数が可変ってhaskellでは書けないような気が。 何か方法あったっけ?
172 名前:デフォルトの名無しさん mailto:sage [04/08/22 16:45] >>166 zipWith (+) [1, 2, 3] [4, 5, 6]
173 名前:デフォルトの名無しさん mailto:sage [04/08/22 17:19] >>171 別に可変個の引数は必要ない。 1引数の関数のリストと引数のリストを受け取って適用して返す演算子をつくればOK。 演算子をxとすると [f, f, f] x [x11, x12, x13] x [x21, x22, x23] とか。Haskellの細かい文法知らんのでこう書けるかどうかは知らないけど。
174 名前:デフォルトの名無しさん mailto:sage [04/08/22 17:48] どういう型になるんだ?
175 名前:デフォルトの名無しさん mailto:sage [04/08/22 17:53] map sum $ transpose [[1,2,3],[4,5,6],[7,8,9]] => [12,15,18] こんなもんでどうでしょうか。
176 名前:デフォルトの名無しさん [04/08/22 20:04] >>174 [a->b]->[a]->[b]かな?
177 名前:デフォルトの名無しさん mailto:sage [04/08/22 20:10] zipWith ($)
178 名前:デフォルトの名無しさん [04/08/22 20:54] Prelude> (zipWith ($)) (map (+) [1,2,3]) [4,5,6] [5,7,9] ナルホド。
179 名前:デフォルトの名無しさん [04/08/23 11:43] 只の関数適用(f x)と(f $ x)って何か違うところあるの? それとも( )じゃワケがわからないから($)と書けるように 目に見える演算子として用意されているだけ?
180 名前:デフォルトの名無しさん mailto:sage [04/08/23 12:19] $ は関数合成では?
181 名前:145 mailto:sage [04/08/23 12:35] 関数合成は . でしょ。 >>179 何も代わらない。関数適用のための演算子だから。 本来の利用法は >>178 みたいなものなのかな(個々の要素にそれぞれ適用する ためには、関数適用の演算子があると便利)。 f $ g x と書くと、演算子の優先度の関係上 f(g x) と同じことになるので便 利、ついでに結合性の関係で f $ g $ h x とか書ける、というのが個人的に は嬉しい。カッコの省略にも使える。 関数合成はあくまで関数の合成の演算子なので、 f . g . h x とは書けない。 (f . g . h) x なら書けるけど。
182 名前:デフォルトの名無しさん mailto:sage [04/08/23 16:17] 可変個数の zipWith については、 Functional Pearl "Do we need dependent types?" Daniel Fridlender and Mia Indrika, 2000 J. Functional Programming, vol. 10, July. ttp://www.cs.chalmers.se/~indrika/publication.html に載っているので興味があるひとは読んでみるべし。
183 名前:デフォルトの名無しさん mailto:sage [04/08/24 12:40] >>171-181 > 只の関数適用(f x)と(f $ x)って何か違うところあるの? ある。$はただの関数だから、引数の型がそこで固定される。 f :: a -> (forall b. b -> b) -> a f x g = g x とすると、f 0 id はOKだが、f 0 $ id はだめ。 ST Monadなんかをつかっていると結構引っかかる。
184 名前:デフォルトの名無しさん [04/08/24 14:37] -- zipWithN infixl 2 <$> infixl 1 <-> (<$>) = map (<->) = zipWith ($) -- 例 -- (\x y z -> x + y + z) <$> [3,4] <-> [5,6] <-> [7,8] ---------------------------- -- 可変引数 ncat :: NCat b => b ncat = ncat' id class NCat a where ncat' :: (String -> String) -> a instance NCat String where ncat' f = f "" instance NCat b => NCat (Char -> b) where ncat' f x = ncat' (f . (x:)) -- 例 -- ncat 'a' 'b' 'c' # >>183 の171は179の間違い。
185 名前:デフォルトの名無しさん mailto:sage [04/08/24 14:38] >>184 型指定が要った。 ncat 'a' 'b' 'c' :: String
186 名前:デフォルトの名無しさん mailto:sage [04/08/24 20:08] 携帯から読むと AA 判定されててワラタ >>183-185
187 名前:デフォルトの名無しさん mailto:sage [04/08/26 20:44] AA的プログラミング
188 名前:デフォルトの名無しさん mailto:sage [04/08/26 20:54] (--#) とか (*^-^*) とか?
189 名前:デフォルトの名無しさん mailto:sage [04/08/30 23:20] Categories for the Working Mathematician の訳書ってなんていうタイトルでつか?
190 名前:デフォルトの名無しさん mailto:sage [04/08/30 23:27] スマソ。 「そのうち出る」 = 「そのうち出版される」という意味か。 「テキストの候補に挙がる」ではなく。
191 名前:デフォルトの名無しさん mailto:sage [04/08/31 00:44] 誤爆にも程があります
192 名前:デフォルトの名無しさん mailto:sage [04/08/31 12:01] 「数学に勤しむ貴方のための圏論」てのがそれらしいが 近刊とあってまだ出てないようだ。 ttp://www.kyoto-su.ac.jp/~hxm/hxm.cc/research.ja.html
193 名前:デフォルトの名無しさん mailto:sage [04/09/07 17:30] 末尾再起すると、遅延評価されないですね。 (length (hoge xx yy zz)) < 3 とかで困る。かも。
194 名前:デフォルトの名無しさん mailto:sage [04/09/07 20:50] >>193 > 末尾再起すると、遅延評価されないですね。 そんなことはない。 > (length (hoge xx yy zz)) < 3 > とかで困る。かも。 lengthがstrictだからhogeがlazyでも意味がないとはいえるが、 末尾再帰とは無関係なので、意味がわからない。 なにを誤解してるのですか?
195 名前:デフォルトの名無しさん mailto:sage [04/09/08 10:49] >>193 『末尾再帰の最適化』をすると遅延評価できない(或いはその逆)、のことを言いたいのかな。 それだったら解る。 あ、でも例 (length (hoge xx yy zz)) < 3 の意味はやっぱりわからない。
196 名前:デフォルトの名無しさん mailto:sage [04/09/08 18:24] >>195 > 『末尾再帰の最適化』をすると遅延評価できない(或いはその逆)、のことを言いたいのかな。 詳しく説明きぼんぬ。 gotoでジャンプするコードにするとサンクが作れないのかな?
197 名前:デフォルトの名無しさん mailto:sage [04/09/09 23:56] >>195 take n 末尾再帰関数(無限リスト) みたいなのが出来ないということでは?
198 名前:197 mailto:sage [04/09/10 00:26] 括弧の位置を間違えた。 take n (末尾再帰関数 無限リスト ・・) です。
199 名前:193(初心者) mailto:sage [04/09/10 16:18:42] すいません。どっかいってました。 >197さんの言うとおりです。 例は適当にかいたらだめでした。
200 名前:デフォルトの名無しさん mailto:sage [04/09/10 16:25:19] >>197-198 なにができないと? take' 0 xs = xs take' n (x:xs) = take' (n - 1) xs take n (take' 10 [0..])
201 名前:197 mailto:sage [04/09/10 21:59:52] >>200 返値も無限リストの場合です。 nub0 :: Eq a => [a] -> [a] nub0 = nub0' [] nub0' l [] = l nub0' l (x:xs) | elem x l = nub0' l xs | otherwise = nub0' (x:l) xs take 10 (nub0 [1..])
202 名前:デフォルトの名無しさん mailto:sage [04/09/10 22:16:02] >>201 nub0 [1..]自体がbottom(無限リストではない)なんだから 末尾再帰も糞もないですよ。 nub0' :: [Int] -> Int nub0' = foldr (+) 0 だって同じこと。
203 名前:197 mailto:sage [04/09/10 23:25:33] いろいろと書き方がまずくてすみません。 nub0 を末尾再帰で定義したから、nub0 [1..] が bottomになったわけで、Hugsでの定義の nub l = nub' l [] where nub' [] _ = [] nub' (x:xs) ls | x `elem` ls = nub' xs ls | otherwise = x : nub' xs (x:ls) のようにすれば nub [1..] は無限リストになる、という意味です。
204 名前:デフォルトの名無しさん [04/10/07 21:01:01] いいかげん誰かモナドをわかりやすく説明してくんない? 関数型言語のキモは副作用とのコラボレーションなんだし
205 名前:デフォルトの名無しさん mailto:sage [04/10/08 02:06:46] >>204 www.sampou.org/haskell/a-a-monads/html/index.html ではだめ?
206 名前:デフォルトの名無しさん mailto:sage [04/10/14 01:54:56] んじゃ自分の理解度の確認を兼ねて。(突っ込みよろしく) モナドは数学上はモノイドといって単位元を持つ半群のこと。 一応簡単な説明。 (X * X ) * X = X * ( X * X ) といった「結合側」が成り立つ演算*があって (E * X ) = ( X * E ) = X となる単位元Eを持つようなXのこと。 X が整数だとすれば * は足し算 E は 0 もちろん * を掛け算 E は 1としてもいい。 * を文字列の結合 , Eを空文字列 "" とすれば文字列もモノイドとみなせる。 で、HaskellのIO型には 上の文字列モナド(モノイド)の1文字づつの代わりにOSのシステムコール呼び出しの機械語が 入っていると思えばいい。 IOモナドA( [キー入力] ) >> IOモナドB( [画面出力] ) を適用すると IOモナドC( [キー入力]の次に[画面出力] ) になる みたいな。 で どんどん >> や >>=で繋いでいくわけ。 もちろん結合則も成り立つ。 ちなみにreturn 関数が返すIO型が単位元になってる。 これはreturnの返すIOには何もシステムコール?が含まれてないから 上の文字列モナドの空文字列みたいな感じ これで宜しいでしょうか>>204
207 名前:デフォルトの名無しさん mailto:sage [04/10/14 03:55:12] >>206 Monoidだと思って話すなら: 結合法則: (a * b) * c = a * (b * c) を満たす演算*が定義されていて、 単位元 e (e * a = a * e = a をみたす) を持つような集合を Monoid(以下、単に半群という)といいます。 例えば"行列"や"微分方程式の解作用素"は半群になっています。 *** Point(1): a * b /= b * a。順序は変えられない この半群の集合への作用(注1)の仕方を定めたものがMonadです。 return == e で、あとは * にあたるものが >>= となります。 そういうと、return :: a -> M a (M "a" なのは単位元だから) なんだから、 >>= :: (s -> M t) -> (t -> M u) -> (s -> M u) じゃないのかと思うかも知れませんが、 >>= :: M t -> (t -> M u) -> M u でもいいのです。 というのは、(c * d)' x = c' (d' x)なので、*を決めることと、 M sの任意の元(d' x 等)をどこにうつすかを決めることは同じことだからです。 続く。
208 名前:207 mailto:sage [04/10/14 03:57:32] この行は前のメッセージの最後にあるべきでしたが、 *** Point(2): x /= y ならば a' x と a' y は等しくなくてもよい さて、例えばIOモナドなら、putStr :: String -> IO () は上のaやらbやらにあたります。ではgetLine :: IO Stringはというと、 元を一つしか持たない集合をUとしてgetLine :: U -> IO String の省略記法 なのです。元が一つしかないのだから、わざわざU->を考える必要はありません。 Point(1)、(2)がIOの、順序を変えられない、毎回違う答えが帰るかもしれない という性質を満足させてくれます。 main = getLine >>= putStr は、(putStr * getLine) と同じもので、 実行するのは putStr' (getLine' world) を計算することです。 getLineが毎回異なる文字列をputStrに>>=で与えても、それはworld が違ったからだと思えばなにも問題はありません。 *1 (作用) 行列をベクトルにかけるとベクトルができますが、これと同じように、 半群(M)の元(a, b, ..)をある集合(S)の上の関数とみなすことができます。 好き勝手に関数とみなすのではなく、次の性質をみたすとき、 半群MがSに作用している、ということにします。関数とみなすときには'をつけます。 (a * b)' x = a' (b' x) (x は S の元) # monoidとmonad (triple)はどちらも数学の概念で、似ていますが別物です。
209 名前:デフォルトの名無しさん mailto:sage [04/10/14 08:51:55] (X * X ) * X = X * ( X * X ) といった「結合側」が成り立つ の()の意味はなんだ? 単に型が合うかどうかか?演算の時間的な順番か?
210 名前:デフォルトの名無しさん mailto:sage [04/10/14 09:25:14] >>209 演算の順序。 代数の本を読めばどしょっぱなに書いてあるよ。
211 名前:デフォルトの名無しさん mailto:sage [04/10/14 09:29:17] じゃあ(入力 * 出力)* 入力 = 入力 * (出力 * 入力)になって 最初に出力してくれるのかい?
212 名前:デフォルトの名無しさん mailto:sage [04/10/14 11:05:33] コードの結合順序と、実行順序を混同するな。 Cで {{f(); g();} h();} と {f(); {g(); h();}} が同じ結果になる みたいなものだ。
213 名前:デフォルトの名無しさん mailto:sage [04/10/14 15:33:35] だから(X * X ) * X = X * ( X * X )ってのはどういう意味なの?
214 名前:デフォルトの名無しさん mailto:sage [04/10/14 16:42:30] >>213 モノイドの説明だとしたら、その式はそうとしか言えないのでは。整数上の加 算について考えると、 (1+2)+3 = 1+(2+3) が結合則。 1+0 = 0+1 = 1 が単位元の性質ということ。数学の話だよ。 モナドだとすれば、 >>207-208 じゃないのか。 (f * (g * h)) x = ((f * g) * h) x = f(g(h(x))) という風に理解したんだがこれは当ってる? Haskell の記法を使えば、 x >>= (\x -> x >>= h >>= g) >>= f = x >>= h >>= (\x -> x >>= g >>= f) かな? モナドというのは、「評価の順序を保証するもの」という風に考えているんだ が、その事を「結合則は成立するが、交換則は成立していない」という事で表 現しているということなのでは。 副作用の話は 208 の方に書いてあると思うんだが、こっちはよくわからない……。
215 名前:デフォルトの名無しさん mailto:sage [04/10/14 17:00:35] >>214 > 「結合則は成立するが、交換則は成立していない」 「交換則は必ずしも成立するわけではない」のほうが適当では?
216 名前:デフォルトの名無しさん mailto:sage [04/10/14 17:05:38] この場合の(X * X ) * X = X * ( X * X )の意味は どういう風に括弧をつけても関数Xの適用順序は 左から右、右から左と一定であるって意味でいいの?
217 名前:デフォルトの名無しさん mailto:sage [04/10/14 17:17:39] >>215 ああその通りですね。失礼しました。 >>213 =216 まあその通りといえばその通りではないかと思います。 *を関数の合成みたいな演算だと考えればよいのでは。
218 名前:デフォルトの名無しさん mailto:sage [04/10/14 17:22:34] で、208に質問なんですが、 > *** Point(2): x /= y ならば a' x と a' y は等しくなくてもよい はわかるとして、 GetLine :: U -> IO String であり、 U が一点集合なのだ としたら、これは x = y である(にもかかわらず a' x /= a' y になりうる) 例のように読めてしまったのですが、どこで間違えているんでしょうか? getLine' world というのは、常に world が与えられるが、 world が毎回異 なるので返り値が異なることがあるっていうこと? でもそれって一点集合な んでしょうか?
219 名前:デフォルトの名無しさん mailto:sage [04/10/14 17:26:23] 結合法則は分かったが *** Point(1): a * b /= b * a。順序は変えられない *** Point(2): x /= y ならば a' x と a' y は等しくなくてもよい Point(1)、(2)がIOの、順序を変えられない、毎回違う答えが帰るかもしれない という性質を満足させてくれます。 っていうのは普通の関数とどこが違うの? 普通の関数でもそういうのあるんだから、 モナドとかいわずに普通の関数と一緒に扱えばいいじゃない。
220 名前:デフォルトの名無しさん mailto:sage [04/10/14 17:33:16] x = yでもa' x と a' yは等しくなくてもいいんじゃない?
221 名前:デフォルトの名無しさん mailto:sage [04/10/14 17:50:24] 結合法則は満たすけど交換法則は満たさないって状況、 小学校でやる一般的な算数にある?
222 名前:デフォルトの名無しさん mailto:sage [04/10/14 17:52:51] 引き算、割り算
223 名前:デフォルトの名無しさん mailto:sage [04/10/14 18:00:53] 結合法則満たすのか?
224 名前:デフォルトの名無しさん mailto:sage [04/10/14 18:01:04] perl -e '$op="-"; print eval "4 $op (3 $op 2)"' perl -e '$op="-"; print eval "(4 $op 3) $op 2"' これ、答えが違っちゃうけど、、なんか間違ってます?
225 名前:デフォルトの名無しさん mailto:sage [04/10/14 18:16:35] >>219 > っていうのは普通の関数とどこが違うの? > 普通の関数でもそういうのあるんだから、 どこの世界の関数だそれは(w
226 名前:デフォルトの名無しさん mailto:sage [04/10/14 18:23:24] べき乗とかなら交換したら意味がちがうし x /= y ならば a' x と a' y は等しくないんちゃう?
227 名前:デフォルトの名無しさん mailto:sage [04/10/14 18:27:33] もちつけ。モノイドがモナドなわけじゃないぞ。 > この半群の集合への作用(注1)の仕方を定めたものがMonadです。
228 名前:デフォルトの名無しさん mailto:sage [04/10/14 18:29:58] >>219 逆で、関数でそういう性質が成り立って、文字列の連結や状態遷移でもそういう性質が成り立つからそれらを抽象化してモナドにしたってこと。 連結リストや配列リストの性質を抽象化してリストとして扱うようなのと同じ。
229 名前:デフォルトの名無しさん mailto:sage [04/10/14 18:31:50] じゃあ普通の関数もモナド?
230 名前:デフォルトの名無しさん mailto:sage [04/10/14 18:42:39] >>220 x = y で a' x = a' y でなくても構わないっていうのは数学的にはおかしい 気がしますが。 プログラム的には副作用が起きているなら成立すると思いますが、その副作用 を上手く扱うのがモナドなんじゃないの?
231 名前:デフォルトの名無しさん mailto:sage [04/10/14 18:54:09] 順序は正しく守って、毎回違った答えが出ても 処理系はエラーを出さず理論的にもきちんとまとめられるってことか?
232 名前:207 mailto:sage [04/10/14 19:02:54] >>218 そうですね。すみません。208は全然ダメです。 モナドをモノイドで押し切ろうというのは無理がありました。
233 名前:デフォルトの名無しさん mailto:sage [04/10/14 19:03:15] >>229 普通の関数だと、たとえば f(g(x), h(y)) がどの順番で評価されるかは不定。でも、モナドを使えば、その順序を確定さ せることができる。 ……副作用とかいう話じゃなくて、順序を確定させることが重要なのかなあ。 順序が確定的だから、副作用が起きるコードでもOKみたいな感じ?
234 名前:デフォルトの名無しさん mailto:sage [04/10/14 19:06:11] モナドってのは何をさすんだい? a * bだったらaやbがモナド?それとも*がモナド?
235 名前:207 mailto:sage [04/10/14 19:15:28] >>233 順序と、引数返り値に直接アクセスできないところが味噌です。 type IO a = world -> (a, world) なら、main world0 = let (s, world1) = getStr world0 in print s world0 とかやってしまえないようになるところ。 >>234 a, bと*の組みです。 行列群が、行列と行列のかけ算の両方がないと考えられないのと同様に。
236 名前:デフォルトの名無しさん mailto:sage [04/10/14 19:18:35] a,bはプログラム中の式 *は各式の関係を表す演算子
237 名前:207 mailto:sage [04/10/14 19:27:09] >>232 自己レスもちろん>>207 もだめです。 モナドは雰囲気はモノイドなんですがやっぱりモノイドとは みなせそうにないので、これも嘘です。 > この半群の集合への作用(注1)の仕方を定めたものがMonadです。 予想と違って、正しいかもしれないものだと素直に読んだ方が 多かったようで、申し訳ないです。
238 名前:デフォルトの名無しさん mailto:sage [04/10/14 19:31:13] 理解した部分だけ書くと、結合法則を満たす関数の合成を使うと IOのような実行の順序が重要な意味をもつ関数を(順序不定で)合成しても 合成された関数は一意的な順序でIOが実行される関数になるということか? 順序を保つ合成が結合法則を満たすのは分かったが、 結合法則を満たす合成は全て実行の順序を保つでいいのか?
239 名前:デフォルトの名無しさん mailto:sage [04/10/14 21:14:39] >>238 順序不定には合成できないから、明示的に順序をつけることを強制できる。 putStr (getLine, [getChar]) でなく getLine >>= (\s -> getChar >>= (\c -> putStr (s, [c]))) か getChar >>= (\c -> getLine >>= (\s -> putStr (s, [c])))
240 名前:デフォルトの名無しさん mailto:sage [04/10/14 21:26:54] じゃあモナドは実行の順序が決められてる関数の中の一つってことか?
241 名前:デフォルトの名無しさん mailto:sage [04/10/14 21:57:19] 例えば左から右へ順番に実行する関数hogeが定義できて、 hoge getLine getCharから getLine >>= (\s -> getChar >>= (\c -> putStr (s, [c])))と 同じ動作を定義できるのか?
242 名前:デフォルトの名無しさん mailto:sage [04/10/15 01:54:14] >結合法則を満たす合成は全て実行の順序を保つでいいのか? これは成り立たないと思う。 モナドの結合法則の概念と順序は本来関係ないんじゃないかな。 たまたま順序を組み立てるのにモナドが使えるってだけだと思う。 www.sampou.org/haskell/a-a-monads/html/introII.html ↑のListモナドとかは 順序とは関係なさそうだし。(関数から複数の遅延込みの非正格値を返すためのもの?) モナドの用途は順序の決定のみにあらずってとこか。
243 名前:デフォルトの名無しさん mailto:sage [04/10/15 04:12:02] >>241 hoge :: IO String -> IO Char -> IO () hoge f g = f >>= \s -> g >>= \c -> putStr (s, [c]) getLine :: String、getChar :: Char だったら無理。
244 名前:デフォルトの名無しさん mailto:sage [04/10/15 04:13:08] >>242 > List モナドは非決定性をもつ計算の連鎖を、演算をそれぞれのステップで可能なすべての値に適用することで、合成する戦略を内包しています。 だけなら、モナドでなくてもいいね。 ------------ module MList where data MList a = a :*: (MList a) | MNull deriving (Eq, Show) infixr 3 :*: instance {- Broken -} Monad MList where (x :*: xs) >>= f = merge (f x) (xs >>= f) where merge (x :*: xs) ys = x :*: merge ys xs merge MNull ys = ys MNull >>= f = MNull return x = x :*: MNull fail s = MNull toMList xs = foldr (:*:) MNull xs (>=>) = (>>=) -- 2ch : ">> が多すぎます!" (>=>) :: Monad m => m a -> (a -> m b) -> m b test f = test1 f == test2 f test1 f = f [1,2] >=> \x -> f [3, 4] >=> \y -> f [5, 6] test2 f = (f [1,2] >=> \x -> f [3, 4]) >=> \y -> f [5, 6]
245 名前:デフォルトの名無しさん mailto:sage [04/10/15 08:50:04] そうだよなあ。 モナドが「暗黙の引数world」と「関数のeagerな評価」を意味するだけなら,結合法則はなくてもよい。
246 名前:デフォルトの名無しさん mailto:sage [04/10/15 11:05:46] IOモナドについて。 話の流れから多少それるのかもしれませんが、 IOモナドの僕のとらえかたは以下のような感じです。 putStrはStringを引数としてとり、 「その文字列を表示する動作」を返す関数。 であり、putStr "Hello " >> putStr "World" とした場合、putStr "Hello "とputStr "World"のそれぞれが評価される 順番は問題ではない。 putStr "Hello "が評価された時点では、 "Hello "は出力されずに、「"Hello "を出力する動作」が 決定するだけである。 そして、putStr "Hello " >> putStr "World"は、 "Hello "を出力した後に"World"を出力する動作として評価される。 この時点では何の出力も生じない。 この動作は、main = ...というように、mainに代入されることにより、 評価器とは切り離された装置によって出力に変えられる。 つまり、putStr "Hello " >> (putStr "World" >> putStr "\n") とした場合、putStr "World >> putStr "\n"の部分が先に評価されて、 「"World"を出力した後に、"\n"を出力する動作」となり、 その後に、putStr "Hello "と結び付けられて、 「"Hello "を出力した後に「"World"を出力した後に"\n"を出力」する動作」 となる。 これは、 「「"Hello "を出力した後に"World"を出力」した後に"\n"を出力する動作」 と等しい。
247 名前:デフォルトの名無しさん mailto:sage [04/10/15 12:01:44] >>246 ありがとう、やっとすっきりした。 つまり継続を渡しているわけね。
248 名前:デフォルトの名無しさん mailto:sage [04/10/15 12:14:00] >>246 > であり、putStr "Hello " >> putStr "World" > とした場合、putStr "Hello "とputStr "World"のそれぞれが評価される > 順番は問題ではない。 順番は問題。これは左から評価しないと(されるように>>が定義されてないと)、 putStr "Hello ">> error "Error." 等が正しくうごかない。 > この動作は、main = ...というように、mainに代入されることにより、 > 評価器とは切り離された装置によって出力に変えられる。 上とも関連して、出力しながら内部の式を評価するわけで、 評価し終わったものを実行するのでは「ない」のだから、 main world を評価すると考えるほうがいいのでは。 上で自分でもただStateモナドのようにかいてしまったけれど、 IO a = World -> (a, World) {- ただしStrict -} と思うことにして。 (正則性と関連して実はIOはモナドの結合法則を満たしていなかったような) > つまり、putStr "Hello " >> (putStr "World" >> putStr "\n") > とした場合、putStr "World >> putStr "\n"の部分が先に評価されて、 ここも左から評価される。 あとは大体OKと思う。
249 名前:デフォルトの名無しさん mailto:sage [04/10/15 17:24:40] >>248 >順番は問題。 >>256 は > putStrはStringを引数としてとり、 >「その文字列を表示する動作」を返す関数。 という前提だからいいんじゃないの?
250 名前:デフォルトの名無しさん mailto:sage [04/10/15 18:08:50] >>249 putStr "Hello " >> error "Error." の右辺を先に評価したら"Hello"が表示される前にerrorで終わってしまうでしょ。 正格性解析かなにかで>>の左辺と右辺が Strictにしかも_|_にならずに評価できると知っていたら 何かの気まぐれで右辺から評価するかもしれないけど、基本は左から。 ちなみに右から(Lazyに)評価したら末尾再帰も無意味になるし無限ループも書けない。
251 名前:デフォルトの名無しさん mailto:sage [04/10/15 20:36:06] ちなみに右から(Lazyに)評価したら末尾再帰も無意味になるし無限ループも書けない。 どういう意味だ?
252 名前:246 mailto:sage [04/10/15 21:53:07] 評価という言葉を誤用したみたいです。 putStr "Hello " >> putStr "World"は、 "Hello "を出力する動作の後に、"World"を出力する動作を続けた動作と解釈される。 と言いかえるべきなのかな。 (1+3) : []を、(4ではなく)1+3を空のリストに加えたものと解釈される。 というのと同じで、この1+3が4になるのはmainに関連づけられたとき (とhugsなどで、返り値の表示を求められたとき)のみである。 つまり、putStr "Hello " >> putStr "World"が左から評価されるのは、 print ((1+2):(2+3):[])が左から評価されるのと同様、 値が必要になった時点で評価されるという、遅延評価の性質から理解できる。 print ((1+2):(2+3):[])でまず1+2が、つぎに2+3が評価されるのは、 (:)に左から順に評価するという性質があるのではなく、 必要とされるのが1+2のほうが先であるというためである。 これは、print $ reverse ((1+2):error "foo":(2+3):[])の出力が[5,となる点からも確認できる。 それと同様にputStr "Hello " >> putStr "World"が左から評価されるのは、 まずputStr "Hello "がプログラムの実行に必要とされ、その後にputStr "World"が必要とされるためであり、 (>>)が左から評価されるといった性質を持っている必要はない。 (しかし、(>>)の右側が左側よりも先に必要とされるという状況は考えられないので(>>)が左から評価される性質を持つというのは そんなに間違いではないかもしれない。) putStr "Hello " >> error "Error."がうまく評価されるのも同様で、 "Hello "の出力の際にはerror "Error."を評価する必要がないためである。 現時点での僕の解釈ですので、間違いもあると思います。 Haskellに積まれた概念は非常に興味深いので、 今後も熟考していこうと思っています。
253 名前:デフォルトの名無しさん mailto:sage [04/10/15 23:06:59] どうも隔靴掻痒の感があるな。 モナドの表示的意味は言語仕様に書いてないのか? [| >> |]ρσ = ...?
254 名前:デフォルトの名無しさん mailto:sage [04/10/16 05:09:35] >>252 いったいどういう原理によって > まずputStr "Hello "がプログラムの実行に必要とされ、その後にputStr "World"が必要とされるためであり、 こうなってると思ってるわけですか? mainや(>>)は関数じゃなくてなにかすごく賢い"評価器とは切り離された装置" が何が必要かを見切って必要なところだけ評価するという立場? それならそれでもいいですが… 私は、State(World)についてStrictなMonadだと思えば、 なぜ(>>)の左が先に必要になったのかが、説明できると書いたわけです。
255 名前:デフォルトの名無しさん mailto:sage [04/10/16 05:13:41] >>251 まず、mainだけ特殊な評価をうけるとは考えないことにします。 右から評価されると無限ループも書けないというのは、 main = loop where loop = act >> loop act = print "x" ここでloopの右辺を先に評価したらact >> (act >> (act >> ..))と ネストした列ができるだけでloopの処理が進まないという意味です。 末尾再帰も同様のことになります。 先に述べたように、特殊な評価装置や特殊ルールは考えないので、これは、 (>>)がそういう順序に評価を導くように定義されているということを意味します。 単にmainそのものを評価しても、(\_ -> ...)の形か、 (コンストラクタ) ...の形になって...の部分は評価されずに終わります。 これでは...の中に書いてあるIOアクションの列をどう評価、 実行していけばいいかはわかりません。 そこで、mainは関数であって(type IO a = World -> (a, World)、 プログラムの実行とはmain worldを評価する、つまりmain worldの 返り値を求める評価を行うことだと考えることにします。 例えば(putStr "X") worldを評価すると、 "X"が出力されたWorldを返します("X"が出力される)。
256 名前:デフォルトの名無しさん mailto:sage [04/10/16 05:15:13] これは、普通の評価なので、main worldの返り値(a, world)が求まれば いいので、まず返り値に必要な部分から計算されます。 したがって、遅延評価ならば、a >> bにおいてworldに最後に関与する 「外側」にある"b"のほうから評価が行われるはずだということになります。 これが「右から(Lazyに)」の意味です。 ちろんこれではループも書けないのでIOモナドとしては使えません。 しかし、WorldについてStrictなモナドだとすれば、 左から評価されるようになります。 -- typeではモナドの定義がHaskell98では書けない。 newtype IO a = IO { runIO :: World -> (a, World) } instance Monad IO where ioact >>= f = IO $ \world -> world `seq` let (a, world') = runIO ioact world in runIO (f a) $! world' もしよくわからなければ、Control.Monad.Stateのlazyなstateモナドで loopや末尾再帰のプログラムを書いて挙動を観察してみてください。
257 名前:デフォルトの名無しさん mailto:sage [04/10/16 09:30:25] これに基づいて議論しませんか? www.haskell.org/definition/haskell98-report.pdf
258 名前:デフォルトの名無しさん mailto:sage [04/10/16 10:36:55] >>257 基づいてないと? IOの話なら、規格の性質を満たすIOはいかにして定義され得るか ということを議論しているつもりなんだけど…
259 名前:もなど初心者 mailto:sage [04/10/16 18:27:11] なんかグダグダになってんのか話が進んでるのか判断できないんですが デバッグ辛くないですか?
260 名前:デフォルトの名無しさん mailto:sage [04/10/16 19:02:57] 別に。 > デバッグ辛くないですか?
261 名前:デフォルトの名無しさん mailto:sage [04/10/16 19:06:52] >>257 のreportを見る限り,どちらの方法でもIOモナドの外部仕様を満たせるんじゃない? The >>= operation passes the result of the first operation as an argument to the second operation. ということなので,f >>= gに対して,fの中で起こる副作用がgの中で起こる副作用より先に起こる ようにするには, (1) >>=は,左辺の引数についてstrict (2) g(正確にはgの中での副作用の呼び出し)がstrict のどちらでもよい(ように思える).
262 名前:デフォルトの名無しさん mailto:sage [04/10/16 20:00:26] >>261 > どちらの方法でもIOモナドの外部仕様を満たせるんじゃない? だれが(1)を主張しているの? > (1) >>=は,左辺の引数についてstrict f >>= g のfが先に評価されるだけで、actionの実行とは関係ない。 例えば、f >> (g >> (h >> ..)) の無限列ができるだけでactionが実行されない こともあり得る。 > (2) g(正確にはgの中での副作用の呼び出し)がstrict なにがいいたいのかよくわからない。 Monadの話をしているのだから>>=の性質について話さないと。 >>255-256 理論のことなのかな(そうは読めないけれど)。 それから、IOモナドはこれ > Special operations (methods in the class Monad, see Section 6.3.6) > sequentially compose actions, > corresponding to sequencing operators (such as the semicolon) in imperative languages. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ を要求してるからf >>= gのfが先に評価されるのであって、 >>261 の部分からはそうなるとは限らないことに注意。(cf. LazyなStateモナド)
263 名前:デフォルトの名無しさん mailto:sage [04/10/16 20:43:42] 俺はHaskellのことは余りしらないんだけど、Haskellの言語仕様も MLのように表示意味論(操作意味論でもいいけど)でformalに定義 されてるんじゃないの? 色々と仕様の背後にある意図を考えるのもいいけど、まずちゃんとした定義 を出してくれると素人には有難いなあ。言葉の定義も人によって違うみたいだし。 ちなみに fがstrict <=> f(_|_) = _|_ lazy evaluation <=> λ計算でいうところのnormal reduction ということでいいの?
264 名前:デフォルトの名無しさん mailto:sage [04/10/16 21:33:21] >>263 > MLのように表示意味論(操作意味論でもいいけど)でformalに定義 IOはどうなんだろ? citeseer.ist.psu.edu/peytonjones93imperative.html # 個人的にはHaskellのコミュニティはそういう文化じゃないと思ってる。 # formalなsemanticsがどうとかで論文書くんじゃなくて、 # 新しい便利なアイディアをどんどん導入して実際に使う。 # informalなsemanticsだけど気にしない、みたいなことがよく書いてあるきがする。 # # そういうことに興味がないことによる偏見かもしれない。 ググッたらちょっと古い(1996)けどこんなのも www-fp.dcs.st-and.ac.uk/~kh/papers/io-tutorial/section3_7.html > No formal semantics for these I/O primitives is possible at present, > because there is no complete formal semantics for Haskell itself. formalでないと理解した気がしないなら、 Concurrent Haskell (Simon PJ他)の論文でIOのsemanticsは誰かの論文を参照、 みたいなことが書いてあった気がするから、探してみたら。 > fがstrict <=> f(_|_) = _|_ > lazy evaluation <=> λ計算でいうところのnormal reduction いいんじゃない。ちなみにdataコンストラクタはlifted。
265 名前:デフォルトの名無しさん [04/10/16 22:00:24] normal order reduction ≠ lazy evaluation
266 名前:デフォルトの名無しさん mailto:sage [04/10/16 22:26:55] >>265 等しくはないね。 でもλ計算でいうところのnormal-order reductionをするわけでしょう?
267 名前:デフォルトの名無しさん mailto:sage [04/10/16 22:48:32] どうもありがとう。 Simon Peyton Jones, Andrew Gordon and Sigbjorn Finne. Concurrent Haskell, POPL, 1996. をざっと見たところ、その辺の詳しい話は Roy L. Crole and Andrew D. Gordon. A Sound Metalogical Semantics for Input/Output Effects, CSL, 1994. Andrew D. Gordon. Functional Programming and Input/Output, Cambridge University Press, 1994. を参照と書いてあった。暇なときにみてみよう。 ちなみに"Concurrent Haskell"の論文も結構面白い。IOの話については 下のような記述があった。ご参考…といってもここの人には常識か。 The sequencing combinators, >> and >>=, feed the result state of their left hand argument to the input of their right hand argument, thereby forcing the two actions (via the data dependency) to be performed in the correct order. ... In principle, then, a program is just a state transformer that is applied to the real world to give a new world. In practice, however, it is crucial that the side-effects the program specifies are performed incrementally, and not all at once when the program finishes. A state-transformer semantics for I/O is therefore, alas, unsatisfactory, and becomes untenable when concurrency is introduced, a matter to which we return in Section 6.
268 名前:Haskell???なにそれ?食えるの? [04/10/17 01:10:13] 【ビギナ】初心者が習うべき言語は? part6【必読】 pc5.2ch.net/test/read.cgi/tech/1092932484/494- おい。 Rubyにケチ付けてるこの馬鹿引き取ってくれよ。
269 名前:デフォルトの名無しさん mailto:sage [04/10/17 01:41:49] ほっといてやれ
270 名前:食べられません。 mailto:sage [04/10/17 01:47:28] >>268 > Rubyにケチ付けてるこの馬鹿引き取ってくれよ。 事実誤認だよ。 >>269 ありがとう。
271 名前:デフォルトの名無しさん mailto:sage [04/10/17 03:02:52] >>265 normal reduction = leftmost reduction = lazy reduction じゃなかったっけ
272 名前:デフォルトの名無しさん mailto:sage [04/10/17 03:09:20] eager evaluation と call-by-value が対応して lazy evaluation と call-by-need が対応して normal-order reduction というと call-by-name が対応するといいたいんじゃない?
273 名前:デフォルトの名無しさん mailto:sage [04/10/17 11:45:11] >> 254 > なにかすごく賢い"評価器とは切り離された装置" が必要性を判断してくれると仮定しなければ、 print $ [3, 1+2, 4] !! 0 で1+2が評価されない理由は説明できないと思う。 具体的にはその装置はHaskellの一部であって、 Haskellプログラムの内側では議論できない実装に近い部分の話になって くるんじゃないかな。 >>255 ,>>256 のような議論は有意義だと思うが、 上述したような「装置」によって、(:)と(>>)を同列に扱えるのであり、 (:)にその「装置」が必要とされている以上、 (>>)に他の特別な理論をあてはめるよりは、 必要に応じて評価される。という lazy evaluationの原則を単純にあてはめればすむのではないかと思う。 ちなみに、 IOというものは[](リスト)と同様にそこにある何かであり、 たとえばputStrLn "Hello"が実行されると"Hello"を出力するのは、 [1,2,3]が(!!1)で2を返すのと同様にとらえられるのではないだろうか。 IOは評価時点では出力されずに、実行という次のステップで出力が生じる。 これは、 main = putStr "Hello " `seq` putStrLn "World" での出力が World であるという点からも理解されるのではないだろうか。 HaskellのIOでは評価と実行は切り離されている。ということに今日気付いた。
274 名前:デフォルトの名無しさん mailto:sage [04/10/17 13:33:11] 「評価する」というのと「印字する」というのが微妙に混同されているような、いないような。
275 名前:デフォルトの名無しさん mailto:sage [04/10/17 14:12:57] >>274 > print $ [3,1+2,4] !! 0 あたりのことを言われてるのかな? Haskellにおいて、評価は印字などの動作によってしか引き起されない。 だから、とりあえず単純な印字の例を挙げただけ。 べつに print $ replicate ([3,1+2,4]!!0) "foo" のような例でもかまわない。 (当然この場合も1+2は評価されない。) Haskellでは、IOに関連づけられなければ、式が評価されることはない。 対話的環境でも暗黙のprintがなされていると考えられると思う。 (ちなみに、対話的環境では返り値がIOならばそれの実行を、 それ以外だったらprintをするようになっているのだと思う。) 当然、print $ [3,1+2,4]!!0で、 1+2が印字されないことをもって、評価されないと言っているわけではない。 print $ [3,error "foo", 4] !! 0 で、エラーが生じないというのと同じことを言ったつもりである。 もしかしたら、もっと根本的な誤りを突いているのかもしれない。 そうだったらもう少し詳しい説明をよろしくおねがいします。
276 名前:デフォルトの名無しさん mailto:sage [04/10/17 17:56:48] >>273 を読んで分かった… 君はlazy evaluationがそもそも分かってないんだorz lazy evaluationが、「必要」に応じて評価されるのは、 > > なにかすごく賢い"評価器とは切り離された装置" > が必要性を判断してくれると仮定しなければ、 こういうのがなにかが必要性を判断するわけじゃないよ。 単にoutermost leftmost reductionをしてるだけ。 質問に答えて欲しい。 (0) [3, 1+2, 4] !! 0 と length [0..] > 0 の評価はそれぞれどう進む? (1) seqの初心者が陥りやすい誤解について説明せよ (2) Stateモナドは自分で書ける? (Yes/No) (3) その評価の順序が分かる? (Yes/No) (4) (Lazy)Stateモナドで無限loopが書けないのはわかってる? (Yes/No) > IOというものは[](リスト)と同様にそこにある何かであり、 リストモナドも自分で定義できるし…
277 名前:デフォルトの名無しさん mailto:sage [04/10/17 18:17:15] >>275 > 対話的環境でも暗黙のprintがなされていると考えられると思う。 それってLispでいうrea-eval-print loopなんじゃないの?
278 名前:haskell初心者 [04/10/19 17:22:32] 先月から勉強しているのですが、 haskellでn個の中から、m個を取り出す組み合わせの数、mCnのプログラムの書き方がわかりません。 だれか教えてください。お願いします。
279 名前:デフォルトの名無しさん mailto:sage [04/10/19 17:31:30] 宿題ですか? せめて自分でどこまでやったか書け。
280 名前:haskell初心者 [04/10/19 17:36:04] 課題です、すいません。 漸化式で作るところまでは考えたのですが、C++と違ってfor文が使えないので、 自分ではどうしたらよいかわからなくなってしまいました。
281 名前:デフォルトの名無しさん mailto:sage [04/10/19 18:01:50] 解1: マジメに計算する。階乗はどう書く? mPn はどう書く? 両方が出来 たら適切な引数を与えて割ればいいよね。 解2: mCn = .. + .. といった形で書ける。 .. と .. はどちらもコンビネー ションだけど、 m と n の部分が少し小さい。で、m や n が 0 とか 1 だったらどうなるか、というのを考える。そしたら再帰で書けるよな。 という2つの考え方があるよ。
282 名前:haskell初心者 [04/10/19 18:06:43] なるほど! ありがとうございました。
283 名前:デフォルトの名無しさん mailto:sage [04/10/19 18:42:26] ここは優しいインターネッツですね
284 名前:デフォルトの名無しさん mailto:sage [04/10/19 20:27:15] haskellの課題が出る講義があることに驚き。東大情報? そのレベルの学生が再帰プログラムに不慣れなことにも驚き(失礼!)。
285 名前:デフォルトの名無しさん mailto:sage [04/10/19 21:05:26] 東大理情ではOcamlはやりますがHaskellはやりません。 工学部計数工学科(武市先生のいるとこ)ではHaskellをやる(人もいる)。 それにしても「関数型プログラムは理解し易くて初心者向き」なんじゃないのか...
286 名前:デフォルトの名無しさん mailto:sage [04/10/19 21:39:10] 東京工科大じゃないの? www.teu.ac.jp/kougi/koshida/Prog6/index.html と思ったけど課題内容が違うから違うのかな。
287 名前:デフォルトの名無しさん mailto:sage [04/10/19 22:15:31] 京都産業大学?
288 名前:デフォルトの名無しさん mailto:sage [04/10/19 22:29:15] >>287 呼んだ?
289 名前:デフォルトの名無しさん mailto:sage [04/10/20 02:30:38] 漸化式が作れたのならプログラムのほとんどができたようなもんじゃないか
290 名前:デフォルトの名無しさん mailto:sage [04/10/20 04:03:09] -- 数え上げobscured。c 10 3 などとして使う c = flip ((length .) . filter . (. length . filter id) . (==)) . (foldl ((=<<) . (. (return .) . (:)) . (>>=) ) [[]]) . (flip replicate [True, False])
291 名前:デフォルトの名無しさん mailto:sage [04/10/20 18:34:44] ぐっ。↑を導いた過程の解説きぼんぬ。
292 名前:デフォルトの名無しさん mailto:sage [04/10/20 18:53:01] コマンドプロンプトみたいなものを作ろうと思ってまず下のような単純なのを作って hugsで動かしてみたら問題なく動いたのですが、ghcでコンパイルして実行すると、 プロンプト "$ " が表示されず、適当にキー入力したあと ":!" でループを抜けると、 入力した個数分のプロンプト "$ " がずらずらと表示されてしまいます。 ちなみに、ghciではhugsと同様に期待通りの動作です。 いったいどうすればghcでも期待通りの動作になるんでしょう? main = do { putStr "$ "; str <- getLine; case str of { ":!" -> return (); _ -> main } } ghcはver 6.2.2と6.2.1で試してみましたがどちらも同じ結果でした。
293 名前:デフォルトの名無しさん mailto:sage [04/10/20 19:25:08] hFlush あたりを使うとよいのでは? >>290 の導出過程希望。 まさか直接書いたの?
294 名前:292 mailto:sage [04/10/20 20:09:56] >293 putStrのあとに hFlush stdout を入れてやったらうまくいきました。 でも最初は実行順序が狂ってるのかと思ってしまいました。
295 名前:デフォルトの名無しさん mailto:sage [04/10/20 22:40:10] >>294 ghcはターミナルではLineBufferingだから一行たまるまで出力されない。 hSetBuffering stdout NoBufferingを最初に書いてもいい。 >>291 >>293 手で地道にpoint-freeに書き換えました:-) 元は確か -- not tested c n m = length $ filter ((m ==).length.filter id) $ foldl (\ys xs -> [ x:y | x <- xs, y <- ys]) [[]] $ replicate n [True,False] こんな感じ。 自動化してフィルタプログラムにするとおもしろそう。
296 名前:292 mailto:sage [04/10/20 23:26:27] 表示の問題は解決したんですが、他の部分に影響が出てしまいました。 プロンプトからの入力をParsecを使ってパースしようとしてるんですが、 文法の都合上Parsecのtryを使ってる部分があります。 hFlushとかstdoutは import IO しないといけないみたいなのでやってみると そのtryを使っているところで ERROR ".\test.hs":15 - Ambiguous variable occurrence "try" *** Could refer to: System.IO.Error.try Text.ParserCombinators.Parsec.Prim.try とかいうエラーが出てしまいます。(処理系はhugsです。ghcでも似たようなエラー) どうしたら良いんでしょう? 一応パーサの部分とstdoutが必要な部分は完全に切り離されているので パーサ部分を別のモジュールにしてやることで回避出来ることは確かめましたけど、 それ以外の方法はあるのでしょうか?
297 名前:デフォルトの名無しさん mailto:sage [04/10/20 23:55:30] >>296 import qualified Text.ParserCombinators.Parsec as Parsec して Parsec.try と書くとか import System.IO.Error ( hFlush, stdout, ... -- tryを以外だけリスト) とか For futher details, see section 5.3 of the Haskell 98 report.
298 名前:292 mailto:sage [04/10/21 00:45:52] >>297 ありがとうございます。 後者のやり方を使ってみます。
299 名前:デフォルトの名無しさん mailto:sage [04/10/21 08:35:37] >>295 おおう、そのcならまともに読めますね。 ((=<<) . (. (return .) . (:)) . (>>=)) の部分はやはりlist comprehensionからの変形か。 [[Bool]]が渡っているところをfuseして、さらに読解不能なコードにできるかもw ところで、monadの話はどうなった。
300 名前:デフォルトの名無しさん mailto:sage [04/10/24 15:41:02] なぜ、関数型言語は、Hello Worldを隠したがりますか?
301 名前:デフォルトの名無しさん mailto:sage [04/10/24 15:43:54] ∩___∩ | | ノ\ ヽ | / ●゛ ● | | | ∪ ( _●_) ミ j 彡、 |∪| | >>300 / ∩ノ ⊃ ヽ ( \ / _ノ | | .\ “ /__| | \ /___ /
302 名前:デフォルトの名無しさん mailto:sage [04/10/24 17:18:58] Haskellはじめたばかりなのですが、よくわからないので教えてください。 a = "b" b = 1 c = do "c" d = do 2 と書いて、dだけ、 *** Binding : d *** Outstanding context : (Monad b, Num (b c)) と言われるのはなぜですか?
303 名前:デフォルトの名無しさん mailto:sage [04/10/24 20:58:48] 文字列は文字のリストで、リストはMonadクラスのインスタンスだから。 数値はMonadクラスのインスタンスではないから。
304 名前:デフォルトの名無しさん mailto:sage [04/10/24 23:11:39] >>303 ありがとうございます。 doの中からは、Monadクラスのインスタンスを返すことは出来るけど、 他のものは返せないと。 doの中から数値を返したい場合はどうしたらよいのでしょうか? Monadクラスのインスタンス作って返すしかないってことでしょうから、 returnを使って、IOモナドを返せばいいということなのでしょうか? IOモナドって使わなくてすむなら使わないほうがいいみたいなのですが、 数値を返す関数はdo使わなくてもかけるだろうってことなのかな? Haskellは難しいです。頭がクラクラします。
305 名前:デフォルトの名無しさん mailto:sage [04/10/25 00:15:45] >>304 > doの中から数値を返したい場合はどうしたらよいのでしょうか? 一般には無理。リスト等、中身を取り出せるモナドもある。 f :: Int f = head $ do return 3 > 数値を返す関数はdo使わなくてもかけるだろうってことなのかな? なんでモナドが使いたいのかわからない。 例えばどんな「数値を返す関数」にモナドを使おうと思うわけ?
306 名前:デフォルトの名無しさん mailto:sage [04/10/25 01:22:05] ∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ( ´ 曲`) < モナドナ♪ドーナー♪ドーナー♪ ⊂ )つ \_____________ (_⌒ヽ )ノ `J
307 名前:デフォルトの名無しさん mailto:sage [04/10/25 08:27:33] >>304 引数をとらずに数値を返す関数を書きたいということですか。 Haskellの場合、引数なしの関数は値そのものとまったく同じものになります。 C言語などでは、int some (void) { return 3 }とint some = 3は違うものですが、 Haskellではsome = 3 :: Intとなり両者の区別は存在しません。 また、doの意味を誤解しているようですね。 doというのはある種のシンタックスシュガーで、 do a b c という表記は a >> b >> cというように解釈されます。 この(>>)はMonadクラスで定義された関数なので、 doをMonadクラス以外のものに適用しても意味がありませんし、 doの後に式がひとつの場合も意味がありません。 Haskellの考え方になじむまでは難しく感じると思いますが、 段階をふんで理解していけば大きな困難はないと思います。 hugsでいろいろな関数をつくって遊んでみることをおすすめします。 洋書ですが、「The Craft of Functional Programming」がおすすめです。
308 名前:デフォルトの名無しさん mailto:sage [04/10/25 08:50:08] >>307 訂正 do a b c
309 名前:デフォルトの名無しさん [04/10/25 11:14:48] >>307 > C言語などでは、int some (void) { return 3 }とint some = 3は違うものですが、 > Haskellではsome = 3 :: Intとなり両者の区別は存在しません。 int rand(void) に相当するものはどうなるのでしょうか?
310 名前:デフォルトの名無しさん mailto:sage [04/10/25 11:46:20] >>309 Haskellでは関数は毎回同じ値がかえってこないといけないので、 そのようなものはありません。 では乱数はどうするかというと、 ramdom :: (RandomGen g) => g -> (a, g) のように、generatorを渡して乱数を生成し、次のgeneratorを 返すことで実現します。 実際にはこのままでは使いにくいので、 randoms :: (RandomGen g) => g -> [a] と無限リストにするか(これがお薦めです)、 C言語と同じ様に副作用によってgeneratorの状態を保存するために モナドを用います。 # System.Randomで乱数関係の関数が定義されています。
311 名前:me /= 309 mailto:sage [04/10/25 11:54:05] >>310 こういう、Haskell風の思想を交えた解説は新参者にとって非常に参考になります。
312 名前:304 mailto:sage [04/10/25 13:46:10] 出来れば、あまり人に頼らず勉強したいところなのですが、、、 申し訳ないのですが、考え方があまりに違うので、質問させてもらっています。 詳しく解説していただけて、非常に感謝しております。頭が下がります。 >>305 モナドを使いたくて、doを使っているわけではありません。 doを使いたくて知らないうちにモナドを使っていたようです。 >>306 doについてよく理解していないことがわかりました。 単にc言語の{}に対応した表現が出来るものだと思っておりましたが、違うのですね。 洋書は気合入れて買ってみても、 結局、挫折することは目に見えているので控えさせていただきます。 翻訳版が出るとうれしいです。 関数は同じ値を返さなくてはならないというのも面白いですねぇ。 >>311 ありがたい話しです。 モナドもよくわからない、Haskellのジェネレータもよくわからない。 とにかく、わからないことずくめなので、ゆっくり腰を据えて勉強するしかないなぁ。 Java知ってるから、C#も1日でだいたいわかるって具合には行かないですねぇ。
313 名前:デフォルトの名無しさん mailto:sage [04/10/26 00:20:02] 関数型のプログラムのコツは写像を追うことです、 JavaとかCとかやってると、どうしても手続きに目がいってしまって最初は全然まともに組めないです。 他にも、プログラム中に時間概念が無いので時系列を作り出す必要があるという点にも馴れにくかったです。 この辺はまるで相対論よろしく時間を次元の一つとして捉えて4次元空間的を直接取り扱う感覚を覚えました、 そんな感じで、過去から未来まで全部お見通しの神様の気分でプログラムしてます。 こんな感覚になるまで、僕もかなりの期間悩みました。 乱数なんかもそうですよね、あらかじめ無限個ある全ての乱数を作って置いておくという、 Javaなんかやってると、この感覚はそう簡単にはなじめないですね。
314 名前:デフォルトの名無しさん [04/10/27 17:44:25] --------------------------- import Numeric f :: Float -> Int -> Float f x n = sin (pi*x*(2*n+1)) ----------------------- このプログラムがエラーになる理由を教えてください。 型が不一致といわれるのですが。
315 名前:デフォルトの名無しさん mailto:sage [04/10/27 17:58:07] >>314 n が何なのか知らないが、pi は Float ではなくて?
316 名前:デフォルトの名無しさん [04/10/27 18:04:16] nは整数(自然数)のつもりです。 piは標準ライブラリ定義されているFloatの定数だと思います。 この関数定義自体が出来ないみたいなんですが。
317 名前:デフォルトの名無しさん mailto:sage [04/10/27 18:43:04] >>314 型があわない。 f x n = sin ( pi * x * (2.0 * (fromIntegral n) + 1.0))
318 名前:デフォルトの名無しさん mailto:sage [04/10/27 18:43:12] >>314 型の不一致。 (*) :: Num a => a -> a -> a なので、例えばaがIntでは、Int -> Int -> Intとなり、 aがFloatならば、Float -> Float -> Floatとなる。 違う型同士のかけ算はできない。 この場合、fromIntegralを利用して以下のようにすればいい。 f :: Float -> Int -> Float f x n = sin (pi*x*(2*fromIntegral n+1))
319 名前:デフォルトの名無しさん [04/10/27 19:04:19] ありがとうございます。 fromIntegralで型変換(?)しなきゃ掛け算できないんですね。 ちょっと面倒ですけど、rubyで(1/n)とやるとn>=2で0になってしまう(←これが分からず何時間もロスした^^;) とかよりは明確でいいんですかねぇ。
320 名前:デフォルトの名無しさん [04/10/27 19:08:53] 追加です。 c x t n = (4.0/pi) * exp (-pi^2*t*(2*fromIntegral n+1)^2) * sin (pi*x*(2*fromIntegral n+1)) + (c x t (n - 1)) c x t (-1) = 0 これで「c0.5 0.001 10」を評価するとスタックオーバーフローしてしまう理由を教えてください。
321 名前:デフォルトの名無しさん mailto:sage [04/10/27 19:35:19] これは関数定義の順番の問題。 Haskellでは、先に書かれたものから順にパターンマッチが行われるため、 c x t n = ...はnに対する条件がないため、 nが-1のときもこっちが適用されてしまい、無限ループにおちいる。 c x t (-1) = 0 c x t n = ... の順に並べれば問題は解決する。
322 名前:デフォルトの名無しさん mailto:sage [04/10/27 22:11:34] www.teu.ac.jp/kougi/koshida/Prog6/text02.html ここで使っている、 文字→コード ord :: Char -> Int コード→文字 chr :: Int -> Char という関数が定義されていないようです。 環境はwindows 2000 でhugsを使っています。 :versionと入力すると、以下のように出ます。 -- Hugs Version Nov 2003 :browse Preludeとしてみてもordという関数はないので バージョンUPして使えなくなったということでしょうか?
323 名前:デフォルトの名無しさん mailto:sage [04/10/27 22:38:22] Prelude> :l Char Char> :t ord ord :: Char -> Int
324 名前:デフォルトの名無しさん [04/10/27 23:04:58] >>319 わざわざ Float->Int->FloatにしようとするからfromIntegralが 必要になる。 f x n = sin ( pi * x * (2 * n + 1)) だけで明示的に型を指定するのやめれば *Main> :t f forall a. (Floating a) => a -> a -> a という型になるがあとは勝手にやってくれるよ。
325 名前:デフォルトの名無しさん mailto:sage [04/10/27 23:10:08] あーでもそれじゃnに整数以外の数つっこめちゃうのでだめか。
326 名前:320 [04/10/28 22:17:40] >>321 ありがとうございます。gnuplotでグラフを書かせるためのファイルを 出力しようと目論んでいるのですが、rubyより知的な気分ですね。 可読性はどうなんでしょう。 多少字面は見づらいけど、数学みたいに書けて コンピュータ特有のことを考えないで済む分楽かもしれませんね。
327 名前:デフォルトの名無しさん mailto:sage [04/10/29 01:33:14] >>323 なるほど。:loadしないと使えないのですね。 runhugsやGHCで使う場合というか、ファイルに書いておいて使う場合は、 (なんていったらよいのでしょう?) import Charすればよいのですね。わかりました。 ありがとうございます。
328 名前:デフォルトの名無しさん mailto:sage [04/11/03 13:44:05] みんなこの言語使って何やってるの?
329 名前:デフォルトの名無しさん mailto:sage [04/11/03 15:47:57] 「最近Haskellっていう言語勉強しててね。 いやーCとは全然違うすごい言語だよ。 関数型って言うんだけどね。」 「すごーいよく分からないけどかっこいいー」
330 名前:デフォルトの名無しさん mailto:sage [04/11/03 16:40:43] 「最近Haskellっていう言語勉強しててね。 いやーCとは全然違うすごい言語だよ。 関数型って言うんだけどね。」 「すごーいよく分からないけどかっこいいー。じゃあ、今晩はカレーにしようか?」
331 名前:デフォルトの名無しさん mailto:sage [04/11/03 17:16:56] 今晩はカリーか。
332 名前:デフォルトの名無しさん mailto:sage [04/11/03 17:18:14] 今晩はカリだ。
333 名前:デフォルトの名無しさん mailto:sage [04/11/03 20:22:31] アライグマ Haskell
334 名前:デフォルトの名無しさん mailto:sage [04/11/05 01:38:12] >>328 言語習いたてのワクワクをモ一度味わいたくて。 とりあえずKISSローダ作るのが目標です。
335 名前:デフォルトの名無しさん mailto:sage [04/11/05 08:51:13] KISSローダってなんですか
336 名前:デフォルトの名無しさん [04/11/21 20:03:44] CommonLisp/Scheme と Haskel と ML の中で一番実用に近いのは何? 私は CommonLisp だと思うんだけど。
337 名前:デフォルトの名無しさん mailto:sage [04/11/21 20:09:03] >>336 比較対象が微妙に違っているわけだが。
338 名前:デフォルトの名無しさん [04/11/22 09:26:06]
339 名前:デフォルトの名無しさん mailto:sage [04/11/22 11:49:50] すみません。最近勉強を始めた者ですが、頭が悪いものでどうにもわからず 困っています。よろしければご教授願えませんでしょうか。 3つをまとめる関数 zip3 を zip を用いて定義せよ、という問題で zip3 :: [a] -> [b] -> [c] -> [(a,b,c)] zip3 (x:xs) (y:ys) (z:zs) = change (zip (zip x y) z) : zip3 xs ys zs where change :: [((a,b),c)] -> [(a,b,c)] change [((x,y),z)] = [(x,y,z)] zip3 _ _ _ = [] というものを考えたものの、どこがどう悪いのか自分ではわかりません。 1週間悩んで進展なしで独力では無理なようなので、どなたかお教えいただけませんでしょうか?
340 名前:デフォルトの名無しさん mailto:sage [04/11/22 12:36:43] zip3 :: [a] -> [b] -> [c] -> [(a,b,c)] zip3 xs ys zs = map change $ zip xs (zip ys zs) where change (x,(y,z)) = (x,y,z)
341 名前:デフォルトの名無しさん mailto:sage [04/11/22 15:58:39] >>339 型があってない。っていうかzip使ってない。 > zip3 (x:xs) (y:ys) (z:zs) = change (zip (zip x y) z) : zip3 xs ys zs x , y, z :: aだから zip x y とはできない。(もともとa = [b]でないかぎり) zip3 (x:xs) (y:ys) (z:zs) = (x, y, z) : zip3 xs ys zs と書こうとしてるわけだからこれではzipの使いようがない。 参考>>184 の上半分 zip3 x y z = (,,) <$> x <-> y <-> z
342 名前:デフォルトの名無しさん [04/11/23 10:14:37] {- zipWith :: (a -> b -> c) -> [a] -> [b] -> [c] zipWith f (x:xs) (y:ys) = (f x y) : (zipWith f xs ys) zipWith f [] _ = [] zipWith f _ [] = [] zip :: [a] -> [b] -> [(a,b)] zip xs ys = zipWith mkpair xs ys where mkpair x y = (x, y) -} zip3 :: [a] -> [b] -> [c] -> [(a,b,c)] zip3 xs ys zs = zipWith mkpair xs (zip ys zs) where mkpair x (y, z) = (x, y, z)
343 名前:デフォルトの名無しさん mailto:sage [04/11/23 11:56:51] zip3' = (zipWith (uncurry (,,)) .) . zip
344 名前:デフォルトの名無しさん mailto:sage [04/11/23 17:24:36] zip3' = const zip3 zip
345 名前:デフォルトの名無しさん mailto:sage [04/11/24 12:28:10] 339です。自室のPCからでははじかれてしまって書き込みができなかったので 遅くなってしまいましたが、ありがとうございます。 たいへん助かりました。 …お礼の言葉が遅くなってしまい、申し訳ありませんでした。m(__)m
346 名前:デフォルトの名無しさん mailto:sage [04/12/08 23:32:07] -- Haskell Mode Haskell Haskellモード 関数型言語でーす Haskellモード Haskellモード Haskellモード Haskellモードでーす Haskellモード うにゃ〜 うにゃにゃ lazily evalute! 関数 … カリー様 関数 … か・た・す・い・ろん モナド >>= … わたしのシモベェ〜 モナド >>= … Haskellモード Haskellモード Haskellモード 98モードでーす Haskellモード Haskellモード Haskellモード Haskellモードでーす たらい、回したくなっちゃった…
347 名前:デフォルトの名無しさん mailto:sage [04/12/25 20:17:26] >>346 大丈夫?
348 名前:デフォルトの名無しさん mailto:sage [04/12/26 01:33:03] Everyday Haskell www.sampou.org/cgi-bin/haskell.cgi?Everyday&l=jp が面白い
349 名前:デフォルトの名無しさん mailto:sage [04/12/26 03:05:21] fold右派とfold左派にワラタ
350 名前:デフォルトの名無しさん mailto:sage [04/12/27 03:20:36] The Evolution of a Haskell Programmerでググれ という話ではなかったようだなスマソ
351 名前:デフォルトの名無しさん mailto:sage [04/12/27 23:20:33] これ既出? www.cin.ufpe.br/~haskell/vhs/
352 名前:デフォルトの名無しさん mailto:sage [05/01/05 13:43:39] >>347 346の文字列を読んで、ラテン系の伴奏が聞こえてくるようだと かなりダメ。
353 名前:デフォルトの名無しさん mailto:sage [05/01/06 03:09:05] >>346 禿げワロス カリー様(・∀・)イイ!!
354 名前:デフォルトの名無しさん mailto:sage [05/01/12 23:45:50] 保全sage
355 名前:デフォルトの名無しさん mailto:sage [05/01/15 03:17:13] Hatena::Diary 「Haskell」を含む日記 のとある日記を見てちょっとワラた 「むしゃくしゃしてやった.Haskell で書くつもりはなかった.今は反省している.簡潔に書けるが,知らない人には全く読めないだろうし,知っている人はもっとうまく書くかもしれない.」
356 名前:デフォルトの名無しさん mailto:age [05/01/15 03:36:47] ocaml age
357 名前:Aransk [05/01/18 12:16:33 ] >>355 ワラた。 ++ "しばらくしたら…誰も読めなくなるだろう。"
358 名前:デフォルトの名無しさん mailto:sage [05/01/23 14:46:59 ] The Implementation of Functional Programming Languages オンライン復刻記念 ttp://research.microsoft.com/Users/simonpj/papers/slpj-book-1987/ って既出?
359 名前:デフォルトの名無しさん mailto:sage [05/01/24 10:44:32 ] >>358 おおっ! 既出ではないと思う。さんくす。 といいつつ書籍で持ってるのだがw。いい本だよねー。
360 名前:デフォルトの名無しさん mailto:age [05/01/24 10:56:09 ] OCamlだとMLっぽいから書きやすいんだけど…。
361 名前:デフォルトの名無しさん mailto:sage [05/01/24 18:01:20 ] >>358 やけにでっかいから何かと思ったら、300もあるページがみんな画像……
362 名前:デフォルトの名無しさん mailto:sage [05/01/25 02:46:41 ] Revision Control System を、調べてたら、 darcs ( ttp://abridgegame.org/darcs ) というのを、ハケーンしました。 これは、haskell で書かれているので、「haskellってなんや。」と調べる流れでここに来ました。 私が知らないだけ、haskellでかかれたアプリはいっぱいあるのかも知れませんが、 上の方に出てないみたいなので、書いてミマス。 激しくガイシュツでしたらすいません。
363 名前:デフォルトの名無しさん mailto:sage [05/01/25 15:14:39 ] haskellで書かれたアプリはそんなに珍しくないと思う。 www.haskell.org/practice.html にいくつか載ってる。
364 名前:デフォルトの名無しさん mailto:age [05/01/25 15:17:08 ] haskellとOCamlではどちらがメジャーですか?
365 名前:デフォルトの名無しさん mailto:sage [05/01/25 15:25:18 ] そういうのをドングリの背比べというのではないだろーか。
366 名前:デフォルトの名無しさん [05/01/25 16:01:51 ] スラド本家?とLtUで取り上げられた<darcs it.slashdot.org/article.pl?sid=04/11/25/0136249&tid=156&tid=218 lambda-the-ultimate.org/node/view/391 純粋に関数的な「パッチの適用」を,ファイルやディレクトリの読み書きからキレイに分離でき, また,パターンマッチングと高階関数が,パッチのプリミティブの実装にとてもマッチする,とある. 詳しくはこちら. osdir.com/Article2571.phtml
367 名前:デフォルトの名無しさん mailto:sage [05/02/06 15:35:00 ] >>346 超ワロタw
368 名前:デフォルトの名無しさん mailto:sage [05/02/06 19:52:48 ] >>367 元ネタキボンヌ
369 名前:346 mailto:sage [05/02/06 20:18:15 ] >>368 that3.2ch.net/test/read.cgi/gline/1104975149/1-9
370 名前:デフォルトの名無しさん mailto:sage [05/02/07 04:10:20 ] ぬるほど
371 名前:デフォルトの名無しさん mailto:sage [05/02/09 05:46:41 ] Haskellの初歩を学校でやっているのですが、 宿題が出て難しすぎるので誰か助けて下さい。
372 名前:デフォルトの名無しさん mailto:sage [05/02/09 10:53:26 ] 2つの項を入力されたらmost general unifierを出力する *(1,y) *(x,+(a,b)) -> {x->1,y->+(a,b)} のようなプログラムを作れ、という課題が出たのですがサッパリわかりません。 どなたか教えて下さい
373 名前:デフォルトの名無しさん mailto:sage [05/02/09 20:23:43 ] >>372 もう一年やれば、理解も深まるよ。
374 名前:デフォルトの名無しさん mailto:sage [05/02/09 20:27:03 ] というか,課題が全然理解できないんだが.
375 名前:デフォルトの名無しさん mailto:sage [05/02/09 20:42:11 ] あ,分かってしまった.もう一年がんばってね.
376 名前:デフォルトの名無しさん mailto:sage [05/02/09 20:59:08 ] 問題の意味がわからないのならどうしようもないな
377 名前:デフォルトの名無しさん mailto:sage [05/02/09 22:14:31 ] >>372 これ、数学板のmathematicaスレでも見たぞ マルチすんな、消えろ
378 名前:デフォルトの名無しさん mailto:sage [05/02/09 23:27:11 ] もっと低レベルな人にあわせてくれる学校に入りなおしましょう。
379 名前:デフォルトの名無しさん mailto:sage [05/02/09 23:49:57 ] >>370 カッ
380 名前:デフォルトの名無しさん mailto:sage [05/02/10 01:16:45 ] [1,5,8,43]などのリストをパラメータとして受け取って [("1st",43),("2nd",8),("3rd",5),("4th",1)]のように ランクをつけてランク順に返す関数が欲しいのですが 問題は[5,6,6,22,23,24,24]のような場合に [("1st",24),("1st",24),("3rd",23),("4th",22),("5th",6),("5th",6),("7th",5)] のように返さなければいけないことです。どうすればいいかさっぱりです。 誰か教えて下さい。
381 名前:デフォルトの名無しさん mailto:sage [05/02/10 02:07:40 ] List> group $ reverse $ sort [5, 6, 6, 23, 24, 24] [[24, 24], [23], [6, 6], [5]] ここまで来りゃ後はなんとでもなるだろ。
382 名前:デフォルトの名無しさん mailto:sage [05/02/10 02:35:51 ] >>381 ありがとうございます!!
383 名前:デフォルトの名無しさん mailto:sage [05/02/10 02:43:00 ] あ、ランクを付ける際にはカウンタみたいなものを用意するんですか?
384 名前:デフォルトの名無しさん mailto:sage [05/02/10 04:08:38 ] 宿題か? 宿題なのか? テメエェェェ
385 名前:デフォルトの名無しさん mailto:sage [05/02/10 07:31:12 ] >>381 演算子 $ って初めて見ましたが,なかなか便利ですね. 勉強になりました.
386 名前:デフォルトの名無しさん mailto:sage [05/02/10 09:38:36 ] はい、そーです
387 名前:デフォルトの名無しさん mailto:sage [05/02/10 23:12:49 ] > ここまで来りゃ後はなんとでもなるだろ。 いろいろ考えたのですがなんともなりません。 むしろここから先が一番大変なのではないかと・・・ まじで教えてくれませんか?
388 名前:デフォルトの名無しさん mailto:sage [05/02/10 23:27:15 ] ここまで来てなんともならんてのは、けっきょく全然理解してないってことだ ろ。これくらい自分で考えてみ。でないとただのカンニングだろ。
389 名前:デフォルトの名無しさん mailto:sage [05/02/11 03:20:58 ] 僕にはこれが限界でした。 rank :: [[a]] -> [(Int, a)] rank x = [(i, n) | (i, a) <- zip [1..] x, n <- a] 確かに理解は非常に足りません。ですが、本を読んでも、 いろいろなほかのテクニックを知ってもループという基本的なことを するのがこんなに難しい言語は初めてなのです。 なんらかのライブラリを使う必要があるのかもしれないと思って、 Listのところは大体見たんですが結局何も見当たらずもうダメです。 こんな簡単であろう問題に3時間も4時間もかけてる自分がすごい嫌になってきます。
390 名前:デフォルトの名無しさん mailto:sage [05/02/11 04:03:59 ] ま、気楽にやれや、学生なんだし。
391 名前:デフォルトの名無しさん mailto:sage [05/02/11 04:52:51 ] そう気楽でもないんすよ。いろいろあって。 ヒントを下さい。お願いします。
392 名前:デフォルトの名無しさん mailto:sage [05/02/11 08:05:13 ] >>391 [1..]のところを["1st", "2nd", ...]というリストにすれば終わりだろ。 英語のカウントに勝手に直してくれるようなライブラリはないだろうな。
393 名前:デフォルトの名無しさん mailto:sage [05/02/11 09:27:09 ] >>392 > [1..]のところを["1st", "2nd", ...]というリストにすれば終わりだろ。 そのリストはどこまで続くんですか?
394 名前:デフォルトの名無しさん mailto:sage [05/02/11 09:48:51 ] いや、それじゃランク順の法則が違うんですよ。それだと [("1st",24),("1st",24),("2nd",23),("3rd",6),("3rd",6),("4th",5)] になっちゃうんですよ。 課題は [("1st",24),("1st",24),("3rd",23),("4th",6),("4th",6),("6th",5)] にならなきゃいけないので前のリストのカウントを常にしないと次のランクが 分からないわけです。これをどうしたものかと・・・・ >>393 同じ課題で悩んでる人ですか?そのリストは(length x -1)thまで続くんじゃないでしょうか? 与えられた整数に英語のカウントをつける関数はもう作ってあるんですが。 addSuffix :: Int -> String addSuffix x | x == 1 = "1st" | x == 2 = "2nd" | x == 3 = "3rd" | otherwise = show x ++ "th"
395 名前:デフォルトの名無しさん mailto:sage [05/02/11 10:08:15 ] >>394 > にならなきゃいけないので前のリストのカウントを常にしないと次のランクが > 分からないわけです。これをどうしたものかと・・・・ rankingの関数が、 1)降順ソートずみ整数の(部分)リスト (初期値 全リスト)、 2)これまでに処理した整数の数 (初期値 ゼロ)、 3)直前に処理した整数 (初期値 -1とか、入力リストに絶対あらわれないもの)、 4)直前に処理した整数のランク (初期値 ゼロ)、 のよっつを引数として取ればいいんじゃないの? > 与えられた整数に英語のカウントをつける関数はもう作ってあるんですが。 > | otherwise = show x ++ "th" これだと 21番目は "21th" 22番目は "22th" になっちゃうよ……
396 名前:デフォルトの名無しさん mailto:sage [05/02/11 10:51:06 ] あ、ほんとだ!ご指摘ありがとうございます。 じゃぁ条件分岐のところ、xの代わりにmod x 10で。 rankingの関数はやはり4つも引数が必要ですか・・・・。 じゃぁそれでちょっと頑張ってみます。
397 名前:デフォルトの名無しさん mailto:sage [05/02/11 11:01:33 ] ちょっとやり方は違うけど4つの引数使ってやっとできました。 でもなんかぎこちない感じ・・・。これでいいのでしょうか。 もっとスマートなやり方があるような気がしてなりません。 setRank :: [Int] -> [(String, Int)] setRank [] = [] setRank (x:xs) = ("1st", x):[(addSuffix a, b) | (a, b) <- subSetRank xs x 2 0] subSetRank :: [Int] -> Int -> Int -> Int -> [(Int, Int)] subSetRank [] _ _ _ = [] subSetRank (x:xs) preVal position k | x == preVal = [((position - (k+1)), x)] ++ (subSetRank xs x (position+1) (k+1)) | otherwise = [(position, x)] ++ (subSetRank xs x (position+1) 0) addSuffix :: Int -> String addSuffix x | mod x 10 == 1 = "1st" | mod x 10 == 2 = "2nd" | mod x 10 == 3 = "3rd" | otherwise = show x ++ "th"
398 名前:392 mailto:sage [05/02/11 11:01:34 ] >>394 失礼。俺なら395よりは、 groupBy (\x y -> snd x == snd y) $ zip [1..] $ reverse $ sort [5, 6, 6, 23, 24, 24 ] から変形するな。
399 名前:どうでしょうか,,, mailto:sage [05/02/11 11:11:26 ] import List rank :: Integer -> String rank x | x `mod` 10 == 1 = s ++ "st" | x `mod` 10 == 2 = s ++ "nd" | x `mod` 10 == 3 = s ++ "rd" | otherwise = s ++ "th" where s = show x ranks :: [String] ranks = map rank [1..] sort_group :: Ord a => [a] -> [[a]] sort_group l = group $ reverse $ sort l main :: Ord a => [a] -> [(String,[a])] main lst = zip ranks (sort_group lst)
400 名前:デフォルトの名無しさん mailto:sage [05/02/11 11:14:24 ] >>399 全然違うじゃないか。 それにmainはIO aの型であるべきもので、使わないほうがいい。
401 名前:デフォルトの名無しさん mailto:sage [05/02/11 11:21:27 ] 誰も書かないから突っ込むけど、 11th,12th,13th そんな私はsort使うためにimport Listするとhugsにレイアウトが違うと怒られる駄目駄目プログラマ。
402 名前:401 mailto:sage [05/02/11 11:27:11 ] importがImportになってた スレ違い御免orz
403 名前:デフォルトの名無しさん mailto:sage [05/02/11 11:28:33 ] どうもありがとうございます。おかげ様で前のよりはマシになったかと思います。 setRankS :: [Int] -> [(String, Int)] setRankS x = concat [setFirst n | n <- (groupBy (\x y -> snd x == snd y) $ zip [1..] x)] setFirst :: [(Int, Int)] -> [(String, Int)] setFirst ((x, y):xs) = [(addSuffix x, b) | (a, b) <- ((x, y):xs)]
404 名前:デフォルトの名無しさん mailto:sage [05/02/11 11:41:07 ] >>401 またまた貴重なご指摘ありがとうございます。 addSuffix :: Int -> String addSuffix x | x == 11 = s ++ "th" | x == 12 = s ++ "th" | x == 13 = s ++ "th" | mod x 10 == 1 = s ++ "st" | mod x 10 == 2 = s ++ "nd" | mod x 10 == 3 = s ++ "rd" | otherwise = s ++ "th" where s = show x
405 名前:401 mailto:sage [05/02/11 11:52:24 ] あーごめんなさい。私もまだ間違ってた。 111th,112th,113th,211th....。序数詞は怖い。もうないよね。
406 名前:デフォルトの名無しさん mailto:sage [05/02/11 12:03:11 ] | mod x 100 == 11 = s ++ "th" | mod x 100 == 12 = s ++ "th" | mod x 100 == 13 = s ++ "th" これ足せばOK?
407 名前:デフォルトの名無しさん mailto:sage [05/02/13 13:11:54 ] 宿題しか話題のない悲しい言語
408 名前:デフォルトの名無しさん mailto:sage [05/02/13 15:11:50 ] >>407 > 宿題しか話題のない悲しい言語 達見かな。で、どうしてそうなのかという質問がなされ、欠点が羅列され、 いやそんなことはない理論的に美しいという反論が出て、数少ない実用例も示され……
409 名前:デフォルトの名無しさん mailto:sage [05/02/13 16:36:48 ] 関数型言語なんてみんなそうなんじゃない? Lisp系は処理系が簡単だから使われるけど、それ以外は…
410 名前:デフォルトの名無しさん mailto:sage [05/02/13 17:23:54 ] 初心者を馬鹿にするとき、一番盛り上がります。
411 名前:デフォルトの名無しさん mailto:age [05/02/13 17:32:09 ] >>409 OCamlをフリーソフト(非オープンソース)を書くのに使っていますが。
412 名前:デフォルトの名無しさん mailto:sage [05/02/13 18:02:27 ] じゃあ、みんなでHaskellで言語処理系を作ろう。
413 名前:デフォルトの名無しさん mailto:sage [05/02/13 18:21:28 ] Haskellでテトリスは作れますか?
414 名前:デフォルトの名無しさん mailto:age [05/02/13 18:26:54 ] >>413 作れます。
415 名前:デフォルトの名無しさん mailto:sage [05/02/13 18:33:34 ] Haskellのテトリス↓ web.comlab.ox.ac.uk/oucl/work/ian.lynagh/Hetris/ fxp.hp.infoseek.co.jp/haskell/HSDL/
416 名前:デフォルトの名無しさん mailto:sage [05/02/13 18:55:01 ] ghcってどれくらいきちんとdebugされてるのかなあ。 仕事に使っても大丈夫?
417 名前:デフォルトの名無しさん mailto:sage [05/02/13 22:14:38 ] >>411 こういうコンテキストで話すなら、商用に使われてナンボだと思うが。 俺自身は宿題用だろうが日曜プログラマーの趣味の道具だろうが構わんけど。
418 名前:デフォルトの名無しさん mailto:sage [05/02/14 15:53:01 ] >>416 まあオープンソースだから、sourceforge.net/projects/ghc/やメーリングリストを見て 自分で判断してくださいということで。 ver6.4のリリースが延び延びになっているのが気になる。 RCのソースもコンパイルできないし…(@Mac)
419 名前:デフォルトの名無しさん mailto:sage [05/02/14 20:24:12 ] そうそう。 あくまでも最先端の研究用なので、品質に期待してはいけない。
420 名前:デフォルトの名無しさん mailto:sage [05/02/19 08:34:16 ] C,C++の代わりとまではいかなくても、 Perlの代わりぐらいにはなりますか?
421 名前:デフォルトの名無しさん mailto:sage [05/02/19 11:17:33 ] >>420 もう少しHaskellのこと勉強してから出直してきたら
422 名前:デフォルトの名無しさん mailto:sage [05/02/19 12:09:32 ] >>421 言語の完成度じゃなくてghcの完成度を聞いてるんだけど。
423 名前:デフォルトの名無しさん mailto:sage [05/02/19 13:10:18 ] エスパー募集中ですか(w
424 名前:デフォルトの名無しさん mailto:sage [05/02/19 23:54:19 ] ghcってとてもバグが少ないとおもう。 特に、コンパイル結果がおかしいというのは一つも知らない。 言語拡張を使ってコンパイラが落ちるのはあったが、gccだってよく落ちたし。 品質に期待してはいけないってのは、なんか具体的な理由があるの?
425 名前:デフォルトの名無しさん mailto:sage [05/02/22 20:08:41 ] GHC最強。ノアだけはガチ。
426 名前:デフォルトの名無しさん mailto:sage [05/02/22 22:01:11 ] ghcは完璧。バグなんて有り得ない。
427 名前:デフォルトの名無しさん mailto:sage [05/02/23 09:12:55 ] ttp://www.ghc.or.jp/
428 名前:デフォルトの名無しさん mailto:sage [05/02/23 19:20:04 ] ghcの品質に問題ありとかいってる奴は頭がおかしいな。
429 名前:デフォルトの名無しさん mailto:sage [05/02/23 20:51:01 ] 関数型言語で書かれてないソフトウェアなんて 信頼性低すぎて使ってられないよな。
430 名前:デフォルトの名無しさん mailto:sage [05/02/23 21:14:20 ] ghcにはバグなんてない。 ghcの信頼性 >>>>>>>>> gccの信頼性
431 名前:デフォルトの名無しさん mailto:sage [05/02/24 11:00:34 ] カタカタ || ̄ Λ_Λ ||_(Д`; ) 「なに?このスレ・・・」 \⊂´ ) ( ┳'
432 名前:デフォルトの名無しさん mailto:sage [05/02/26 23:31:32 ] 妙な雰囲気を紛らわす一服の清涼剤sage ttp://pggirls.asukaze.net/index.php?cmd=read&page=イ霖/Haskell、ソ、
433 名前:デフォルトの名無しさん mailto:sage [05/02/27 03:01:22 ] ghcにバグがないことは証明済みです。
434 名前:デフォルトの名無しさん mailto:sage [05/03/02 14:39:26 ] The Monad.Reader www.haskell.org/hawiki/TheMonadReader
435 名前:デフォルトの名無しさん mailto:sage [05/03/05 17:27:02 ] 証明が間違ってないことも証明済みです
436 名前:デフォルトの名無しさん mailto:sage [05/03/05 21:47:09 ] よく分からんが、ghcにバグは有り得ないってことか。
437 名前:デフォルトの名無しさん mailto:sage [05/03/06 11:08:10 ] そゆこと
438 名前:デフォルトの名無しさん mailto:sage [05/03/08 23:33:41 ] ttp://sourceforge.net/tracker/?group_id=8032&atid=108032
439 名前:デフォルトの名無しさん mailto:sage [05/03/09 00:11:32 ] ghcってのは宗教か何かですか?
440 名前:デフォルトの名無しさん mailto:sage [05/03/09 00:24:00 ] 真理です
441 名前:デフォルトの名無しさん mailto:sage [05/03/09 20:45:50 ] 我々はこのスレを笑い飛ばしていたものです…。 しかし、その後、、、
442 名前:デフォルトの名無しさん mailto:sage [05/03/10 00:24:38 ] テレビで観た外国人犯罪者。刑務所で個室をもらい、支給されたパソコン でお勉強。本国から雑誌や新聞、書籍を送ってもらい、専属の通訳と翻訳家 つきで、食事はその国にあわせたもの。日本人受刑者は狭い部屋ですし詰め。 しばらくして、別のニュースでホームレスが川に落ちたインスタントラーメンを 取ろうとして転落、そのまま凍死してしまったという記事を読んで、せつなくな ってしまった。 新聞で日本で暮らす脱北者のインタビュー記事。「生活保護の支給額が足りない」 「支援してくれないので日本は冷たい」だと。 別の記事で生活保護を受けられなかった母子がおんぼろアパートで餓死。 この国は本当に狂っている。
443 名前:デフォルトの名無しさん mailto:sage [05/03/10 00:32:05 ] ・・・という内容をghcで矛盾を含まずーディングしはじめる兵(ツワモノ)が現れるのを 目の当たりにすることになったのです。 〜Fin.〜 (2ch.千夜一夜物語)
444 名前:デフォルトの名無しさん [05/03/10 00:58:20 ] 真理です
445 名前:デフォルトの名無しさん mailto:sage [05/03/11 00:20:02 ] 生活苦や迫害から逃れるため北朝鮮を脱出した元在日朝鮮人 大阪府八尾市に支援者が用意した2部屋のアパートで 月約17万円の生活保護と支援者からのカンパで暮らす。 ソウルに住む長男も呼び寄せたいというが、 「いまの生活保護額では厳しい」と悩む日々だ。 www.asahi.com/national/update/0310/OSK200503100048.html 確定申告済ませたか? 俺も17万円と2部屋のアパート欲しい。 豊な生活送るには、17万円ポッチじゃ、まだタリン。 おまえ等の税金もっともっと よ こ せ!
446 名前:デフォルトの名無しさん mailto:sage [05/03/11 00:31:20 ] ghcならコンパイル可能
447 名前:デフォルトの名無しさん mailto:sage [05/03/11 00:43:13 ] ghcだからこそコンパイルエラーの結果に終わります。 こんなんに真値判定出されてたまりますか。
448 名前:デフォルトの名無しさん mailto:sage [05/03/12 20:33:41 ] www.haskell.org/ghc/download_ghc_64.html
449 名前:デフォルトの名無しさん mailto:sage [05/03/12 23:28:12 ] 新たな教典が来ましたね。 もちろんバグはありませんので、安心してご利用ください。
450 名前:デフォルトの名無しさん mailto:sage [05/03/13 02:47:22 ] >>449 =モズクズ様↓ www.gema3.net/bbs/icon/inore.jpg
451 名前:デフォルトの名無しさん mailto:sage [05/03/14 14:32:35 ] SOE本とCraft本で、どちらがお勧めですか?
452 名前:デフォルトの名無しさん mailto:sage [05/03/14 16:41:23 ] >>451 両方
453 名前:デフォルトの名無しさん mailto:sage [05/03/14 23:22:35 ] 今年度は、Hugsの新版出ないの?
454 名前:デフォルトの名無しさん mailto:sage [05/03/15 00:02:58 ] Mar 2005 releaseがでてるけど
455 名前:デフォルトの名無しさん mailto:sage [05/03/15 08:28:37 ] あれ、いつの間に。
456 名前:デフォルトの名無しさん mailto:sage [05/03/15 08:32:05 ] Charが、うにコードに対応したんだ。
457 名前:デフォルトの名無しさん mailto:sage [05/03/20 10:13:33 ] hugs98-Mar2005-patched.tar.gzキテル━━━━━━(゚∀゚)━━━━━━ !!!!! updated with urgent bug fixes
458 名前:デフォルトの名無しさん [2005/03/23(水) 00:58:19 ] 同じ関数型言語でもHaskellのほうがSchemeより易しくない? SMFの解析を書き始めてるけど、コストをあまり考えすぎなくてよい気がするし、 Schemeよりも簡潔に書けるし、実行速度もいくぶん速い。 いまのところ、手続き型の処理を書かなくても (コストを気にしない限りは)それほど書くのが難しくない。 ただ、効率を気にしだすと書き換えるのは難しいのかな?
459 名前:デフォルトの名無しさん mailto:sage [2005/03/23(水) 07:53:51 ] 素朴な疑問だが、lazyな言語で割り込み処理(シグナル等)はどうやって書くのだろう。 割り込み時の状態はどう定義されるのだろうか。
460 名前:デフォルトの名無しさん [2005/03/28(月) 13:39:35 ] >>459 もれも良く分からんが、MIT pressから出てるSICPっていう本読んでると 無限ストリームっていうのが出てくるから、それ使うんじゃない? A Gentle Introduction to Haskellっていう、Haskellの紹介文書 にも無限ストリームを使ったクライアントーサーバー処理の例が出てくるよ。
461 名前:デフォルトの名無しさん mailto:sage [2005/03/28(月) 15:15:52 ] 数学理論に立脚した言語で現実世界を対象としたプログラミングを行うことは間違いだ
462 名前:デフォルトの名無しさん [2005/03/28(月) 15:16:30 ] >>461 はい?もう一度言ってもらえますか?よく見えなかったので。
463 名前:デフォルトの名無しさん mailto:sage [2005/03/28(月) 18:39:05 ] >>459 たぶんlazyな言語に対して割り込みのformal semanticsを与えた人はいないと思う。 もの凄く難しい。 >>460 それは単なる入出力ではなかろうか。
464 名前:デフォルトの名無しさん mailto:sage [2005/03/28(月) 20:05:44 ] イベントや割り込みであろうが入出力には違いないだろ 辻褄が合ってればいい
465 名前:デフォルトの名無しさん mailto:sage [2005/03/28(月) 20:08:30 ] 割込みは「単なる」入出力とは違うってことだろ
466 名前:デフォルトの名無しさん [2005/03/28(月) 23:35:57 ] ghcでバイナリデータをバイト単位で扱うときって、Word8を使えばいいの? Charだと数値との比較ができなくて不便。
467 名前:デフォルトの名無しさん [2005/03/29(火) 01:36:32 ] MacOS X 10.3 で Haskell を使うのにお勧めの方法は何でしょうか? Hugs98 か ghc になると思うのですが。 fink には入っているのは どちらも Hugs98 2001-Feb と ghc 6.2 で少々古かったです。
468 名前:デフォルトの名無しさん mailto:sage [2005/03/29(火) 02:58:49 ] Mac使うのを止めるのがオススメ!
469 名前:デフォルトの名無しさん mailto:sage [2005/03/29(火) 04:16:23 ] そうだね。 爪弾きにされ、余計な苦労ばかり増えて良いところなんて一つもないし。
470 名前:デフォルトの名無しさん mailto:sage [2005/03/29(火) 08:45:40 ] finkに頼らんでもHugsなら自分でmakeすればOKだし GHCは本家にバイナリが用意してある
471 名前:デフォルトの名無しさん mailto:sage [2005/03/30(水) 02:58:36 ] マイナー言語やる上で Mac は悪くないプラットフォームなんだけどね。 ML も主要なのは殆ど対応しているし。
472 名前:デフォルトの名無しさん mailto:sage [2005/03/30(水) 03:06:14 ] haskellよりもMLの方が文法綺麗じゃないですか??そんなことないかな…
473 名前:デフォルトの名無しさん mailto:sage [2005/03/30(水) 03:15:35 ] ML、特にSMLはDefinitionが出て以来そのままだからなあ(97年に改訂されたけど)。 Haskellの方も一応98はあるけど、そうじゃない部分は随時面白い話があるたびに 手を入れてきた感じなのは否めないのかも。
474 名前:デフォルトの名無しさん [2005/03/31(木) 19:07:35 ] www.amazon.co.jp/exec/obidos/ASIN/0201342758/ www.amazon.co.jp/exec/obidos/ASIN/0521644089/ この 2 冊が欲しいのですが、中を確かめてから欲しいので 都内で在庫がある店知りませんか? 東京駅〜秋葉原〜神保町あたりだと助かります。
475 名前:デフォルトの名無しさん mailto:sage [2005/03/31(木) 22:26:11 ] グランデに電話してみれば?
476 名前:デフォルトの名無しさん [2005/03/31(木) 22:33:33 ] > 474 Haskell: The Craft of Functional Programmingはかなりおすすめです。 買って損はないと思います。
477 名前:474 mailto:sage [皇紀2665/04/01(金) 10:58:40 ] 結局 Amazon で注文しました。 www.hatena.ne.jp/1087912125 ここに載っててありそうなところには電話かけましたが 店頭に在庫はないみたいでした。Amazon がない時代は みんなどうしていたんだろう…。大学生協で取り寄せかな。
478 名前:デフォルトの名無しさん mailto:sage [皇紀2665/04/01(金) 18:28:57 ] >>474 神田行けばいくらでもあるだろ。 デカイ本屋で在庫あるか訊いてみろ。
479 名前:474 mailto:sage [皇紀2665/04/01(金) 19:57:19 ] >>478 私には >>477 以外に出てくる本屋以外にデカイ本屋は知りません。 おすすめのコンピュータの洋書をあつかっている店の名前が分かる なら教えてください。
480 名前:デフォルトの名無しさん mailto:sage [int 2ch =05/04/01(金) 20:48:22 ] >>479 www.book-kanda.or.jp/town/map/map.htm www.book-kanda.or.jp/town/newbook/index.htm
481 名前:474 mailto:sage [int 2ch =05/04/01(金) 21:56:48 ] 明日、神田を周ってこようと思います。 ありがとうございました。
482 名前:デフォルトの名無しさん mailto:sage [int 2ch =05/04/02(土) 12:12:07 ] >>474 君見て自分も思い出したように買ったよ まあ回っても見つからないと思うよ
483 名前:474 mailto:sage [2005/04/03(日) 11:46:47 ] 昨日行ってきました。 水道橋駅を降りて、神保町駅まで歩きその周辺の本屋を巡りました。 コンピュータの洋書を扱っているのが、三省堂の本店しか見つける ことができませんでした。在庫はあらず。 いくらでもあるとのことなのですが、探しかたが悪いのか、 >>482 さんの言う通りなのか不明です。 Amazon から Haskell: The Craft of Functional Programming は届いたので読みすすめてます。結構面白いです。
484 名前:デフォルトの名無しさん mailto:sage [2005/04/04(月) 04:15:17 ] >>483 > コンピュータの洋書を扱っているのが、三省堂の本店しか見つける > ことができませんでした。 え、マジ? それは探し方が悪いのでは。
485 名前:474 mailto:sage [2005/04/06(水) 17:39:21 ] そうですよね。もっと探検してみます。
486 名前:デフォルトの名無しさん mailto:sage [2005/04/07(木) 12:56:04 ] オレも他にはゆうりんどう(字わからん)くらいしか思いつかない。いいとこあるなら教えてcray。
487 名前:デフォルトの名無しさん mailto:sage [2005/04/07(木) 14:51:05 ] 洋書なんて読むなよこの非国民が
488 名前:デフォルトの名無しさん mailto:sage [2005/04/07(木) 15:41:08 ] 英語も読めないの?国辱。
489 名前:デフォルトの名無しさん mailto:sage [2005/04/07(木) 20:21:03 ] 洋書 = 英語書かよ、この拝米主義者め
490 名前:デフォルトの名無しさん mailto:sage [2005/04/07(木) 20:31:05 ] 英語=拝米の方がよっぽど(ry
491 名前:デフォルトの名無しさん mailto:sage [2005/04/07(木) 20:48:29 ] Haskell: The Craft of Functional Programming は英語だろ? 国辱どもが。
492 名前:デフォルトの名無しさん mailto:sage [2005/04/07(木) 20:57:10 ] 当たり前のことを言うな一知半解野郎
493 名前:デフォルトの名無しさん mailto:sage [2005/04/07(木) 21:30:11 ] これがゆとり教育の弊害か。確かに国辱。
494 名前:デフォルトの名無しさん mailto:sage [2005/04/07(木) 22:14:10 ] >>487-493 レベルの低い話は止めろ
495 名前:デフォルトの名無しさん mailto:sage [2005/04/08(金) 22:34:40 ] 科学とかに関しては日本なんてどうでもいい罠。
496 名前:デフォルトの名無しさん mailto:sage [2005/04/09(土) 09:19:13 ] Haskellの勉強してると類(kind)という言葉が出てくる。 手持ちの関数型言語の参考書では見かけないので、類を扱うのは比較的 珍しいことなのかと思うのだけれど、どう? なんでHaskellには類が必要なの?
497 名前:デフォルトの名無しさん mailto:sage [2005/04/09(土) 13:07:49 ] Haskellだと、普通の多相型([]とかMaybeとか)に加えて 「型構築子から型構築子への写像」(StateTとか)のようなものを定義できるから、 単に「無引数の型構築子」だとか「1引数の型構築子」とかいうだけじゃ不十分だからだと思う。 まあ、似たような機能のあるC++では「類」なんて聞いたこともないんだけど。 関数型言語についてはよく知らんので誰かフォローよろしく。
498 名前:デフォルトの名無しさん [2005/04/09(土) 13:52:32 ] WinXPで動くHaskellのコンパイラってある?
499 名前:デフォルトの名無しさん mailto:sage [2005/04/09(土) 13:59:36 ] >>498 え?GHCがwindowsで動くでしょ???
500 名前:デフォルトの名無しさん mailto:sage [2005/04/09(土) 14:23:03 ] ∩ノ / つ / / / ̄ ̄ ̄ ̄ ∧ ∧/ < 500ゲットぉぉぉぉ! ⊂(゚Д゚ ) 彡 \ ⊂彡  ̄ ̄ ̄ ̄ ____●●●___ バイーン / 〇 〇 \|/ /| | ̄ ̄ ̄ ̄ ̄ ̄ ̄|
501 名前:デフォルトの名無しさん [2005/04/09(土) 17:40:30 ] 498ではないが、 WINXP sp2 で GHC のインストーラはエラーで落ちました。 hugs98 は簡単にインストールできました。
502 名前:デフォルトの名無しさん [2005/04/10(日) 11:03:22 ] 言語仕様を見るとHaskellの方がはるかに機能的に見えるのだけど、実用面を見るとHaskellはボロボロ。 結局、開発するならOCamlに軍配があがるんだよね。
503 名前:デフォルトの名無しさん mailto:sage [2005/04/10(日) 11:31:38 ] だから品質には期待するなとあれほど(ry
504 名前:デフォルトの名無しさん mailto:sage [2005/04/10(日) 13:23:42 ] だからghcにバグはないとあれほど(ry
505 名前:デフォルトの名無しさん mailto:sage [2005/04/11(月) 11:57:34 ] >>497 Haskellよく知らんけど、合ってるんじゃん? C++のテンプレートは展開してからチェックするので、いらないんでしょ。たぶん。
506 名前:デフォルトの名無しさん mailto:sage [2005/04/11(月) 12:08:44 ] >>463 >たぶんlazyな言語に対して割り込みのformal semanticsを与えた人はいないと思う。 >もの凄く難しい Haskellよく知らんので何か勘違いしてるかもしれんが、 research.microsoft.com/Users/simonpj/Papers/papers.html のA semantics for imprecise exceptionsの5.1節とか Imprecise Exceptions, Co-Inductivelyは違うの?
507 名前:デフォルトの名無しさん mailto:sage [2005/04/11(月) 20:32:57 ] Haskellで正規表現は標準でサポートされているのですか?
508 名前:デフォルトの名無しさん mailto:sage [2005/04/11(月) 20:44:09 ] >>507 www.google.co.jp/search?hl=ja&q=Haskell+regex&lr=
509 名前:デフォルトの名無しさん mailto:sage [2005/04/15(金) 17:30:13 ] >>501 3月21日位にインストーラーが変わっている様なのですが、それでインストールしても 駄目ですか? 当方はXP SP2でインストールできています。
510 名前:デフォルトの名無しさん [2005/04/15(金) 19:37:33 ] つーかインストーラーぐらいちゃんと作れませんか?
511 名前:501 mailto:sage [2005/04/16(土) 12:07:17 ] >>509 最新版でインストールもできましたし、ちゃんと動きました。 ありがとうございます。
512 名前:デフォルトの名無しさん mailto:sage [2005/04/17(日) 22:00:14 ] imprecise exception 云々よりどっちかというと Asynchronous exceptions in Haskell の方が該当する希ガス。
513 名前:デフォルトの名無しさん mailto:sage [2005/04/17(日) 22:05:22 ] この言語扱うのに数学の知識必須みたいだな。初めて使ったが…
514 名前:デフォルトの名無しさん mailto:sage [2005/04/17(日) 22:19:40 ] そうなの?どの辺でそう感じた?
515 名前:デフォルトの名無しさん mailto:sage [2005/04/17(日) 22:33:46 ] >>514 いや、大したことじゃないんだけど、集合論とか。
516 名前:デフォルトの名無しさん [2005/04/18(月) 01:09:42 ] 文系お断り言語
517 名前:デフォルトの名無しさん mailto:sage [2005/04/18(月) 11:59:50 ] Text.Regex は入力を不必要に最後まで読んでくれたりして微妙に嬉しくないんだよなあ。
518 名前:デフォルトの名無しさん [2005/04/18(月) 23:56:27 ] で、この言語なんて読むんだ? はすくぇる?
519 名前:デフォルトの名無しさん mailto:sage [2005/04/18(月) 23:57:21 ] ハスケルカリー
520 名前:デフォルトの名無しさん mailto:sageチラシの裏にでも書いています [2005/04/20(水) 23:24:41 ] GHCのコンパイルがなかなか終わらない。 ひょっとして、マシンパワーがかなり必要なの? 普段使っているのはおんぼろラップトップなんだよね。
521 名前:デフォルトの名無しさん mailto:sage [2005/04/20(水) 23:45:27 ] >>520 こちとら、PowerBookG4(867MHz,RAM640MB)で 2ステージ+testsuite が6〜8時間。
522 名前:520 mailto:sage [2005/04/21(木) 08:32:54 ] 朝起きたら無事終わってた GHCは普通のコンパイラとは内部構造がかなり違うようですな。
523 名前:デフォルトの名無しさん [2005/04/22(金) 20:52:35 ] 某スレでハスケルでGUIは辛いと言われてしまいました。 誰か反論の文句をおねがいします。
524 名前:デフォルトの名無しさん mailto:sage [2005/04/22(金) 20:54:26 ] だからあれほどHaskellは実用アプリケーション作成向きでは無いと(小一時間
525 名前:デフォルトの名無しさん mailto:sage [2005/04/22(金) 21:08:24 ] だからあれほどghcは完璧だと(ry
526 名前:デフォルトの名無しさん mailto:sage [2005/04/23(土) 05:07:16 ] 情処の記事を読んで触ってみた。
527 名前:デフォルトの名無しさん mailto:sage [2005/04/23(土) 13:52:46 ] 今月からFPの連載だね。
528 名前:デフォルトの名無しさん mailto:sage [2005/04/23(土) 23:02:55 ] FP ってなんですか?
529 名前:デフォルトの名無しさん mailto:sage [2005/04/24(日) 00:06:54 ] 一時期流行った自分視点のゲームだろ
530 名前:デフォルトの名無しさん mailto:sageネタをネタと(ry [2005/04/24(日) 13:13:48 ] そりゃFPSだ。 動的計画法のことだろ?
531 名前:デフォルトの名無しさん mailto:sage [2005/04/24(日) 18:54:43 ] Functional Programmingのことかと思った。
532 名前:デフォルトの名無しさん mailto:sage [2005/04/24(日) 21:37:20 ] > 動的計画法のことだろ? それはDP(dynamic programming)
533 名前:デフォルトの名無しさん mailto:sage [2005/04/24(日) 23:26:26 ] わかりにくいネタでごめん
534 名前:デフォルトの名無しさん mailto:sage [2005/04/25(月) 20:31:20 ] まじでどこで連載してるのか教えてくれ
535 名前:デフォルトの名無しさん mailto:sage [2005/04/25(月) 20:56:53 ] 情報処理学会誌ですね。 久しぶりにビニールを開けてみました。 相変わらず読むところが少ない…。
536 名前:デフォルトの名無しさん mailto:sage [2005/04/27(水) 11:28:18 ] 辛ければヨーグルトを使う
537 名前:デフォルトの名無しさん [2005/04/29(金) 15:38:56 ] GHCがpanicっていってコンパイル止まったよ。 間違ったソースの中には対応しきれないものがあるようだ。
538 名前:デフォルトの名無しさん mailto:sage [2005/04/29(金) 16:42:43 ] >>537 嘘はいけない。ghcにバグはない。
539 名前:デフォルトの名無しさん mailto:sage [2005/04/29(金) 16:49:25 ] ghc のバグじゃなくてコンパイルするソース側の
540 名前:デフォルトの名無しさん [2005/04/29(金) 16:57:37 ] >嘘はいけない。ghcにバグはない。 なんか凄い事聞いた気がする。 ほんと?
541 名前:デフォルトの名無しさん mailto:sage [2005/04/29(金) 18:00:14 ] ほんとにそうならghcのwebにバグレポートのリンクがあったりしないべ。
542 名前:デフォルトの名無しさん mailto:sage [2005/04/29(金) 18:49:30 ] Financial Planner
543 名前:537 [2005/04/29(金) 21:25:14 ] ほんとだよ。GHC cannot process input file. please report this to us とか出たもの。 もちろんソースは正しくないやつなんだが、それでもコンパイラが適切なエラーメッセージを 出せずに止まったことは事実。
544 名前:デフォルトの名無しさん mailto:sage [2005/04/29(金) 22:13:13 ] ああ、拡張機能や新機能を使うと稀に起こるよ、panic。 ちゃんと報告してあげて下さい。
545 名前:デフォルトの名無しさん mailto:sage [2005/04/30(土) 18:45:06 ] 例のHaskell連載って公開してるんだね www.ipsj.or.jp/07editj/promenade/
546 名前:デフォルトの名無しさん [2005/04/30(土) 19:44:34 ] ハスケル!ハスケル!
547 名前:デフォルトの名無しさん mailto:sage [2005/04/30(土) 21:27:04 ] _ ∩ ( ゚∀゚)彡 ( ⊂彡 | | し ⌒J
548 名前:デフォルトの名無しさん [2005/05/01(日) 20:14:08 ] LISP Macro みたいなことできますか? -- dotimes :: n -> (n -> IO()) -> IO() dotimes n f = __dotimes 0 where __dotimes i | i >= n = return () | otherwise = do (f i) __dotimes (i + 1) -- dotimes 10 ( \x -> putStr (show x)) こんなもの?
549 名前:デフォルトの名無しさん mailto:sage [2005/05/01(日) 23:02:28 ] 遅延評価だし、アクションが第一級の対象だから、 全ての関数がマクロであるようなものじゃないか?
550 名前:549 mailto:sage [2005/05/01(日) 23:05:09 ] なんかピントの外れたことを言ったな。 誰かフォローよろしく。
551 名前:デフォルトの名無しさん mailto:sage [2005/05/01(日) 23:19:07 ] dotimes' n f = sequence_ [ f n' | n' <- [0..n-1] ] main = dotimes' 10 (putStr.show)
552 名前:無理です。 mailto:sage [2005/05/01(日) 23:20:58 ] 例えばhaskellのif if p then c else a は、 case p of True -> c False -> a の構文糖衣とみなせる。逆でもよい。 マクロの代わりになるかどうかは、自分のifをcaseで定義できるかどうかを 考えてみればわかる。 myif mycase さあどうぞ。
553 名前:デフォルトの名無しさん mailto:sage [2005/05/01(日) 23:29:12 ] myif :: Bool -> a -> a -> a myif p c a = case p of True -> c; False -> a でいいんじゃないのか?
554 名前:デフォルトの名無しさん mailto:sage [2005/05/01(日) 23:37:45 ] >>553 thenとかelseはどこいった?
555 名前:デフォルトの名無しさん mailto:sage [2005/05/01(日) 23:43:22 ] シンタックスを定義できなてもマクロと言えると思うが。
556 名前:デフォルトの名無しさん mailto:sage [2005/05/01(日) 23:49:16 ] ↑それで消費者が納得すると思ってんのか?
557 名前:デフォルトの名無しさん mailto:sage [2005/05/01(日) 23:52:37 ] >>555 関数マクロと言うべきか。 >>548 の回答としては、 Q.LISP Macro みたいなことできますか? A.できません。
558 名前:デフォルトの名無しさん mailto:sage [2005/05/02(月) 00:05:54 ] haskellでは a `lambda` (a + 1) の様な表現ができないのが本質的っぽいね。
559 名前:デフォルトの名無しさん mailto:sage [2005/05/02(月) 00:11:04 ] つまり、遅延であろうがなかろうが、LISPのようなマクロを書けるかどうかは 引数評価を自分でコントロールできるかどうかにある。 少なくともLISPのマクロ内に出てくるシンボルみたく、引数の一部を 評価せずにキーワードそのものとして扱うみたいな仕組みがないと。
560 名前:デフォルトの名無しさん mailto:sage [2005/05/02(月) 00:25:50 ] 「遅延評価」の意味で「評価」と言うと意味が違うと思う。 引数の評価をコントロールするだけならhaskellでもできる。 「解釈」と言えばいいのかな?
561 名前:デフォルトの名無しさん mailto:sage [2005/05/02(月) 00:39:06 ] LISPのマクロはdefineを含むコードを生成できるけど、Haskellではそのような真似はできないはず。
562 名前:デフォルトの名無しさん mailto:sage [2005/05/02(月) 13:13:17 ] HaXmlで下のinputからoutputのような出力を得たいんですがどのようにすれば 良いでしょうか? ---input--- <function name='deleteBy' type='(a -> a -> Bool) -> a -> [a] -> [a]'> <description> similar to <f>delete</f>, but it allows the programmers to supply their own equality test </description> ---output--- ["deleteBy", "similar to delete, but it allows the programmers to supply their own equality test"] <description>の中の<f>の処理がうまく行かず下のような結果になってしまい ます。<description>の中のテキスト部分だけを抜き出したいです。別リスト にしないで1つの文字列として。 ["deleteBy", "similar to ", "delete", ", but it allows the programmers to supply their own equality test"]
563 名前:562 mailto:sage [2005/05/02(月) 13:22:01 ] コードとサンプルデータを載せます。 import System.IO import System.Environment import Text.XML.HaXml import Text.XML.HaXml.Pretty (content) main :: IO () main = do ~[arg] <- getArgs h <- openFile arg ReadMode str <- hGetContents h case xmlParse "list.xml" str of (Document _ _ (Elem _ _ contents)) -> mapM_ print $ map getCont contents getCont = map content . contFilter contFilter :: CFilter contFilter = f `o` (tag "function") f = cat [ ("name"?) , multi txt `o` (keep /> tag "description") ]
564 名前:562 mailto:sage [2005/05/02(月) 13:22:59 ] <module name="List"> <function name='deleteBy' type='(a -> a -> Bool) -> a -> [a] -> [a]'> <description> similar to <f>delete</f>, but it allows the programmers to supply their own equality test </description> <example> <in>deleteBy (\x y -> y `mod` x == 0) 4 [6,8,10,12]</in> <out>[6,10,12]</out> </example> </function> </module>
565 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 14:30:17 ] 今月の文章は先月の和田先生のよりわかりにくいなあ。 例題をどう解くかの説明が全くなくて、説明もHaskellの説明にはなってるけど 例題のプログラムの説明としてはかなり端折られてるのが原因かな。
566 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 22:34:11 ] バイナリファイルを弄りたいんですけど Haskellでビット演算の関数とか演算子とか あれば教えてください。
567 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 23:38:07 ] :browse Bits
568 名前:デフォルトの名無しさん mailto:sage [2005/05/18(水) 22:14:20 ] >>567 ありがとうっす
569 名前:デフォルトの名無しさん [2005/05/20(金) 23:02:42 ] モナドって全然わかない
570 名前:デフォルトの名無しさん mailto:sage [2005/05/20(金) 23:16:00 ] ↑日本語もわかない人
571 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 01:33:08 ] 最近自分は悟った。 モノイドとか圏論とかの背景思想を無視して 使う立場だけからいうと モナドは数珠繋ぎ強制ギプスみたいなものだと。 (IO Char)とか(IO Int)とかの型は CharやIntの値がくるまれたカプセルみたいなもんだ。 ちなみにIO ()の()はCでいうvoid型 return xx とやると普通の値もIOモナドで包むことができる。
572 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 01:33:49 ] ただしIOモナドは一度くるんだら中身を取り出す方法がない。 IO型の関数を普通の関数と組み合わせても型違いで コンパイルエラーになる。 (IO ()ももちろん型違いでエラー) そこでモナドの中身の値を 橋渡しするアダプタ(>>=)を使う。 結局>>=や>>で(IO xxx)型の関数同士やreturn xxで 数珠繋ぎにするしかないように強制される。
573 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 01:42:17 ] そいつは面倒だあ
574 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 01:43:08 ] IOモナドってGPLみたいだなとか思った。
575 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 01:48:49 ] 数珠つなぎのしくみや値を包みこむ性質を利用して 他にもいろいろなモナドがあるし自分でも作れる(かもしれない) Stateモナドは数珠繋ぎを利用して IOモナドみたいな状態遷移を自分で作れる。 Maybeモナドは値を包むほうが主眼のモナド 実際の値の代わりにNothingというダミーを 突っ込んでおくことができる。 データベースのNULL値みたいに使える。
576 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 01:57:53 ] モナドと聞くと王監督の顔が思い浮かぶのは何故?
577 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 02:24:06 ] >>571 >CharやIntの値がくるまれたカプセルみたいなもんだ。 俺にはこの表現がなじまない。 カプセルってのは中身が取り出せてこそのものだよな。 だから、「CharやIntにに関係する何か」くらいの認識しかできない。
578 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 12:13:59 ] 自分でIO型の関数作れば 前のIO関数から>>=で渡された 中身の生の値をちゃんと自由に扱える。 「取り出す方法が無い」んじゃなくて 「>>=を使って(間接的に)取り出すしか方法が無い」が 正しいかも。
579 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 12:15:56 ] monadic I/Oの意味論を破壊して喜ぶって、マゾですか?
580 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 12:16:44 ] そーゆーのには、 C言語とアセンブラがお勧め(w
581 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 12:30:25 ] >576 ワロス 俺も思いついた
582 名前:デフォルトの名無しさん [2005/05/21(土) 16:33:47 ] もな〜ももなど?
583 名前:デフォルトの名無しさん [2005/05/21(土) 20:30:44 ] >>549 そのとおりだよね。
584 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 20:44:49 ] >>583 だからー、 その件はLISPマクロのようには書けないって話だろーが
585 名前:デフォルトの名無しさん [2005/05/21(土) 21:04:10 ] >>559 名前渡し?遅延評価ってそういうことなのでは?
586 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 21:12:59 ] 名前をキーワードとして扱う?CLtL4の仕様ですか?w
587 名前:566 mailto:sage [2005/05/21(土) 21:23:20 ] 某バイナリファイルのヘッダ構造体の読み込み関数が だいたい目処がたってきますた。 ところでdata宣言で作った構造体?にたいする Javaのシリアライズみたいな仕組みやライブラリって Haskellにはないんすかね? リフレクションみたいな仕組みがないと無理? ファイルフォーマットをリストで与えて結果もリストで返すみたいなのは できそうだけどそれじゃせっかくの強力な型システムが活かせないような、、
588 名前:デフォルトの名無しさん [2005/05/21(土) 21:25:51 ] >>585 あ、違うか 名前渡してないもんね 普通の意味の値の他に名前も値にできるようでないと圏論的には不完全なようなキガス
589 名前:デフォルトの名無しさん [2005/05/21(土) 21:28:21 ] とゆーことは変数のポインタでいいのかどうか
590 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 21:39:32 ] >圏論的には不完全 というと?
591 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 16:51:02 ] ちょっと質問です。 二項関係 r の反射的・対称的・推移的閉包に (x,y) が属するかどうかを判定する関数 inEqvCl ってのを書いてみたんですけど、もうちょっとすっきりした書き方とかないでしょうか? inEqvCl :: Eq a => (a,a) -> [(a,a)] -> Bool inEqvCl _ [] = False inEqvCl (x,y) s = chk s y x where chk lst v u | v == u = True | v `elem` ux = True | otherwise = or $ map (chk lst' v) ux where lst' = [ p | p <- lst, u /= fst p, u /= snd p ] ux = do p <- lst if u == fst p && u /= snd p then return $ snd p else if u == snd p && u /= fst p then return $ fst p else fail "" 実行例 (2,1) `inEqvCl` [(0,2),(3,4),(5,4),(1,5),(5,0),(6,7),(8,7)] => True (1,6) `inEqvCl` [(0,2),(3,4),(5,4),(1,5),(5,0),(6,7),(8,7)] => False
592 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 21:57:54 ] >>591 こんなのでどうかな。 題意を理解していないので間違ってたらスマソ import List inEqvCl :: Eq a => (a, a) -> [(a, a)] -> Bool inEqvCl _ [] = False inEqvCl (x, y) s | x == y = True | y `elem` ns = True | otherwise = any con ns where ns = map snd $ filter ((==x) . fst) exts exts = s ++ map (uncurry $ flip (,)) s con n = inEqvCl (n, y) (s\\[(x, n), (n, x)])
593 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 22:23:13 ] 面白そうなのでオレもやってみた。 -- 同値類のリストを算出 classify :: Eq a => (a, a) -> [[a]] -> [[a]] classify (x, y) [] = [[x, y]] classify (x, y) (c : cs) | x `elem` c = (y : c) : cs | y `elem` c = (x : c) : cs | otherwise = c : classify (x, y) cs inEqvCl :: Eq a => (a, a) -> [(a, a)] -> Bool inEqvCl (x, y) lis = (not . null) (filter (f x y) (foldr classify [] lis)) where f x y c = x `elem` c && y `elem` c いろいろ最適化の余地があるが。
594 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 22:32:57 ] あ、>>593 間違ってるわ。これだと [(3, 4), (1, 3), (2, 4)] とかで うまくいかない。
595 名前:591 mailto:sage [2005/05/22(日) 22:42:11 ] >>592-594 ありがとうございます。 やっぱり短く書けるんですね。
596 名前:デフォルトの名無しさん [2005/05/23(月) 22:10:44 ] 無限のリストだと止まらなくなるかな
597 名前:シミュレーション板GPスレから来ました [2005/05/24(火) 01:12:59 ] PolyGP: A Polymorphic Genetic Programming System in Haskell ↑のプログラムソース PolyGP.tar って、uclのサイトから消えている様ですが、 どこかにバックアップないでしょうか? よろしく、おながいします。
598 名前:591 mailto:sage [2005/05/24(火) 05:44:25 ] とりあえず問題が2つありました。 1. 反射的閉包なんで、inEqvCl (x,x) [] == Trueにならないといけない。 >>592 さんのからinEqvCl _ [] = Falseを取り除けばOK。 2. (\\)は最初の1つしか取り除かないので、最初の集合に対称なものがあると拙い。 (\\)の代わりに下の(//)を使って対処。 (//) :: Eq a => [a] -> [a] -> [a] xs // ys = [ x | x <- xs, x `notElem` ys ] >>596 無限リストは今回は対象外なので問題ないです。(^^;
599 名前:デフォルトの名無しさん mailto:sage [2005/05/27(金) 00:42:11 ] Haskellの配列の更新(//)は一部変更でも配列全部作り直したり してるんですか? リングバッファとかに使っても大丈夫ですか?
600 名前:デフォルトの名無しさん mailto:sage [2005/05/27(金) 01:42:54 ] 600
601 名前:599 mailto:sage [2005/05/27(金) 22:02:30 ] >>599 自己レス ttp://d.hatena.ne.jp/tanakh/20040809#p1 ここみるとだめっぽい感じでした GCが仕事してくれること期待して 配列ガシガシ使い捨てにでもするか
602 名前:デフォルトの名無しさん mailto:sage [2005/05/27(金) 22:21:03 ] いつまでたっても関数型のボトルネックだな>配列・構造体 これが解決しない限り関数型が栄えることは無い
603 名前:デフォルトの名無しさん mailto:sage [2005/05/27(金) 22:21:57 ] 俺達でwadlerを唸らせる解を考えよう
604 名前:デフォルトの名無しさん [2005/05/28(土) 01:00:55 ] 配列も、マクロな視点で見ればただの変数に変わりない だから、修正された瞬間複製するのが妥当な戦略だろう しかし、オリジナルが参照されないとわかっているなら複製する必要ないから複製を省略する。 ここまで考えてふと思いついた。 すなわち差分をもっとけばいいんじゃないかと。 配列n番目更新しますた!更新しますた!という情報を各インデクス毎に持っとくわけよ 配列を全て更新しおわたとしても、またさらに更新するかもしれない その場合はまたその差分を作るわけよ するとどうだい? 差分として分解された各配列の要素はまるでりすt(ry おれには難しすぎたようだ!
605 名前:デフォルトの名無しさん mailto:sage [2005/05/28(土) 01:13:09 ] >>602 Uniqueness Typing
606 名前:デフォルトの名無しさん [2005/05/28(土) 05:03:54 ] 配列や構造体もモナドにしたら?
607 名前:デフォルトの名無しさん mailto:sage [2005/05/28(土) 08:38:44 ] starray とかいうモナドがあると聞いたが 漏れは調べてないので諸君調べて報告してくれ
608 名前:デフォルトの名無しさん mailto:sage [2005/05/28(土) 11:15:19 ] マクド
609 名前:デフォルトの名無しさん mailto:sage [2005/05/28(土) 13:50:31 ] >>606 つIOUArray
610 名前:デフォルトの名無しさん [2005/05/28(土) 14:11:18 ] 伝説のモナド
611 名前:デフォルトの名無しさん [2005/05/28(土) 14:23:54 ] ナボナ@亀屋万年堂 www.navona.co.jp/ これのことでしょ?
612 名前:デフォルトの名無しさん [2005/05/28(土) 20:20:45 ] >>607 それはスタレイました
613 名前:デフォルトの名無しさん [2005/05/28(土) 20:52:42 ] >>28 で紹介されているrrr.jin.gr.jp/ のRWikiがNot Foundで見れません。 どうしたらよかとですか?
614 名前:613 mailto:sage [2005/05/28(土) 20:54:47 ] 自己解決しました。 ://pub.cozmixng.org/~the-rwiki/rw-cgi.rb にありました。
615 名前:デフォルトの名無しさん [2005/05/30(月) 20:59:12 ] ハスケルを勉強したい時にはどうしたらいいですか? 日本語の丁寧なチュートリアル文献がありますか? >>1 のは難しいですよ
616 名前:デフォルトの名無しさん mailto:sage [2005/05/30(月) 21:15:20 ] >>615 1. haskellで適当なコードを書く 2. -ddump-realCをつけてコンパイル 3. 1と2の結果を見比べる
617 名前:デフォルトの名無しさん mailto:sage [2005/05/30(月) 21:46:39 ] >>615 ttp://www.geocities.jp/shido_takafumi/hs/index_hs.html とか。
618 名前:デフォルトの名無しさん mailto:sage [2005/05/30(月) 22:05:26 ] >>616 これなかなか良いね。
619 名前:デフォルトの名無しさん mailto:sage [2005/05/30(月) 22:21:34 ] >>615 www.sampou.org/cgi-bin/haskell.cgi?Programming%3aWayToHaskeller&l=jp とかはどう?
620 名前:デフォルトの名無しさん mailto:sage [2005/05/30(月) 22:29:19 ] >>616 Cに落とさなくてもcore言語レベルでいいんじゃない?
621 名前:デフォルトの名無しさん [2005/05/31(火) 09:34:43 ] mona do !
622 名前:デフォルトの名無しさん [2005/06/02(木) 00:38:18 ] monadius
623 名前:sage [2005/06/02(木) 14:55:24 ] Hugsなんだけど Main> -1 ってやると -1 Main> ( - 1) 2 とやると ERROR - Unresolved overloading *** Type : (Num a, Num (a -> b)) => b *** Expression : fromInt (-1) 2 んん?(-) は単項演算子なのか!? しかしMain> ( - ) 1 2 とやると -1 とかえってくる。 (-)は二項演算子ってことになってるんじゃなかったのか!? www.sampou.org/haskell/tutorial-j/numbers.html >negate は Haskell では唯一採用された前置演算子です。 >これを (-) と書くことはできません。 >それは、こう書けば、減算関数になってしまうからです。 どうなってるの?>識者の方々
624 名前:デフォルトの名無しさん mailto:sage [2005/06/02(木) 15:56:22 ] -1 (- 1) (- 1) 2 の - はnegateのことで単項演算子 (-) 1 2 ((-) 1) 2 (1 -) 2 1 - 2 の - は二項演算子
625 名前:デフォルトの名無しさん mailto:sage [2005/06/02(木) 17:54:00 ] >>624 それって上の引用の記述と矛盾してないかって事。 HugsはHaskell98モードでも再現したよ。 上の記述が古いのかHugsの独自仕様なのか、、、 実際-1と書けたほうが便利だけどね。 一瞬 「(\x -> x - 1) を 自動的に -1 に変換してるのかHaskell凄えな」 と思ったけど 型が全然違うし。
626 名前:デフォルトの名無しさん mailto:sage [2005/06/02(木) 19:21:51 ] 括弧のついてない - はその直前に第1引数になるものがなければ単項演算子として解釈されるってだけなんじゃないの。
627 名前:デフォルトの名無しさん mailto:sage [2005/06/02(木) 20:15:18 ] >>623 原文は >negate is the function applied by Haskell's only prefix operator, minus; we can't call it (-), because ... だから、誤訳かと。 一応報告しておいた。
628 名前:デフォルトの名無しさん [2005/06/02(木) 23:01:09 ] >>625 >それって上の引用の記述と矛盾してないかって事。 どこが?
629 名前:デフォルトの名無しさん mailto:sage [2005/06/02(木) 23:12:15 ] 誤訳なのか? "minus"が抜け落ちてるけど大意は変わらない気がするが。 単にセクションと単項のマイナスが構文上区別できなくて、その場合は単項マイナスの方を優先するってだけの話じゃん。 www.sampou.org/haskell/report-j/exps.html#sections より > - は文法上、特別扱いで、(- exp) はセクションではなく、前節で説明したように前置の符号反転演算子の適用である。
630 名前:623 mailto:sage [2005/06/02(木) 23:25:28 ] 誤訳か誤読かはともかく納得しますた。 これから安心して-1って書けるよ
631 名前:デフォルトの名無しさん mailto:sage [2005/06/02(木) 23:27:07 ] 最近すげぇ低レベルの話題ばっかなのは、 やっぱ新入生??
632 名前:デフォルトの名無しさん mailto:sage [2005/06/02(木) 23:31:21 ] ヒント:ネタ切れ
633 名前:623 mailto:sage [2005/06/03(金) 01:25:03 ] レベル低くてゴメンよ 配列の更新についてネタ振ったのも自分 学生じゃないけど 最近Haskellに挑戦してるのさ 初心に帰って楽しい。 ところでソースアップできるところないすか
634 名前:デフォルトの名無しさん mailto:sage [2005/06/03(金) 01:35:40 ] >>629 >>623 の表現だと単項マイナスが存在しないように読めるから、誤訳といっていいと思う。
635 名前:デフォルトの名無しさん [2005/06/04(土) 14:08:09 ] 33 名前: 名無しさん@毎日が日曜日 Mail: 投稿日: 05/06/03 21:46:40 ID: M3Iswrux type Dame = Human jobHunting :: Dame -> [Company] -> Maybe Future jobHunting _ [] = Nothing jobHunting d (c:cs) | hasShokureki d = Just Saiyou | (age d) < 25 = Just Saiyou | otherwise = jobHunting d cs
636 名前:デフォルトの名無しさん mailto:sage [2005/06/04(土) 18:42:44 ] >>602 そんな貴方に APLやJやKはいかが? 関数型言語スレで話題になってたと思うが、過去ログ倉庫入りかも。
637 名前:デフォルトの名無しさん mailto:sage [2005/06/04(土) 21:35:16 ] APLやJやKは、関数型言語の源流というだけで、今更な言語。 APL挙げるくらいなら、KRCやFを挙げるよな、まともな人間なら。
638 名前:デフォルトの名無しさん [2005/06/04(土) 21:56:08 ] Lisp -> ML -> Haskell ってながれじゃないの?
639 名前:デフォルトの名無しさん mailto:sage [2005/06/04(土) 22:13:17 ] ? 現在の関数型言語ブームの源流は、 Fortran、BNF、1977年チューリング賞受賞者John BackusのFL(F言語) で す が 何 か ?
640 名前:デフォルトの名無しさん mailto:sage [2005/06/05(日) 03:19:55 ] い い え 何 も ?
641 名前:デフォルトの名無しさん mailto:sage [2005/06/05(日) 04:13:34 ] C++ → くそ C → くそ Java → くそ Fortran → くそ ML → ゴミ Haskell → ゴミ Ocaml → クズ Ruby → クズ Lisp → クズ Forth → クズ λ-Cal → アホ π-Cal → アホ μ-Cal → アホ φ-Cal → アホ
642 名前:デフォルトの名無しさん mailto:sage [2005/06/05(日) 04:14:31 ] コピペうざ
643 名前:デフォルトの名無しさん mailto:sage [2005/06/05(日) 04:24:33 ] >>637 関数型言語の源流というよりは、配列計算言語の源流でわ? SとかRとか(SASとかSPSSとか)、影響うけてるでそ?
644 名前:デフォルトの名無しさん mailto:sage [2005/06/05(日) 09:50:00 ] >>現在の関数型言語ブーム え、今、ブ、ブームなんですか...... よい時代に生まれたことを感謝します。
645 名前:デフォルトの名無しさん mailto:sage [2005/06/05(日) 10:06:10 ] 空前のブームのため、Haskellプログラマは企業から引っ張りだこです。
646 名前:デフォルトの名無しさん mailto:sage [2005/06/05(日) 10:17:20 ] >>645 / ̄ ̄ ̄ ̄ ̄ ミ / ,――――-ミ / / / \ | | / ,(・) (・) | (6 つ | | ___ | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | /__/ / < なわけねーだろ!! /| /\ \__________
647 名前:623 mailto:sage [2005/06/05(日) 16:30:18 ] とりあえずLha展開関数動いたよ。 www3.atwiki.jp/nanakoso/pages/4.html だれかモナドを2つ以上同時に使う方法教えて下さい。
648 名前:デフォルトの名無しさん mailto:sage [2005/06/05(日) 16:56:31 ] >>647 モナド変換子で合ってる。
649 名前:623 mailto:sage [2005/06/06(月) 01:12:37 ] www.sampou.org/haskell/a-a-monads/html/transformers.html やっぱりこの辺りは避けて通れませんか。 モナドをやっつけたと思ったらまた難物が、、、
650 名前:デフォルトの名無しさん [2005/06/06(月) 23:25:48 ] ええっと、haskellよりmathematicaの方が有能だしいいのでは関数型として?
651 名前:デフォルトの名無しさん mailto:sage [2005/06/06(月) 23:33:24 ] 放置。
652 名前:デフォルトの名無しさん mailto:sage [2005/06/07(火) 05:06:03 ] Haskellで数式処理システム作ろう!とかいう噺があったやうな…?
653 名前:デフォルトの名無しさん mailto:sage [2005/06/07(火) 05:44:29 ] >>649 こんどはCIAか?
654 名前:デフォルトの名無しさん mailto:sage [2005/06/07(火) 22:43:11 ] いや、FBIです
655 名前:デフォルトの名無しさん [2005/06/10(金) 17:09:38 ] 649>>haskell.org/hawiki/MonadTransformers に簡単なつかいかたとかあるよ。がんばれ!
656 名前:デフォルトの名無しさん [2005/06/29(水) 17:18:46 ] WinXPにHugsを導入したんですけど、読み込みまでは行くみたいなんですけど 実行してみると結果が表示されません。 例えば myfactorial :: Int -> Int myfactorial n | n == 0 = 1 | otherwise = n * myfactorial (n-1) というファイルを読み込んで myfactorial 5 と入力しても何も結果が表示されずに Main> という状態に戻ってしまいます。何か原因があるのでしょうか。
657 名前:¬656 mailto:sage [2005/06/29(水) 22:55:14 ] XPでやってみたところ、GUIのやつ(WinHugs)が駄目なようです。 オプションあたりが怪しいけどサパーリ
658 名前:デフォルトの名無しさん mailto:sage [2005/07/04(月) 22:20:14 ] ghcでControl.Monad.Readerをインポートすると Monad ((->) r)のインスタンス宣言(中味はReaderと同じ)が 付いてくるっぽいんだが、いったいこれは何なんだ? かなり便利だから積極的に使いたい気もするけど、 ドキュメントされてないみたいだし。 import Control.Monad.Reader -- 3で割れて、かつ5で割れない自然数 t = filter (liftM2 (&&) ((==0) . (`mod`3)) ((/=0) . (`mod`5))) [0..]
659 名前:デフォルトの名無しさん mailto:sage [2005/07/04(月) 23:50:56 ] Vital 使ってる人居ます? www.cs.kent.ac.uk/projects/vital/
660 名前:デフォルトの名無しさん mailto:sage [2005/07/10(日) 19:53:36 ] I/Oをマクロは解決しないか
661 名前:デフォルトの名無しさん [2005/07/11(月) 23:39:29 ] FpLの抽象構文を拡張して、利用者定義関数が算術式と論理式とを混在してとることができるようにするにはどうすればよろしいですか?評価意味論を適当に拡張するらしいのですが・・・
662 名前:デフォルトの名無しさん [2005/07/11(月) 23:40:00 ] 名前呼びを用いると、ある式eに対してD,ρ├ e ⇒ A kとなる数字kが存在するけれども、値呼びを用いると、D,ρ├ e ⇒ A kとなる数字が存在しない宣言の例ってありますか?
663 名前:デフォルトの名無しさん mailto:sage [2005/07/12(火) 07:34:27 ] まず元ねたを書け。話はそれから。
664 名前:デフォルトの名無しさん mailto:sage [2005/07/19(火) 18:29:38 ] 圏論の基礎 日本語訳 S.マックレーン www.amazon.co.jp/exec/obidos/ASIN/4431708723/qid=1121765296/sr=8-1/ref=sr_8_xs_ap_i1_xgl/250-1176990-6892214
665 名前:デフォルトの名無しさん mailto:sage [2005/07/19(火) 20:19:44 ] "Catefories for Working Mathematician" (働く数学屋のための圏論) の題名が 「圏論の基礎」になっちまうんだとしたら、 "Categories, Types, and Structures: An Introduction to Category Theory for the Working Computer Scientist (Foundations of Computing Series)" の題名はどーなるんだ? 「一週間で判る!くもんしきけんろん (いちねんせいむけ)」か(笑
666 名前:デフォルトの名無しさん mailto:sage [2005/07/19(火) 20:31:23 ] >>664 買っちゃった。
667 名前:デフォルトの名無しさん mailto:sage [2005/07/19(火) 20:43:25 ] >>666 でどうよ? >>665 "Basic Category Theory for Computer Scientists (Foundations of Computing)" 「圏論の超基礎」つうのもある・・・
668 名前:デフォルトの名無しさん mailto:sage [2005/07/19(火) 20:47:40 ] "Categorical Logic and Type Theory (Studies in Logic and the Foundations of Mathematics)" 「論理&数学ラブ♥な人のための、カテゴリー・ロジックと型理論」 なんつう分厚い数学書も買うには買ったけど、これは完全に死蔵本だな、たぶん。
669 名前:デフォルトの名無しさん [2005/07/19(火) 20:49:10 ] ってな意味で、いきなり訳書を読めるアンタ(>>666 )、 幸せ者だぞゴラァ!!!
670 名前:デフォルトの名無しさん mailto:sage [2005/07/19(火) 21:17:36 ] >>667 誤植が多いみたい。
671 名前:デフォルトの名無しさん mailto:sage [2005/07/19(火) 22:24:11 ] 誤訳じゃなくて誤植ってのが泣けるね。
672 名前:デフォルトの名無しさん mailto:sage [2005/07/19(火) 23:39:47 ] 「できる圏論」
673 名前:デフォルトの名無しさん mailto:sage [2005/07/19(火) 23:40:57 ] モノイダル圏とか分からない件
674 名前:デフォルトの名無しさん [2005/07/21(木) 16:22:11 ] www.sampou.org/haskell/tutorial-j/goodies.html 暇だからこれ読んでたんだが、ユーザ定義型のデータ構築子と型構築子の意味が分らん。 誰かなんかC,C++の似たような概念の用語で分りやすい説明キボンヌ。
675 名前:デフォルトの名無しさん mailto:sage [2005/07/21(木) 18:51:43 ] データ構築子 <=> classのコンストラクタ 型構築子 <=> template
676 名前:デフォルトの名無しさん mailto:sage [2005/07/21(木) 21:21:07 ] 型構築子はtypedefでは?
677 名前:デフォルトの名無しさん mailto:sage [2005/07/21(木) 21:34:50 ] typedef は多相(総称?)型の定義ができんでしょ。
678 名前:デフォルトの名無しさん mailto:sage [2005/07/21(木) 23:42:00 ] CやC++でプリミティブと言われてる型は、Haskellでは全て列挙型 という見方をするの? data Int = -65332 | ... | -1 | 0 | 1 | ... | 65332 という例が載ってるけど、こんな感じに、 新たに型を作る。作られる型がデータ構築子 そのときに型のデータのインスタンスを列挙する。列挙されるのがデータ構築子。 こんな感じでいいのかな?頭悪くてすいませんねw
679 名前:デフォルトの名無しさん mailto:sage [2005/07/21(木) 23:43:28 ] ×新たに型を作る。作られる型がデータ構築子 ○新たに型を作る。作られる型が型構築子
680 名前:デフォルトの名無しさん mailto:sage [2005/07/21(木) 23:52:20 ] しかし新たに型を定義する式のためのキーワードがdataで、 Cのtypedef風なものにtypeが使われてるのはなんかちょっと違和感あるというか。 typeはいいとして、なんでdataなの?
681 名前:デフォルトの名無しさん mailto:sage [2005/07/22(金) 00:54:47 ] >>680 データ型宣言だから、では駄目かい?
682 名前:デフォルトの名無しさん mailto:sage [2005/07/22(金) 08:43:46 ] >>681 厨房臭いんですが、dataってのは納得できないですね。 それはまあいいとして、このスレはちょっとレベルが違いすぎるので、 初心者はこっちで質問することにしました。どうもです。 関数型言語Part IV pc8.2ch.net/test/read.cgi/tech/1083649982/
683 名前:デフォルトの名無しさん mailto:sage [2005/07/22(金) 08:52:28 ] 言語に特有の質問なんだから、このスレのほうがいいんじゃないか?
684 名前:デフォルトの名無しさん mailto:sage [2005/07/22(金) 13:15:03 ] SMLはtype synonym宣言に'type'、データ型宣言に'datatype'を使う。 Haskellはそいつを参考にしたが、'datatype'は長いので'data'にした。 というのも考えられるかも。
685 名前:デフォルトの名無しさん mailto:sage [2005/07/22(金) 13:45:51 ] OCamlなら全部typeで済ませられるぞ(逆に言うと宣言の見掛け上区別できない)。
686 名前:デフォルトの名無しさん mailto:sage [2005/07/27(水) 20:28:46 ] Peyton Jonesの本が面白すぎて夜も眠れません。
687 名前:デフォルトの名無しさん mailto:sage [2005/07/28(木) 01:59:51 ] HaskellからCleanに宗派変えてみる。
688 名前:デフォルトの名無しさん mailto:sage [2005/08/13(土) 00:17:46 ] ここでは、こういうネタはスレ違い? www.geocities.jp/takascience/windows/monadius.html 本家からもリンクされてる。 Monadius A shoot 'em up game using OpenGL. Takayuki Muranushi also wrote a couple of other games in Haskell. www.haskell.org/practice.html
689 名前:デフォルトの名無しさん mailto:sage [2005/08/26(金) 17:04:35 ] _|_って何から来てるんですか? 数学?
690 名前:デフォルトの名無しさん mailto:sage [2005/08/26(金) 18:12:56 ] >>689 うん
691 名前:デフォルトの名無しさん mailto:sage [2005/08/26(金) 20:28:34 ] どの分野か教えてもらえますか?これも圏論?
692 名前:デフォルトの名無しさん mailto:sage [2005/09/06(火) 17:46:57 ] 越田先生@東京工科大のレジュメ www.teu.ac.jp/kougi/koshida/Prog6/ ってのは、今はどこで見れるの?
693 名前:デフォルトの名無しさん mailto:sage [2005/09/06(火) 18:33:49 ] www.teu.ac.jp/10/002921.html もう読めないのかも。Internet archiveにはあるか?
694 名前:デフォルトの名無しさん mailto:sage [2005/09/06(火) 19:48:40 ] >>693 亡くなられたのか……まだ若いのに。 プログラム工学VI 授業関連資料 web.archive.org/web/20031014180912/http://www.teu.ac.jp/kougi/koshida/Prog6/index.html
695 名前:デフォルトの名無しさん mailto:sageチラシの裏にでも書いています [2005/09/07(水) 00:28:33 ] >>693 うへー、マジカヨ。 ご冥福をお祈りいたします。
696 名前:デフォルトの名無しさん mailto:sage [2005/09/07(水) 00:32:24 ] 貴重な(ry
697 名前:デフォルトの名無しさん mailto:sage [2005/09/07(水) 01:58:27 ] この人のチュートリアルをどこかにページにそのままうpしたらまずいのかな? 需要はかなりあると思うのだが。
698 名前:デフォルトの名無しさん mailto:sage [2005/09/07(水) 14:24:35 ] それより誰かが成書に仕上げて印税が遺族に行くようにできるとよいな。
699 名前:デフォルトの名無しさん mailto:sage [2005/09/07(水) 19:19:39 ] おいおい越田先生、死んだのかよ。面識なんてもちろんないけど チュートリアル何度も読んでたから、泣けてくるじゃネーか 合掌(-人-)
700 名前:デフォルトの名無しさん mailto:sage [2005/09/13(火) 02:08:53 ] >>693 ひさしぶりに覗いたら悲しい知らせが。 南無。 そしてありがとう。
701 名前:デフォルトの名無しさん mailto:sage [2005/09/15(木) 09:54:51 ] mono.kmc.gr.jp/~oxy/hiki.cgi?rtype
702 名前:デフォルトの名無しさん mailto:sage [2005/09/16(金) 03:51:24 ] Ruby 2.0 勝手に実装してくれよ
703 名前:デフォルトの名無しさん mailto:sage [2005/09/16(金) 04:46:06 ] 実装できるほどの仕様が決っていないのでは?
704 名前:デフォルトの名無しさん mailto:sage [2005/09/19(月) 17:14:40 ] ここでPugsの話題が出ないのが謎 本家よりずっと先にリリースって、すげーと思わない?
705 名前:デフォルトの名無しさん [2005/09/21(水) 02:03:18 ] すげー過疎 とりあえずVersion 6.4.1リリースage
706 名前:デフォルトの名無しさん [2005/09/24(土) 00:34:03 ] 引数のパターンマッチング guard if-then-else case-of って基本的には同じですか?
707 名前:デフォルトの名無しさん [2005/09/24(土) 01:44:59 ] 引数のパターンマッチングと case-of はほとんど同じと考えてよい。 if とパターンマッチは違う。 パターンマッチには真理値で条件を与えることができる。これはガード部とか 言われる。 guard がそのことを指して書いたのであれば、 if と似ていると は言えるかもしれない。 guard 関数はぜんぜんまったく関係ない。
708 名前:デフォルトの名無しさん mailto:sage [2005/09/24(土) 11:29:13 ] if b then t else f は case b of { True -> t; False -> f; } の省略記法。この意味では同じといえると思う。
709 名前:デフォルトの名無しさん mailto:sage [2005/09/24(土) 16:38:46 ] その4つは束縛変数を導入できるかという点で区別することもできるね。
710 名前:デフォルトの名無しさん mailto:sage [2005/09/24(土) 19:55:50 ] ここにいる奴って、普段何してるんだよ haskellでオナニーできてるか?
711 名前:デフォルトの名無しさん mailto:sage [2005/09/24(土) 21:19:20 ] 昨日STGで2回…
712 名前:デフォルトの名無しさん mailto:sage [2005/09/24(土) 23:20:51 ] monadタソ(;´Д`)ハァハァ
713 名前:デフォルトの名無しさん mailto:sage [2005/09/26(月) 18:07:59 ] ★〜彼方の願い星〜★ このレスを見た人は、超ラッキーな人♪ でも、このレスを見ただけじゃ何も起らないよ。 効果を実感したいなら、このレスを5回違うスレにレスしてね♪ だぁい好きなあの人に告られたり、 成績がどんどん良くな★〜彼方の願い星〜★ このレスを見た人は、超ラッキーな人♪ でも、このレスを見ただけじゃ何も起らないよ。 効果を実感したいなら、このレスを5回違うスレにレスしてね♪ だぁい好きなあの人に告られたり、 成績がどんどん良くなって、先生に褒められちゃったり...。 次々とHAPPYな事が訪れます♪ 此の頃変なのがいっぱい回★〜彼方の願い星〜★ このレスを見た人は、超ラッキーな人♪ でも、このレスを見ただけじゃ何も起らないよ。 効果を実感したいなら、このレスを5回違うスレにレスしてね♪ だぁい好きなあの人に告られたり、 成績がどんどん良くなって、先生に褒められちゃったり...。 次々とHAPPYな事が訪れます♪ 此の頃変なのがいっぱい回っ★〜彼方の願い星〜★ このレスを見た人は、超ラッキーな人♪ でも、このレスを見ただけじゃ何も起らないよ。 効果を実感したいなら、このレスを5回違うスレにレスしてね♪ だ これが本物の、初代HAPPYメールです♪ってますが、これは本当です!! これが本物の、初代HAPPYメールです♪って、先生に褒められちゃったり...。 次々とHAPPYな事が訪れます♪ 此の頃変なのがいっぱい回ってますが、これは本当です!! これが本物の、初代HAPPYメールです♪
714 名前:デフォルトの名無しさん mailto:sage [2005/09/28(水) 23:39:39 ] Emacsのハスケルモ〜ドって使いにくくないですか? 特にインデントが何回も叩かないと希望の位置にこない。
715 名前:デフォルトの名無しさん mailto:sage [2005/09/29(木) 00:00:52 ] haskell-mode、出来はすごく良いと思うけど。 インデントはすくなくとも手で揃えるより楽だし、ローテートしてくれるのは良いよ。 関数定義も補完してくれるし。 ただcase 〜 of のインデント位置のポリシーだけは気にいらないな。あれは of の前で改行することを想定しているのだろうか。
716 名前:デフォルトの名無しさん mailto:sage [2005/09/29(木) 00:29:05 ] そうですか。もうちょっと頑張って使い込んでみます。 あと、M-x turn-on-haskell-hugs して C-c C-l するとEmacsが固まって C-g打つまで帰ってこなくなるんですが、何か設定が必要なのでしょうか? Hugs.Base> というプロンプトで一回 :load して、プロンプトが Main> になった後はすんなり動くんですが。 Emacsのバージョンは21.3です。
717 名前:デフォルトの名無しさん mailto:sage [2005/09/29(木) 01:20:23 ] Haskell-modeは優秀だと思う。
718 名前:デフォルトの名無しさん mailto:sage [2005/09/29(木) 01:40:00 ] >716 そういう症状は体験したことがないなあ。自分はおおむね www.haskell.org/haskell-mode/installation-guide.html のように設定している。 でも最近はもっぱら ghci で hugs を使ってませんねぇ。
719 名前:デフォルトの名無しさん mailto:sage [2005/09/29(木) 12:16:49 ] 716ですが原因を特定しました。 私の環境ではhugsを起動した直後のプロンプトは Hugs.Base> なのですが、huskell-hugs-start-processでcomint-prompt-regexpに設定する パターンが"^\? \\|^[A-Z][_a-zA-Z0-9]*> "となっていて ドットを含まないためのようです。これを修正すると問題は解消しました。 (せめてdefvarしていて欲しかった……) hugsもhaskell-mode.elもFreeBSDのportsで入れたのですが、みなさんの hugsではプロンプトは別の文字列なのでしょうか?
720 名前:デフォルトの名無しさん mailto:sage [2005/09/29(木) 20:46:48 ] >719 少し前(200311_1)には Prelude> だったが、今は確かに Hugs.Base> になってるね。
721 名前:デフォルトの名無しさん mailto:sage [2005/09/29(木) 22:28:13 ] Haskell 使おうっと思ってんだけど、サンプルプログラムがなきゃ分からん。 いきなり Pugs, Rtype, Monadius だと手ごわすぎるので、もうちょい下のレベルで、 おすすめを教えて頂戴。 ウェブアプリを作ることがほとんどなので、Wiki, Blog(Diary), BBS 辺りが理想なんだけど。
722 名前:デフォルトの名無しさん mailto:sage [2005/09/29(木) 22:57:36 ] >>721 俺は特に何かをお薦めする程わかっちゃいないが、取り合えず www.haskell.org/practice.html を紹介しとく。
723 名前:デフォルトの名無しさん mailto:sage [2005/09/29(木) 23:04:55 ] >>722 さんきゅ。 とりあえず、 Flippi: a Wiki clone written in Haskell www.flippac.org/projects/flippi/ でも見てみるよ。
724 名前:デフォルトの名無しさん [2005/09/30(金) 11:39:06 ] 「連載: Haskellプログラミング」のメモ化のところがよーわからん。 State s t、withState、bindStateのところで詰まってしまった。 誰か日本語でわかりやすく説明して!
725 名前:デフォルトの名無しさん mailto:sage [2005/09/30(金) 17:42:10 ] Stateモナドの知識がないと難解だと思う。 type State s t = s -> (t, s) というのは、現在の状態を受け取って新しい状態とさらに何かを返す関数。 だから、State s t型の値を「状態を変更してついでに値を生み出す仕掛け」と見ることができる。 ここで、「状態を変更せずに常に決められた値xを生み出す仕掛け」は \state -> (x, state) と書ける。これがwithState x。 一方、「起動されたとき仕掛けxと仕掛けyが順に起動されたかのように振る舞う仕掛けthenState x y」は 次のように定義できる。 thenState :: State s a -> State s b -> State s b thenState x y = \s0 -> let (_, s1) = x s0 in -- xに初期状態s0を与えて起動、中間状態s1を得る。xによって生成された値は無視。 y s1 -- yに中間状態s1を与えて起動、終状態と値の組を得る。これはそのまま合成されたしかけの戻り値となる。 thenStateではxによって生成された値を無視したが、この値に基づいて 次に何をするか決めることができないと面白くない。そこで、yとして単なる仕掛けではなく、 「xによって生成された値を受け取って仕掛けを返す関数」を渡すことにする。 bindState :: State s a -> (a -> State s b) -> State s b bindState x y = \s0 -> let (result, s1) = x s0 in -- xを起動し… (y result) s1 -- …次に(y result)を起動
726 名前:デフォルトの名無しさん mailto:sage [2005/09/30(金) 22:49:12 ] すごくわかりやすい! あなたとても賢いね。 どうもありがとうございました。 State s t を状態遷移図での状態aから状態bへの矢印とイメージしました。 withState x は、状態遷移図で状態aから同じ状態aへ戻る矢印(出力x)ですね。
727 名前:デフォルトの名無しさん mailto:sage [2005/10/01(土) 11:13:33 ] Haskell はなかなか自分の思い通りにかけるようにならない orz
728 名前:デフォルトの名無しさん mailto:sage [2005/10/01(土) 14:23:21 ] Cとかと違ってプログラマのほうに能力がないと何もできんよな……
729 名前:デフォルトの名無しさん mailto:sage [2005/10/01(土) 20:48:54 ] Haskellで書くとバグがなくなると聞いたんですが本当ですか?
730 名前:デフォルトの名無しさん mailto:sage [2005/10/01(土) 22:48:41 ] バグは出にくいが慣れないうちは普通にコンパイルを通すだけで苦労する。
731 名前:デフォルトの名無しさん mailto:sage [2005/10/01(土) 23:21:49 ] >>729 俺も最初はランタイムエラーは絶対出ないものと思ってたけど guardとかの場合わけ漏れとか パターンマッチの不整合エラーがたまにある、、、 ぬるぽとかと比べて感覚的に頻度少ないけどね。
732 名前:デフォルトの名無しさん mailto:sage [2005/10/01(土) 23:59:39 ] >>729 いいえ
733 名前:デフォルトの名無しさん mailto:sage [2005/10/02(日) 00:42:37 ] 整数をゼロで割ると実行時エラーになるし。 完全でないパターンマッチは、ghcなら警告を出させることもできるから、 あとはプログラマの問題という気がするが。
734 名前:724 mailto:sage [2005/10/02(日) 05:03:11 ] 「連載: Haskellプログラミング」の9月号分を読んで なんとなく理解したところでは Haskellで評価の順序を強制するためにはCPSのように書くことが必要で、 Monadは継続に付加情報を(連続的にというか玉突き的にというか)持ち回る道具、 do構文はそれを手続き型のように書く構文、 というところだろうか?
735 名前:デフォルトの名無しさん mailto:sage [2005/10/02(日) 08:35:39 ] Monadは全てを記号論的に処理する枠組み doは状態遷移を隠蔽するモナド関数 で合ってる?
736 名前:デフォルトの名無しさん mailto:sage [2005/10/02(日) 09:44:07 ] >>734 Stateモナドについてならその理解でいいと思う。 ただし、モナドの意味論は個々のモナドでかわる。モナドそのものは 「do記法で書くことのできるひとまとまりの計算の構成を支援するもの」くらいではないかな。 たとえばIOモナドは副作用が存在しうるような場合の計算の順序の保証する。 Maybeモナドは途中でNothingになるかもしれない計算のまとまりを構成する。 などなど。 あとは「モナドのすべて」を読むといいと思うよ。 www.sampou.org/haskell/a-a-monads/html/index.html
737 名前:デフォルトの名無しさん mailto:sage [2005/10/03(月) 20:52:08 ] /\ / \ 今このとき,モナドは立ち上がる /∧_∧ \ /( ´∀`) /\ \( ) / \ \ / \ \/ \ ∧∧∧∧\ ( ´/) ))ヽ∧ / / / ´∀) ∧∧ ○( イ○ ( ,つ, ,゚Д゚) /ヽ )) ヽ )ヽ )と , イ (_/(_/(_/(_/ノ(_/⊂ノ> )J / ̄Y ̄`|/ ̄^Y ̄ヽ/ ̄ ̄Y
738 名前:デフォルトの名無しさん mailto:sage [2005/11/01(火) 01:17:46 ] 純粋関数型言語を業務で使ってみたい。
739 名前:デフォルトの名無しさん mailto:sage [2005/11/01(火) 01:23:35 ] ぜひ使ってくれ
740 名前:デフォルトの名無しさん mailto:sage [2005/11/02(水) 01:11:11 ] あなたの業務が研究・教育ならいくらでも…
741 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 10:35:10 ] hasktags って使える? 誰か、 GHCmacs でも作ってくえ。
742 名前:デフォルトの名無しさん mailto:sage [2005/11/12(土) 10:24:33 ] 行列をhaskellで実装する場合、単位元ってモナドで表現する?
743 名前:デフォルトの名無しさん mailto:sage [2005/11/12(土) 19:00:45 ] 連載 Hakellプログラミングの8月号にのってる 両替問題の最初でつまづいてしまいました。 cc ::Amount -> [Coin] -> Count という関数を a < 0でないとき cc a (c:cs) = cc (a-c) (c:cs) + cc a cs と定義してますが、なぜこれで指定した金額aの両替の組み合わせ個数になるんですか? 初歩的な質問で済みませんが教えてください。
744 名前:デフォルトの名無しさん mailto:sage [2005/11/12(土) 19:11:23 ] >>743 貨幣cを一つ以上使う場合の数は、cを一つ使った後の両替を考えて、cc (a-c) (c:cs) 貨幣cを一つも使わない場合の数は、cc a cs この和が求めるものになる。
745 名前:デフォルトの名無しさん mailto:sage [2005/11/12(土) 19:30:54 ] >>744 なるほど。 うまく考えるものですね。 ありがとうございました。
746 名前:デフォルトの名無しさん mailto:sage [2005/11/12(土) 20:31:08 ] 簡単な例を作るといいよ 10円 を 5円 と 1円 で両替して樹形図を書く
747 名前:デフォルトの名無しさん mailto:sage [2005/11/12(土) 21:27:57 ] 高校でやったろ? 順列と組み合わせ。
748 名前:デフォルトの名無しさん mailto:sage [2005/11/12(土) 21:38:52 ] >>747 お前がいまやってるんだろ?ww
749 名前:デフォルトの名無しさん mailto:sage [2005/11/13(日) 02:16:56 ] 母関数を使えば簡単に計算できるのに
750 名前:デフォルトの名無しさん mailto:sage [2005/11/13(日) 09:14:43 ] >>748 今頃やってるとしたら遅すぎると思うんだが。 夏頃やってたような。昔の記憶だが。
751 名前:デフォルトの名無しさん mailto:sage [2005/11/13(日) 22:17:02 ] >>749 母関数から特定の項を取り出す手間とボトムアップに解を構成する手間はいっしょ
752 名前:デフォルトの名無しさん mailto:sage [2005/11/14(月) 06:49:45 ] >>751 母関数から特定の項を取り出すのは紙と鉛筆で簡単にできるでしょ。 わざわざプログラムなんて書く必要もない。
753 名前:デフォルトの名無しさん mailto:sage [2005/11/14(月) 20:09:53 ] >>752 詳しく頼む。 俺は Polya の本にその母関数の一般項の計算には DP を使うと書いてあったので、無理だと思ってたんだが。
754 名前:デフォルトの名無しさん mailto:sage [2005/11/14(月) 23:45:35 ] >>753 組み合わせ論の入門書やConcrete Mathに出てるようなんじゃだめなの?
755 名前:752 mailto:sage [2005/11/15(火) 00:16:35 ] >>754 Concrete Math の p.331 から 2 ページくらいで計算されてるやつ? この例の最初のところに「一般の効果の場合に計算するのはとても難しい」とあるし, その下で計算されてる {1, 5, 10, 25, 50} の特殊例においても「trick」と称される 計算をしないといけないし,さらに,最終結果に残ってる A_k は多項式を実際に展開しないと求まらない. というわけで,これは一般性が無いという意味で >>744 が母函数から簡単に出るという 説明にはなってないし,特殊例を含めても >>752 の「簡単」ってのはどうかと思う. コレじゃないならポインタください.
756 名前:デフォルトの名無しさん mailto:sage [2005/11/15(火) 21:19:55 ] Haskellのデータ構築子が非正格なのは便利なんだけど、 一般の関数が非正格で嬉しいことってある? デフォルトで正格でも良いような気がするんだが。
757 名前:デフォルトの名無しさん mailto:sage [2005/11/15(火) 21:44:13 ] 以下の二つが大きいそうだ ・相等性についての議論が楽になる(単純に置換するだけでOK). ・制御構造を自分で設計できる. cond p x y | p = x | otherwise = y recip x = cond (x == 0) 0 (1/x) は正格なら recip 0 = bot, 非正格なら recip 0 = 0.
758 名前:デフォルトの名無しさん mailto:sage [2005/11/15(火) 22:37:48 ] >>757 反応ありがとう。 >・相等性についての議論が楽になる(単純に置換するだけでOK). なるほど。気付かなかった。 でも、現状だとIntのaccumulator引数付きのちょっとした末尾再帰関数なんかを書くたびに 明示的に正格評価を指定しないとパフォーマンスに打撃があるわけで、 「議論が楽になる」って利点はこのコストに見合うんだろうか。 …などと思うのは俺が言語を使うだけの立場だからかな。 >・制御構造を自分で設計できる. これはどちらかというと特殊なケースだから、非正格をデフォルトにする理由としては弱いと思う。
759 名前:デフォルトの名無しさん mailto:sage [2005/11/15(火) 22:56:10 ] もともとは研究者の研究者による研究者のための言語だから、 コストパフォーマンスより性質を重視してるんじゃない? ていうか、非正格の言語を統一する目的で作られた言語だしね。 正格がデフォルトの言語はMLを始めすでにいっぱいあるから そっちを使ったらどうかな。
760 名前:757 mailto:sage [2005/11/15(火) 23:37:37 ] >>758 俺は前者も後者も重要と思ってるんだけどね。まあとりあえず前者について少し強く推しておく。 「three x = 3 」 と定義したときに、「 2 + three x == 5 」 が成立するかどうかを判定することを考える。 これを非正格に評価するとthree x を単純に 3 に置き換えて 2 + 3 == 5 にして、成立する、と結論が出るんだけど、 正格評価だと、x が絶対 bot にならないなら成立、そうでないなら不成立、というようにドメインまで考えないと駄目になる。 特に函数が複雑に組み合わさってる場合に、どこかで bot になる可能性があるとかそういうことを考えるのはしんどいし、 上の函数でもそうだけど、 bot 以外で成立、とかいうのは本質的に成立にしちゃったほうが有意なケースが多いんだわ。
761 名前:デフォルトの名無しさん mailto:sage [2005/11/16(水) 00:02:49 ] 相等性?(0.6 + 0.000000000000000041) == 0.6 浮動小数は代数的ではないとはいえ、言語的にこれでいいでしょうか?
762 名前:デフォルトの名無しさん mailto:sage [2005/11/16(水) 11:02:44 ] >>756 バックトラックが、普通に全数探索するようなコードを書くだけで実装できてしまうとことか。
763 名前:デフォルトの名無しさん mailto:sage [2005/11/18(金) 20:07:17 ] どうでもいいこと。 >>757 > recip x = cond (x == 0) 0 (1/x) (x == 0) ? 0 : (1/x) ちゃんとしたコンパイラなら動くきがす。
764 名前:デフォルトの名無しさん mailto:sage [2005/11/19(土) 22:59:06 ] え、だから? 煽りじゃなく本気で意味がわからん。
765 名前:デフォルトの名無しさん mailto:sage [2005/11/20(日) 16:33:55 ] Hugs.Base> let n C r = product [n-r+1..n] `div` product [1..r] in 5 C 3 10
766 名前:デフォルトの名無しさん mailto:sage [2005/11/24(木) 22:06:26 ] なんとなくtak関数を書いてみたらCより速くてびっくりした。 thunkの絡まない計算は速いんだな。
767 名前:デフォルトの名無しさん mailto:sage [2005/11/27(日) 20:34:53 ] Cのコンパイラオプションは?
768 名前:デフォルトの名無しさん mailto:sage [2005/11/27(日) 21:57:49 ] >>767 -O2。 言われて気づいたけど、-O2 -fomit-frame-pointerとしたらCの方が速かった。
769 名前:デフォルトの名無しさん mailto:sage [2005/11/27(日) 22:44:24 ] haskellには実行速度を求めないで美しいライブラリを書いて欲しいんだよね。
770 名前:デフォルトの名無しさん mailto:sage [2005/11/27(日) 22:51:32 ] Cとかと違って本質的な速度向上がありうるしね. 簡単な記述のほうがプログラム変換に持ち込みやすいし.
771 名前:デフォルトの名無しさん mailto:sage [2005/11/28(月) 00:09:59 ] 贅沢を言うが、美しいコードが速いコードにコンパイルされて欲しい。 fac n = product [1..n]が末尾再帰のfacと同等なコードにコンパイルされる日は 来るんだろうか…
772 名前:デフォルトの名無しさん mailto:sage [2005/11/28(月) 01:39:57 ] つ Clean (速いコード) import StdEnv, BigInt factB :: Int -> BigInt factB n = foldr (\x y =y *% x) one [1..n] //factB n = foldr (%*) one [1..n] // %* がないから
773 名前:デフォルトの名無しさん mailto:sage [2005/11/28(月) 06:03:30 ] >>771 product は foldl で書けてるわけだから,もう末尾再帰になってると思うが.
774 名前:デフォルトの名無しさん mailto:sage [2005/11/28(月) 11:51:06 ] 乗算が全部遅延されるから末尾再帰の意味があんまりない。
775 名前:デフォルトの名無しさん mailto:sage [2005/11/28(月) 13:49:20 ] コンパイラが正格性解析して最適化するから問題無し。
776 名前:デフォルトの名無しさん mailto:sage [2005/11/28(月) 20:37:04 ] >>772 多倍長演算に時間をとられる階乗は例が悪かったかも。 興味があったのは、リストを作って壊すオーバーヘッドをなくすような最適化。 >>773 ごめん。明示的な再帰で書かれたfacのことを言いたかった。 fac = iter 1 where iter a 1 = a; iter a n = iter (a*n) (n-1)
777 名前:デフォルトの名無しさん mailto:sage [2005/11/28(月) 23:57:12 ] >>774 標準 Prelude では sum とか product の fold は積極評価のオペレータを 導入して実装されてるんじゃなかったっけ. >>776 リストを作って壊しているとは限らない.というか普通はそんなことしてない. product n = foldl (*) 1 (take n (enumFrom 1)) で定義したとき, product n = foldl (*) 1 (take n (enumFrom 1)) = foldl (*) 1 (take (n-1) (enumFrom 2)) = foldl (*) 2 (take (n-2) (enumFrom 3)) ... = foldl (*) n! (take 0 (enumFrom n)) = foldl (*) n! [] = n! みたいに評価されるから,陽に空リスト以外のリストを作る部分は無い.
778 名前:デフォルトの名無しさん mailto:sage [2005/11/29(火) 00:46:37 ] >777 少し前にメーリングリストで「sumはfoldl'を使うべき」という議論があったね。 いま見直したら、議論は「可算は常にstrictと言えるか」とかいう方向にシフトしちゃってたけど。 んで、型クラスを使っている以上、+演算子が常に strict に評価可能である保証はできないので、ということで議論は終結してしまっていた。 実際、 GHC では sum とか product では普通の遅延評価版を使っているよ。 実際問題としては strict 版の sum' と product' が(Listにでも)用意されていればいいと思うんだけど。 ちなみに仕様上も、 www.sampou.org/haskell/report-revised-j/standard-prelude.html foldl を使うことになっているので、仕様が変わるまでは積極評価版にはならないと考えた方がいい気がする。
779 名前:デフォルトの名無しさん mailto:sage [2005/11/29(火) 09:25:21 ] >>778 そかー……. まあ product [-10000..1] とかを一回の乗算で終わらせられる可能性があるから 戦略上絶対に悪いというわけじゃないんだろうけど癪だなあ.
780 名前:デフォルトの名無しさん mailto:sage [2005/11/29(火) 11:46:33 ] >>777 >リストを作って壊しているとは限らない.というか普通はそんなことしてない. その過程は、細かく言うと(foldlの代わりにfoldl'を使って) ... = foldl' (*) 1 (take (n-1) (enumFrom 2)) = foldl' (*) 1 (take (n-1) (2:enumFrom (2+1)) = foldl' (*) 1 (2:take (n-2) (enumFrom (2+1))) = foldl' (*) 2 (take (n-2) (enumFrom (2+1))) ... のように進むから、1ステップごとにconsを作っては壊す必要があると理解してたんだけど、違う? >>778 >実際、 GHC では sum とか product では普通の遅延評価版を使っているよ。 IntとIntegerについては正格な版が使われると明言されてる。 www.haskell.org//pipermail/haskell/2005-November/016727.html といってもDoubleやWord32やRationalは遅延評価版だけど。
781 名前:デフォルトの名無しさん mailto:sage [2005/11/29(火) 21:24:51 ] 『ふつうの Haskell プログラミング』2005 年度内発売予定 ttp://i.loveruby.net/d/20051129.html#p01
782 名前:デフォルトの名無しさん mailto:sage [2005/11/29(火) 23:27:32 ] >>781 ネ、ネタにしかみえねぇ…… マジなのか?
783 名前:デフォルトの名無しさん mailto:sage [2005/11/30(水) 02:16:17 ] ふつうの人は、Haskellでプログラミングしない。
784 名前:デフォルトの名無しさん mailto:sage [2005/11/30(水) 03:23:53 ] >>781 年内ではなく、年度内かよ。 ホントでたら買わせていただきます。 それよりも誰か The Craft of Functional Programming を訳してください。英語で挫折してしまいました。
785 名前:デフォルトの名無しさん mailto:sage [2005/11/30(水) 17:10:48 ] 世界よ、ありがとう
786 名前:デフォルトの名無しさん mailto:sage [2005/12/06(火) 08:44:52 ] 出版も遅延評価で行なわれます。 宣言はされても評価はされません。
787 名前:デフォルトの名無しさん mailto:sage [2005/12/06(火) 10:42:49 ] 参照透明性の関係で版ごとにタイトルが違うか、IOモナドに包まれて出版されます。 後者の場合、読者もIOモナドに包まれないと読めません。
788 名前:デフォルトの名無しさん mailto:sage [2005/12/06(火) 11:12:00 ] つまり必要が生じたときにその箇所だけ読まれるわけじゃなくて前から順番に読まれることが保証されているといいたいのか
789 名前:デフォルトの名無しさん mailto:sage [2005/12/06(火) 11:45:40 ] 読んだ知識をIOモナドの外で活用したい場合はどうしたらいいですか?
790 名前:デフォルトの名無しさん mailto:sage [2005/12/06(火) 14:43:53 ] unsafePerformIO
791 名前:デフォルトの名無しさん mailto:sage [2005/12/06(火) 17:22:33 ] 年度内って、来年の四月までってこと?
792 名前:デフォルトの名無しさん mailto:sage [2005/12/06(火) 20:00:58 ] i.loveruby.net/d/20051129.html#c04 12月内ってことじゃない?
793 名前:デフォルトの名無しさん mailto:sage [2005/12/06(火) 20:06:08 ] 出版前に査読してもらうってことだろ。
794 名前:デフォルトの名無しさん mailto:sage [2005/12/06(火) 20:11:14 ] >>793 ごめん。reviewの意味を勘違いしていた。
795 名前:デフォルトの名無しさん mailto:sage [2005/12/17(土) 10:02:29 ] ごめん、以下のプログラムが読み解けないです 「addの戻り値型は引数型の関数となっている、と指定している」 ということらしいのですが、誰か解説してくれまへんか class Add a b c | a b -> c where add :: a -> b -> c
796 名前:デフォルトの名無しさん mailto:sage [2005/12/17(土) 10:41:58 ] functional dependency ってヤツだよ。 それは関数ではなくて、「aとbからcの型は一意に定まる」ことを示している。 www.cse.ogi.edu/~mpj/pubs/fundeps-esop2000.pdf
797 名前:デフォルトの名無しさん [2005/12/18(日) 04:23:05 ] "100" から 100 を取り出すような関数はどうやりますか
798 名前:デフォルトの名無しさん mailto:sage [2005/12/18(日) 08:25:32 ] readの作り方?
799 名前:デフォルトの名無しさん mailto:sage [2005/12/18(日) 08:52:39 ] >>797 read "100" :: Int
800 名前:デフォルトの名無しさん mailto:sage [2005/12/18(日) 09:26:10 ] >>798 そうです。 >>799 言葉足らずですみません。
801 名前:デフォルトの名無しさん mailto:sage [2005/12/18(日) 11:11:46 ] foldl (\x y->10 * x + (ord y - ord '0')) 0
802 名前:デフォルトの名無しさん mailto:sage [2005/12/18(日) 14:55:27 ] 浮動小数の桁数指定で最後の桁の次を四捨五入の場合は?
803 名前:デフォルトの名無しさん mailto:sage [2005/12/18(日) 15:29:40 ] 何の話?
804 名前:デフォルトの名無しさん mailto:sage [2005/12/19(月) 15:50:32 ] roundN :: (RealFrac a, Integral b) => a -> b -> a roundN x n = (frac (round (x * b))) / b where b = 10 ^^ n frac = fromRational . toRational
805 名前:797 mailto:sage [2005/12/20(火) 01:34:36 ] >>800 誰だ君… >>798 そうです。 >>799 言葉足らずですいみません。
806 名前:デフォルトの名無しさん mailto:sage [2005/12/20(火) 08:55:38 ] Webで以下のような定義を見かけたのですが、 data List a = Nil | Cons a (List a) instance Eq (List a) where Nil == Nil = True Cons x xs == Cons y ys = xs == ys _ == _ = False Cons x xs == Cons y ys = xs == ys の部分って正しいの? このままだと (Cons 1 (Cons 2 Nil)) == (Cons 1 (Cons 3 Nil)) が True になるんだけど・・・ かといって Cons x xs == Cons y ys = x==y && xs == ys とかすると、最初のほうの x==y で 「add (Eq a) to the class or instance method `=='」 とか怒られるんだけど、じゃーどう定義したらよいのか わかりまへん
807 名前:デフォルトの名無しさん mailto:sage [2005/12/20(火) 09:00:55 ] >>796 ありがとうございます。まだよくわかってないですが 読んでみます。
808 名前:デフォルトの名無しさん mailto:sage [2005/12/20(火) 10:37:50 ] >>806 リストという構造自体の等価性の問題ですから 中身は関係ない(というか見ちゃいけない)のです add (Eq a) to the class or instance method `==' とあるように, 中身の等価性まで考えようとしたら,List に格納できるデータ型 が Eq クラスのインスタンスに制限されてしまうのです.
809 名前:デフォルトの名無しさん mailto:sage [2005/12/20(火) 10:47:45 ] >>797 じゃないですがReadのインスタンスの作り方わからない… readsPrecとreadListの作り方のチュートリアルか何かないでしょうか(できればShowの方も) Haskell98Report読んでもサッパリです
810 名前:デフォルトの名無しさん mailto:sage [2005/12/20(火) 13:02:57 ] instance Eq a => Eq (List a) where Nil == Nil = True Cons x xs == Cons y ys = x == y && xs == ys _ == _ = False
811 名前:デフォルトの名無しさん mailto:sage [2005/12/20(火) 18:59:40 ] >>808 なるほど。納得です。 >>810 こうすると出来ますね。 Eq クラスのインスタンスに制限されるってこういうことだったのですね 有難うございました。
812 名前:デフォルトの名無しさん mailto:sage [2005/12/21(水) 23:26:59 ] >>809 チュートリアルじゃないけど、GHC.Readにいくつかinstanceの例がある。 cvs.haskell.org/cgi-bin/cvsweb.cgi/fptools/libraries/base/GHC/Read.lhs?rev=1.29;content-type=text%2Fplain 理解したら、是非チュートリアルを書いてくれ。
813 名前: ◆SaiTAMaVxg [2006/01/09(月) 08:32:36 ] ミ ( ノ / ̄\ ♪ 〜(゚ ∀ 。 )⌒ ♪ \_/ 彡 ノ ι ヽ ♪ .ハ ,ヘ (( )ノ .)) (( ∧∧// \(゚∀゚ ) ) ノ ヾ ♪ ミ シ´ / ,γ ミ r´ ( ∧∧// ヽ、 ヽ 彡 ♪ ( ゚∀゚)' ) ノ 彡 .,/ ヽ ミ ノ ,、( ノ ノヽ l r´/ ) ) ミ (´/ ノ ノ ( ( ( ( γ´ (´ ヽ) ヽ\ ノ ハ ヽ ♪ ノ ) . / ,,/ (,,ノ 彡 ♪ (__ノ (_,,ノ
814 名前:デフォルトの名無しさん mailto:sage [2006/01/22(日) 22:44:58 ] shootout.alioth.debian.org/gp4/benchmark.php?test=all&lang=all パフォーマンスが凄いことになってる。
815 名前:デフォルトの名無しさん mailto:sage [2006/01/23(月) 00:03:09 ] shootoutって、普通のプログラマが見ても 「Cはやっぱり速いなあ」とか「インタプリタはやっぱり遅いなあ」とか 「Javaはやっぱりメモリ喰いだなあ」とか思うだけで、 「関数型言語頑張ってるな。ちょっと使ってみるか」とは全く思ってくれない罠。
816 名前:デフォルトの名無しさん mailto:sage [2006/02/02(木) 21:41:39 ] 複数の関数の挙動に影響を与える「オプション」を外部(コマンドラインとか)から指定したいとき C++みたいな言語の「thisの省略」がすごく羨ましいんだけど、 似たようなことをHaskellっぽく書けないものだろうか。 implicit parameterでそれなりに書けそうだけど、 使われてるのを見たことがない。 みんな明示的に引数を持ち回るのが苦痛じゃないのか?
817 名前:デフォルトの名無しさん mailto:sage [2006/02/02(木) 23:15:17 ] >>816 そんな君にReaderT。 StateTでもいいぞ。
818 名前:デフォルトの名無しさん mailto:sage [2006/02/02(木) 23:46:36 ] >>817 おー、ありがとう。 この目的のためにReaderモナドで計算順序を導入するのには抵抗があったけど、 既にもなでぃっくなコードにReaderTを混ぜ込むなら面倒が少ないな。
819 名前:デフォルトの名無しさん [2006/02/05(日) 07:29:06 ] この言語は素晴らしいですか?
820 名前:デフォルトの名無しさん mailto:sage [2006/02/05(日) 07:47:59 ] 最高ですかー!
821 名前:デフォルトの名無しさん [2006/02/05(日) 08:28:42 ] この言語の、C++に較べて、劣っている点を教えて下さい。
822 名前:デフォルトの名無しさん mailto:sage [2006/02/05(日) 10:42:57 ] ・C++ではテンプレートを使ってコードの抽象性と実行時効率を両立できるけど、 Haskellでは困難。 ・C++では名前空間・クラス・関数をかなり自由に相互ネストさせられるし、 ネストに従って細かくスコープを分けてくれるのに対して、 Haskellの名前空間はフラットで、レコードのフィールド名のスコープがモジュールレベルだったり、 関数に局所的な型の定義ができなかったりして不便。 ・互いに関連のないものに同じ名前を与えるC++風の多重定義は難しい。 やってできないことはないけど、想定された言語の使いかたではないだろう。
823 名前:デフォルトの名無しさん [2006/02/06(月) 00:21:58 ] 俺は今酔ってるし、ニートだし、最強だ。 モナディウスを参考にシューティングゲーム作るぞ。うぉー!
824 名前:デフォルトの名無しさん mailto:sage [2006/02/06(月) 00:33:36 ] >>823 マジ応援してる。
825 名前:デフォルトの名無しさん [2006/02/06(月) 03:51:37 ] 出来上がったコードの実行速度はめっちゃ遅いですか?
826 名前:デフォルトの名無しさん mailto:sage [2006/02/06(月) 06:11:44 ] >>825 >>814
827 名前:デフォルトの名無しさん mailto:sage [2006/02/06(月) 07:33:29 ] Haskell Hackerが超がんばってキモいコード書けばgcc相当にはなるらしい。 俺のような凡人が普通に書いたらめっちゃ遅い。
828 名前:デフォルトの名無しさん [2006/02/06(月) 09:10:24 ] ハスケルハッカーがキモいコードを書けば、 バグは少ないわ高速だわの最強のコードが生成されるのですね? それとも、キモいコードってのはバグを許す代わりに高速にするとかいう類の話?
829 名前:デフォルトの名無しさん mailto:sage [2006/02/06(月) 22:46:13 ] shootout.alioth.debian.org/gp4/benchmark.php?test=nbody&lang=java shootout.alioth.debian.org/gp4/benchmark.php?test=nbody&lang=ghc&id=4 ・コンパイルが大変で、 ・コードが読みにくい分バグが多く、 ・遅い
830 名前:デフォルトの名無しさん mailto:sage [2006/02/06(月) 23:05:14 ] 確かに読みにくいね。 >・コンパイルが大変で、 どういう意味?
831 名前:デフォルトの名無しさん [2006/02/07(火) 05:53:35 ] ハスケル勉強したいが 参考書がきっと1万とか法外な値段でしょ? 手が出ません><
832 名前:デフォルトの名無しさん mailto:sage [2006/02/07(火) 06:09:11 ] 数学やってる人がHaskellを直ぐに分かるのは、 集合論と一階述語論理について勉強済みだからなんだよね?
833 名前:デフォルトの名無しさん mailto:sage [2006/02/07(火) 10:27:09 ] もうすぐ青木さんの本とかが出るでしょ。 使うだけなら数学の話は特に必要ないよ。たぶん。
834 名前:デフォルトの名無しさん mailto:sage [2006/02/07(火) 11:00:55 ] 数学の知識はいらないと思うけど、論理学の基礎なしじゃむりだぽ。
835 名前:デフォルトの名無しさん mailto:sage [2006/02/07(火) 16:18:33 ] 数学に基づいて作られた言語ではあるが,その理念を理解して利用するのと,ただプログラミング言語として利用するのとでは意味が違う。
836 名前:デフォルトの名無しさん mailto:sage [2006/02/07(火) 16:28:17 ] 「アルゴリズムのプロトタイピングなら C や Java よりも簡単で,早くできます」 とは大学の教官の弁。単位きたかなあ。
837 名前:デフォルトの名無しさん [2006/02/07(火) 16:54:31 ] 早く作れても速く動かないのではなぁ…
838 名前:823 [2006/02/07(火) 17:13:22 ] >>837 みんなで速くするんだと思います>< CやFORTRANが速いのは多分歴史が長いからだと思ってる --以下チラシの裏 今日やったこと:eclipseの日本語化とFPの導入 一言:eclipseをeclispだと思ってて「HaskellなのになんでLisp?」とか考えてた。英語弱いな、俺 今からやること:エヴァの映画借りてきて見る
839 名前:デフォルトの名無しさん mailto:sage [2006/02/07(火) 21:16:35 ] >>837 だからプロトタイピングなんだろ。 物好きがいろいろやってはいるけど、どう考えても研究用途の言語だよな。 だから意味がないというわけではないが。
840 名前:デフォルトの名無しさん mailto:sage [2006/02/07(火) 21:46:46 ] >>839 ちょっとお前は論点ずれてるよな。
841 名前:デフォルトの名無しさん mailto:sage [2006/02/07(火) 22:30:09 ] >>830 liftMとか素人なら完全に御手上げ。 あと、何この演算子?ってのを使ってる (.|. (shiftL i 3)) -- google氏も無視 逆にhaskellが神言語になってる例 shootout.alioth.debian.org/gp4/benchmark.php?test=pidigits&lang=dlang&id=0 shootout.alioth.debian.org/gp4/benchmark.php?test=pidigits&lang=ghc&id=3 d 言語90行 haskell 11行 実行速度ほぼ同じ 理由 Integer型が使える Monadを使う必要もMonad持ち上げをする必要がない。(配列を使う必要がない)
842 名前:デフォルトの名無しさん mailto:sage [2006/02/08(水) 18:30:21 ] >liftMとか素人なら完全に御手上げ。 たぶん、すぐ慣れると思う。 >(.|. (shiftL i 3)) -- google氏も無視 そんなあなたにHoogle www.haskell.org/hoogle/?q=.%7C.
843 名前:デフォルトの名無しさん mailto:sage [2006/02/08(水) 21:20:50 ] >>842 すげー。 型から検索できるのがHaskellらしいな。
844 名前:デフォルトの名無しさん mailto:sage [2006/02/09(木) 09:48:51 ] みなさんは、式がどういう順番で評価されていくか 手にとるようにわかるのですか? 私はどう書いたら速いコードになるのかいまいちわかりません。
845 名前:デフォルトの名無しさん mailto:sage [2006/02/09(木) 13:07:28 ] 評価順序など考えない。何のための遅延評価だと思っとる。 速いコードを書くのが目的なら関数型言語など、いや、 高級言語など使うのはお止めなさい。
846 名前:デフォルトの名無しさん mailto:sage [2006/02/09(木) 13:19:59 ] 普段は評価順序なんか考えないでコーディングして、 効率が足らないことが分かったとき、そこをアセンブリで書き直す代わりに 既にあるHaskellのコードをいじって効率を確保する、というのは、 それなりに合理的だと思うんだが。
847 名前:844 mailto:sage [2006/02/09(木) 13:44:18 ] べつに速さで C と張り合おうとか思ってるわけではないのですが、例えばhead $ xs ++ [x]が O(1) かどうかというのは、評価順がわからないとわからないですよね?こういう簡単な例なら私にもわかるのですが、ちょっと複雑になると頭を抱えてしまうわけです。
848 名前:823 [2006/02/09(木) 14:15:14 ] >>847 多分、どんな順序で書いてもコンパイラが同じように並べかえてくれるんじゃないかなぁ? コンパイラが考えうる中で最も効率的なコードが出るようにね
849 名前:デフォルトの名無しさん mailto:sage [2006/02/09(木) 14:16:51 ] >>847 非正格になれてないだけ。
850 名前:デフォルトの名無しさん mailto:sage [2006/02/09(木) 19:00:42 ] 個人的経験では、Haskellerの半分はスピードレーサー(最適化おたく)だと思う。
851 名前:デフォルトの名無しさん mailto:sage [2006/02/09(木) 22:26:31 ] マシン非依存の部分ならば、 Cよりhaskellの方が速いコードが書けるはず。 なぜならば、見栄え良く、簡潔に書け(簡潔じゃないとコンパイルできない) 無駄なく書けるから。 cだと、綺麗なコードを書くために無駄なコードを書きまくると思うし、 汚い普通のコードを書いても、Haskellと同程度しか速くならない。 cの有利な点は、 gcがない, 配列操作, アセンブラ的コードが書ける, 速いライブラリがある。 と言ってみる。
852 名前:デフォルトの名無しさん mailto:sage [2006/02/09(木) 22:37:03 ] 非正格だから遅いみたいな話は聞いた事がある。詳細は知らないけど。 >>851 >なぜならば、見栄え良く、簡潔に書け(簡潔じゃないとコンパイルできない) これは速いコードとは関係ないんじゃないの? 早くコードを書く事は出来るのかもしれないが。
853 名前:デフォルトの名無しさん mailto:sage [2006/02/09(木) 22:37:18 ] 「マシン非依存の部分」なんてあるのか?
854 名前:デフォルトの名無しさん mailto:sage [2006/02/09(木) 22:39:54 ] Haskellのソースはスリムだがバイナリがピザデブ杉。
855 名前:デフォルトの名無しさん [2006/02/09(木) 23:28:22 ] >>853 add
856 名前:デフォルトの名無しさん mailto:sage [2006/02/10(金) 03:01:51 ] Haskell学んでC++でメタプログラミング これ最新最強。newなんていりませんから!
857 名前:デフォルトの名無しさん mailto:sage [2006/02/10(金) 10:53:42 ] なんでCはいつも最速なの?
858 名前:fortran mailto:sage [2006/02/10(金) 10:55:08 ] ・・・
859 名前:デフォルトの名無しさん mailto:sage [2006/02/10(金) 12:50:24 ] 最速はアセンブリ言語
860 名前:デフォルトの名無しさん mailto:sage [2006/02/10(金) 15:32:11 ] 規模が大きければ 今となってはコンパイラが吐くアセンブラの方が速いことが多いけどね
861 名前:デフォルトの名無しさん mailto:sage [2006/02/10(金) 15:53:17 ] あらまあ何言ってるのかしらこの子ったら
862 名前:デフォルトの名無しさん [2006/02/10(金) 16:26:10 ] コンパイラに負けるなんて、無能を証明してるようなもんだろ。
863 名前:デフォルトの名無しさん [2006/02/10(金) 16:27:27 ] >>857 危険だからさ。 お行儀の良いハスケルにはわからんだろうがね。
864 名前:デフォルトの名無しさん mailto:sage [2006/02/10(金) 16:40:00 ] >>856 バカですか >>857 バカですか >>859 バカですか >>862 バカですか Haskellに関しての議論としては論点がずれているぞ。 Haskellを創った人たちは、お前らが気にしていることはすべて解っているし、そんなことを解決するための言語にしようとは考えていないんだよ。 言語仕様に関しては。言語仕様という表現も好きじゃないけど。
865 名前:デフォルトの名無しさん mailto:sage [2006/02/10(金) 16:49:34 ] へぇ、、ハスケルって読むんだぁ。。 アライグマみたいだね。
866 名前:デフォルトの名無しさん mailto:sage [2006/02/10(金) 16:54:41 ] >>864 必死だな。 マジレスすると、「Haskellを創った人たち」の意図などどうでも良い。 いったん言語ができあがってしまえば、それをどう使おうが勝手だ。
867 名前:デフォルトの名無しさん [2006/02/10(金) 16:59:56 ] ネタっぽいんだが
868 名前:デフォルトの名無しさん mailto:sage [2006/02/10(金) 18:57:08 ] Haskellを作った人達って誰になるのかな。 Hudak? Peyton Jones? Wadler?
869 名前:844 mailto:sage [2006/02/10(金) 21:21:30 ] あれれ、なんだか私の質問で荒れちゃったみたいで申し訳ない。 >>849 これでも、もう一年以上使ってるんですよ。ヘボプログラマーなもんで...。
870 名前:デフォルトの名無しさん mailto:sage [2006/02/10(金) 22:11:16 ] 書いたとおりに動くCとかと違って,書いたコードよりオーダー単位で計算量が 小さくなる可能性がある Haskell には期待してるんだがなあ.
871 名前:デフォルトの名無しさん mailto:sage [2006/02/10(金) 22:23:04 ] O'Camlはむちゃくちゃ早いらしいけど、Haskellとは何が違うんだろう。
872 名前:デフォルトの名無しさん mailto:sage [2006/02/10(金) 22:42:30 ] >>871 wiki.ocaml.jp/index.php?%B4%D8%BF%F4%B7%BF%B8%C0%B8%EC%A4%CE%C8%E6%B3%D3 デフォルトで遅延評価なのか、指定したときだけ遅延評価なのか。 破壊的代入を許さないのか、許すのか。 速度に影響しそうな所というとこの辺の違いかな?
873 名前:デフォルトの名無しさん mailto:sage [2006/02/10(金) 22:46:32 ] >>870 そんな激しい最適化をするHaskellコンパイラはないと思うが。
874 名前:デフォルトの名無しさん mailto:sage [2006/02/10(金) 23:59:12 ] Hudakじゃないだろ。やっぱりSPJが筆頭なんじゃない?
875 名前:デフォルトの名無しさん mailto:sage [2006/02/11(土) 00:19:45 ] なんかShootoutのページで、あれ、Haskell速いじゃんと思ったら、 極端に遅い欠点がないのと、重みが高い数個のプログラムで稼いでるだけ みたいだな。勝ってる数だけで見たらJavaにも勝てない。
876 名前:デフォルトの名無しさん mailto:sage [2006/02/11(土) 05:57:50 ] ふつうの本は五月に延期だそうな。
877 名前:デフォルトの名無しさん mailto:sage [2006/02/11(土) 09:05:41 ] take 5 $ reverse $ reverse [1..] で死にやがった。遅延評価も万能じゃないんだな。
878 名前:デフォルトの名無しさん mailto:sage [2006/02/11(土) 09:28:58 ] Haskellでは reverse $ reverse ≡ id だからなあ。
879 名前:デフォルトの名無しさん mailto:sage [2006/02/11(土) 09:29:52 ] > reverse $ reverse ≡ id reverse $ reverse ≠ id の間違い。
880 名前:デフォルトの名無しさん mailto:sage [2006/02/11(土) 11:29:59 ] reverse :: [a] -> [a] reverse xs returns the elements of xs in reverse order. xs must be finite.
881 名前:デフォルトの名無しさん mailto:sage [2006/02/11(土) 11:41:15 ] >>875 だけって・・・ 俺の感覚ではそういうのは、 「なんでもそつなくこなす優秀なやつ」だよ。 一番になること以外には意義を感じないのかい?
882 名前:デフォルトの名無しさん mailto:sage [2006/02/11(土) 12:26:06 ] >>881 でも半分以上は平均的に結構遅いんだよ。。。 他の言語みたいに極端に遅いってのはないけど、 そういうのはアルゴリズムの欠陥があったり、その言語での普通の やり方と違うといった何かしらの事情があることが多いし。
883 名前:デフォルトの名無しさん mailto:sage [2006/02/11(土) 16:01:00 ] No JDK -server ってあるのはJDKでは苦手分野の可能性が高い。 負けてる sum-file や random なんて Cleanがトップだから、 似たようにやれば(内部含む)haskellでもトップになる可能性はある。 (reverse-components はocaml 一位 Clean2位) javaには負けてるとはいえない。
884 名前:デフォルトの名無しさん mailto:sage [2006/02/11(土) 16:42:24 ] Haskell最速! 欠点なし! この訴えはム板のあらゆるスレで続けていくつもりです。
885 名前:デフォルトの名無しさん mailto:sage [2006/02/11(土) 16:51:19 ] 自分が作ったものでもないのにそんな風に誇られても。
886 名前:デフォルトの名無しさん mailto:sage [2006/02/11(土) 16:53:58 ] >>884 頑張れ Lisp厨やRuby厨に負けるなよ
887 名前:デフォルトの名無しさん mailto:sage [2006/02/11(土) 17:34:34 ] shootoutのあれは、言語の優劣よりもcommunityの熱意とかを反映している気がする。
888 名前:デフォルトの名無しさん mailto:sage [2006/02/11(土) 18:32:12 ] >>884 訴えにはそれ相応の証拠がいるんだ。 説得力がある資料を添えて出直せ。
889 名前:デフォルトの名無しさん mailto:sage [2006/02/11(土) 19:54:29 ] 証拠はshootout
890 名前:デフォルトの名無しさん mailto:sage [2006/02/11(土) 20:01:18 ] 確かにshhotoutだとcより速いことになってるなwww
891 名前:デフォルトの名無しさん mailto:sage [2006/02/11(土) 20:04:00 ] 姉は一級Haskeller 〜イケナイSTG-Machine
892 名前:デフォルトの名無しさん mailto:sage [2006/02/11(土) 20:09:58 ] >>890 CPU Timeの重みを1にして他を0にしてみ。 OCaml 34.77 1 C gcc 32.82 3 D Digital Mars 29.86 2 Haskell GHC 28.69 0 C++ g++ 25.76 2 SML MLton 24.70 3 Eiffel SmartEiffel 24.36 5 Nice 23.45 3 Java JDK 1.4 -server 22.21 4 Clean 22.01 6 Java JDK -server 21.87 4 Ada 95 GNAT 20.25 4 Java JDK -client 18.84 4 Fortran G95 まあでも正直、この順位も絶対現実とはかけ離れてるよな。 やっぱ、コミュニティの熱意とかが反映されるんだろうな。
893 名前:デフォルトの名無しさん [2006/02/11(土) 20:20:21 ] >>892 >Nice 23.45 3 プログラミング言語Nice (ワラ
894 名前:デフォルトの名無しさん mailto:sage [2006/02/11(土) 20:35:56 ] だから、Shootoutは時々極端に遅いところがあるから そういう変な順位になる。 例えば、CとHaskellを見るとCのchameneosとregex-dnaが 極端に遅いことがわかる。 こういうのはアルゴリズムの欠陥か何かの特殊事情だから除いて 考えるべきだというのは、具体的な数値を見てみるとよくわかるだろう。
895 名前:デフォルトの名無しさん mailto:sage [2006/02/11(土) 21:07:44 ] まあ、Cだと書きにくいからアルゴリズムの欠陥が生まれるわけだ。
896 名前:デフォルトの名無しさん mailto:sage [2006/02/11(土) 21:09:32 ] それもあるだろうが、コミュニティの熱意が大きいだろ。 いずれにせよ本来の速さとは違うだろう。
897 名前:デフォルトの名無しさん mailto:sage [2006/02/11(土) 21:12:07 ] FortranがJavaより下とか、そういうの見ても相当いい加減な 順位であることがわかるな。
898 名前:デフォルトの名無しさん [2006/02/11(土) 22:00:20 ] CとかFortranとか手書きアセンブリとか:熱意に対して指数関数的に速くなる OCamlとかCleanとかHaskellとか:凡人がやっつけ仕事してもそこそこ速い ってことでFA? スレ違いだけど、今日初めてGoogle Earthをインスコしたんだ。 超セクシーだね! あんなのをHaskellで書いてみたい
899 名前:デフォルトの名無しさん mailto:sage [2006/02/11(土) 22:08:03 ] ワラ^^;
900 名前:デフォルトの名無しさん mailto:sage [2006/02/11(土) 22:46:14 ] >>898 後者は言語オタク・エキスパート・信者が、Shootoutのために 必死になってソース作ってそうだけどなw
901 名前:デフォルトの名無しさん mailto:sage [2006/02/11(土) 22:46:47 ] はっきり言って、速いとか遅いとかどうでもいい
902 名前:デフォルトの名無しさん mailto:sage [2006/02/11(土) 22:47:40 ] しかし最適化には興味があるという矛盾 誰か俺を(ry
903 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 01:24:02 ] こんなの見つけた。 item.rakuten.co.jp/book/1794880
904 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 05:16:07 ] まあ、DとかC++とかにHaskellが対抗してる時点で あきらかに実力以上の評価なわけで。 素人が普通に作ったらJavaといい勝負ってのが正直な感想。
905 名前:デフォルトの名無しさん [2006/02/12(日) 09:51:08 ] 東大生みたいな言語だな。 ノーベル賞とまではいかないがなかなか強力に安定した結果を叩きだし、堅物で融通がきかない。
906 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 12:18:48 ] いや、Haskell自身が速いってことはないと思う。 確かに言語仕様が優れていて、使ってる人が非常に優秀なのは 確かなんだが、速くはない。 Shootoutがいい成績なのも使ってる人が優秀なのと、他の言語が 力入れてないだけ。
907 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 12:33:29 ] てか、実は>>892 は数日前までDやOCamlに勝ってた。 つまり、まだまだ未成熟段階ってこと。 Shootoutの順位なんてそんなもん。
908 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 12:38:23 ] あほな速度評価結果はってんなよ。 血液型占いと同じぐらいオカルト。 バカですか。
909 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 12:40:15 ] 貼ってる奴もそういうコメントしてる。
910 名前:898 [2006/02/12(日) 13:19:09 ] 最適化なんて弱者のいいわけです><
911 名前:デフォルトの名無しさん [2006/02/12(日) 13:44:58 ] 最適化無き者に実用無し
912 名前:デフォルトの名無しさん [2006/02/12(日) 13:53:42 ] >>911 ごめんなさい>< ハードウェアが十分速ければ……ってのこそアレだと思った。
913 名前:デフォルトの名無しさん [2006/02/12(日) 14:03:51 ] >>912 こここちらこそごめんなさい そんな角をたてるつもりじゃなかったの><
914 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 14:53:46 ] Haskellは最速!
915 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 14:59:37 ] 非常に残念なことですが、2ch haskellスレには 知的障害者が多数生息している模様です。
916 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 15:14:18 ] 天才と池沼は紙一重
917 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 15:19:27 ] こっちのスレでやったら? 関数型言語Part IV pc8.2ch.net/test/read.cgi/tech/1083649982/
918 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 15:21:41 ] いやいや。 そろそろ次スレだし、Haskell最適化スレと本スレを分ければ良い。 縮小する方向に強制するとろくなことが無い。
919 名前:デフォルトの名無しさん [2006/02/12(日) 15:58:42 ] >>918 確かに。言語全般の最適化ってなさそうだし
920 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 16:45:19 ] Haskell最適化スレなんて建てても寂れることは目に見えてる。 このスレでここ数日発言した奴の大半はHaskellを知ってる訳でも学んでる訳でもなく ただ「話題の」言語を冷やかしにきただけだろ。 スレ一つ消費するほど興味が続くとは思えない。 やるなら、 【数学者】Haskellはクソ言語【オナニー】 pc8.2ch.net/test/read.cgi/tech/1128011645/ を再利用したらどうだろう。
921 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 17:09:47 ] まあ最近の書き込みのうち大体半分は俺のだしな
922 名前:デフォルトの名無しさん [2006/02/12(日) 17:31:42 ] >>920 実に的確な分析だ。 見事ここ数日冷やかしに来ていた事を当てられたから困る。
923 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 18:29:23 ] Haskellは遅い派だが、Haskellを学んでるのは俺だけか・・・
924 名前:デフォルトの名無しさん [2006/02/12(日) 18:35:47 ] 授業の課題で、 「MLやHaskellに代表される関数型プログラミング言語について調べ、 PascalやC言語に代表される手続き型言語との相違を説明するとともに、 関数型プログラミング言語が広く普及していない理由を議論しなさい。」 というのが出たのですが、さっぱりです。 頭のイイおまいら、教えてください!!
925 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 18:48:44 ] >>924 まず大学と教官の名前を言え。
926 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 18:54:53 ] >>924 マルチス=ルナカス
927 名前:デフォルトの名無しさん [2006/02/12(日) 18:56:35 ] すみませんそれはいえない。。特定されるから。 でも、あまり理論的なことよりも実用を重んじると思う。 数学的にどうこう、っていうよりも、プログラミング技法としてどうか? っていう点かな??
928 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 18:58:32 ] >>924 宿題は自分でやれ
929 名前:924 [2006/02/12(日) 18:58:47 ] >>926 すみません。間違って2箇所書いてしまいました。 以後、こちらに一本化します。 明日締め切りなんで、かなり焦ってます。 ほんと、箇条書き程度で良いので、書いてもらえれば助かるかる。
930 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 18:59:39 ] だが断る
931 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 19:00:31 ] >>924 どれが分からないの? サッパリつーが、1 くらいは自分で出来るでしょ。 それ以外は、自分の思う所を書いてくれれば、ヒントくらいは出せると思う。 1. 関数型プログラミング言語に付いて調べる 2. 手続きが他言語と関数型プログラミング言語の相違を説明する 3. 関数型プログラミング言語が普及していない理由を議論する その前に C や Java は理解してるのかな。
932 名前:924 [2006/02/12(日) 19:03:11 ] CやJAVAは分かります。 関数型言語もLispで軽く勉強したことはあります。 なので1はできそうなのですが、2,3に関してどういう観点から 話を広げていいのか分からないんです。
933 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 19:03:40 ] スマソ。 手続きが他言語 --> 手続き型言語
934 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 19:07:07 ] >>932 2 は関数型言語が利点として上げている事(FAQ とかに書いてある宣伝文句)を 裏返せば、手続き型言語との相違が見えてくるんじゃないかな。 3 は Lisp を勉強していて、何じゃこりゃと思った事を軸にすれば良い。
935 名前:924 [2006/02/12(日) 19:08:07 ] この板でCやJAVAと対比してHaskellの優位性を主張してる発言が多くあるのですが、 それってまとめるとどういうことになるんですか?? (全然専門的に知らないので、内容がちょっと理解できなくて) それが分かればその点を広げて論ずることができるかなと思いました。
936 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 19:08:55 ] >>932 参考文献:なぜ関数プログラミングは重要か www.sampou.org/haskell/article/whyfp.html
937 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 19:12:09 ] >>935 アルゴリズムの記述性、プログラムの安全性とか、自分でテーマを設定して、 具体例を少し添えてあげれば良いんじゃないの。 宿題みたいだし、直接的な答えは書かない方が貴方の為になるよね?
938 名前:924 [2006/02/12(日) 19:12:09 ] >>934 >2 は関数型言語が利点として上げている事(FAQ とかに書いてある宣伝文句)を >裏返せば、手続き型言語との相違が見えてくるんじゃないかな。 なるほど、確かにそうかもしれませんね。参考にします。 >3 は Lisp を勉強していて、何じゃこりゃと思った事を軸にすれば良い。 いや〜難しい。。「括弧が多い!」ぐらいしか。。w >>936 ふむふむ、参考にしてみます。
939 名前:924 [2006/02/12(日) 19:15:26 ] >>937 >直接的な答えは書かない方が貴方の為になるよね? 書いてもらえるなら書いてもらったほうが助かります!笑 あまりプログラムは自分の専門ではないので、、 てか、皆さんやさしいですね。 >プログラムの安全性 手続き型と関数型は安定性が違うんですか??
940 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 19:28:43 ] >>939 疑問を持ったら、あとは自分で調べてチョ。さっきも書いたけど、 手取り足取りは無しの方向で。個別的な事象で不明な所があったら また質問して下さい。
941 名前:924 [2006/02/12(日) 19:31:47 ] >>940 わかりました。 でも、作業の方向は見えたので助かりました。 ありがとうございます。 >>みなさん。 お騒がせしました。気分を悪くしてしまいましたらすみません。
942 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 19:32:49 ] >>924 www.geocities.jp/shido_takafumi/hs/haskell1.html web.yl.is.s.u-tokyo.ac.jp/~ganat/memo/aboutHaskell.html ヌルポ
943 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 19:39:12 ] ここは教育的なインターネットですね
944 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 20:18:05 ] unko
945 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 20:30:55 ] 一瞬undoと見間違った。
946 名前:デフォルトの名無しさん [2006/02/12(日) 21:54:03 ] しまった! こっち見る前に>>924 の宿題の答えを書いちゃったじゃないか。 まさかマルチするとは思ってなかった……
947 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 22:03:40 ] >>924 の正解はこれ 「関数型の言語と手続き型の言語の相違は、柔軟性、記述性、簡潔性、堅牢性 などであり、どれをとってもはるかに関数型が優れる。また、ユーザーの頭脳にも 大きな違いがあり、関数型言語が優れる。 普及していないのは選ばれた優れた頭脳の持ち主にしか良さがわからない からである。」
948 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 22:05:55 ] >>947 はネタとしても駄目だろ…
949 名前:デフォルトの名無しさん [2006/02/12(日) 22:09:58 ] 関数型が難しいとされるのは一番最初のプログラミング言語が機械語だったからじゃね? 機械語->アセンブリ->フォートラン->C みたいに発展せざるを得なかったというか。 もし手続き型なんて一切知らない人に関数型の教育をほどこせば同じ人が Java を 学ぶより簡単そうだ……。 或いはプログラマの90%が関数型しか知らない世界では「手続き型? あんなのオナニーだよ」 みたいな話になるんだろうな。
950 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 23:14:56 ] HaskellとAlgol60を比べることはできても、 関数型言語と手続き型言語を比べるのは難しいだろうな。 議論の前提となる関数型言語の定義すら定まってないし。
951 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 23:30:35 ] 漏れみたいな凡人には再帰が理解しにくいよ。 階乗みたいな簡単なのは分かるけどさ。 「なんでループ使わせてくれないんだよぅ」ってなる。
952 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 23:38:45 ] え
953 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 23:40:33 ] 間違い
954 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 23:44:37 ] 行列積みたいな一般再帰は確かに嫌だね
955 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 23:47:20 ] >>951 Haskellだと再帰を使わずに済ませられることも多くないか? たとえば階乗は\n -> product [1..n]と書ける。 IOが絡んだりする複雑な処理を書くときは再帰が要ることも多いけど、 個人的には再帰(やループ)は小さいほどわかり難いと思うから、 これはあまり問題じゃないような気もする。
956 名前:デフォルトの名無しさん mailto:sage [2006/02/13(月) 04:23:49 ] 俺にはループは再帰にしか見えない。 同じルーチンを何度も呼び出してるだけじゃん。
957 名前:デフォルトの名無しさん [2006/02/13(月) 07:16:58 ] スタックオバフロー
958 名前:デフォルトの名無しさん mailto:sage [2006/02/13(月) 07:48:01 ] 遅延評価は俺の生き方そのものだ
959 名前:デフォルトの名無しさん [2006/02/13(月) 13:15:16 ] ハスケル日本語参考書無いの?
960 名前:デフォルトの名無しさん mailto:sage [2006/02/13(月) 13:15:45 ] 3ヶ月くらい待て
961 名前:デフォルトの名無しさん mailto:sage [2006/02/13(月) 22:56:43 ] >>903 のが予定通り出るのなら1ヶ月程待てばOKだ。
962 名前:デフォルトの名無しさん mailto:sage [2006/02/14(火) 21:16:16 ] 5月に延びたらしいぞ。
963 名前:デフォルトの名無しさん mailto:sage [2006/02/14(火) 21:36:00 ] >>962 それは「ふつうのHaskellプログラミング」の方じゃないか?
964 名前:デフォルトの名無しさん mailto:sage [2006/02/14(火) 22:18:39 ] >>958 漏れなんかいつも先行評価だぜ。 値が必要とされたことは一度も無いがな....orz
965 名前:デフォルトの名無しさん mailto:sage [2006/02/14(火) 22:26:28 ] 漏れの人生はcall by nameなので同じ失敗を何回も繰り返してますorz。
966 名前:デフォルトの名無しさん mailto:sage [2006/02/14(火) 22:28:40 ] >>964 イ` 投機的であるとはそういうことだ。
967 名前:デフォルトの名無しさん [2006/02/14(火) 22:30:19 ] 人生で成功するのは Unlambda のコードを読むより難しい
968 名前:デフォルトの名無しさん [2006/02/15(水) 03:36:00 ] WinXP+GHC+wxHaskell でHello,WorldをコンパイルしてみたんだけどGHCに怒られました >C:\Documents and Settings\Owner\workspace>ghc hello.hs > >hello.hs:2:0: > Failed to load interface for `Graphics.UI.WX': > Bad interface file: C:\wxhaskell\lib\imports/Graphics/UI/WX.hi > mismatched interface file versions: expected 6041, found 6040 wxhaskell-register.batは実行したし、確かにC:\wxhaskell\lib\imports\Graphics\UI\WX.hiに ファイルはあります。ぐぐったらブログの記事みたいなんがひっかかったけど そこでも解決法はみつかりませんでした。CUIなHello,Worldは問題なくコンパイル出来ました。 wxWidgetsもインスコしなきゃダメかな、と思ってmsiファイルで入れてみたけど、どうも違うようです。 偉い人、どうか教えて下さい。
969 名前:デフォルトの名無しさん mailto:sage [2006/02/15(水) 03:40:04 ] >>968 --makeか-package wxでよかったはず。
970 名前:969 mailto:sage [2006/02/15(水) 03:41:08 ] ごめん。エラーメッセージをちゃんと読んでなかった。忘れてくれ。
971 名前:デフォルトの名無しさん mailto:sage [2006/02/15(水) 03:53:56 ] >>968 wxHaskellのWindowsパッケージがghc6.4用なのが問題だと思う。 ttp://www.cs.uu.nl/research/projects/proxima/wxhaskell-bin-msw2.4.2-ghc6.4.1-0.9.4-0.zip 一応ここに6.4.1用のバイナリがある。
972 名前:デフォルトの名無しさん [2006/02/15(水) 04:06:39 ] ありがとうございます! wxHaskell 入れなおしてコマンドラインオプションも入れたらコンパイルできました! よーしパパ、テトリス作っちゃうぞー! って感じです!!!1123
973 名前:デフォルトの名無しさん [2006/02/16(木) 22:27:46 ] 富豪的プログミングに溺れちゃって! いつか泣きをみても知らないんだから!
974 名前:デフォルトの名無しさん mailto:sage [2006/02/16(木) 22:52:27 ] 成り上がりと富豪を一緒にしないでください
975 名前:デフォルトの名無しさん [2006/02/16(木) 22:57:22 ] ハスケッてる連中の偏差値は高いに違いない
976 名前:デフォルトの名無しさん mailto:sage [2006/02/17(金) 09:58:27 ] 変さ値?
977 名前:デフォルトの名無しさん mailto:sage [2006/02/17(金) 10:55:25 ] ところで君偏差値いくつ?
978 名前:デフォルトの名無しさん mailto:sage [2006/02/17(金) 13:01:03 ] 変さ値なら60前半の自信はある(w
979 名前:デフォルトの名無しさん mailto:sage [2006/02/17(金) 15:02:44 ] その変さ値とやらの最大値と平均値と標準偏差はいくつなんだ?
980 名前:デフォルトの名無しさん mailto:sage [2006/02/17(金) 15:18:51 ] なんだ。かまって君か(w
981 名前:デフォルトの名無しさん mailto:sage [2006/02/18(土) 09:33:10 ] 「Java仮想マシンで動作するHaskell風スクリプト - Jaskell 0.7」 pcweb.mycom.co.jp/news/2006/02/17/341.html これが噂の「大地クオリティ」か・・・
982 名前:デフォルトの名無しさん [2006/02/18(土) 16:06:30 ] haskellのここがキレたって所ある?
983 名前:デフォルトの名無しさん mailto:sage [2006/02/18(土) 21:52:03 ] Haskell最高! 死角なし!
984 名前:デフォルトの名無しさん mailto:sage [2006/02/19(日) 18:43:57 ] >>982 言語仕様が分からずにキレた
985 名前:デフォルトの名無しさん mailto:sage [2006/02/20(月) 15:27:16 ] viで編集しにくくてにキレた
986 名前:デフォルトの名無しさん mailto:sage [2006/02/21(火) 00:26:20 ] モナドがなかった頃、遅延ストリームが「一個ずれている」気がしてキレた!
987 名前:デフォルトの名無しさん mailto:sage [2006/02/21(火) 00:51:43 ] そんな頃があったのか・・・・
988 名前:デフォルトの名無しさん mailto:sage [2006/02/21(火) 00:55:13 ] 正確に言えば、IOモナドがなかった頃、だな。 Maybe なんかはあったが、モナドなんて知らんかったよ。
989 名前:デフォルトの名無しさん mailto:sage [2006/02/23(木) 22:23:38 ] SplitObjs=yesでghcをビルドしたら丸一日たっても終わってなくてキレた
990 名前:デフォルトの名無しさん mailto:sage [2006/02/23(木) 22:45:20 ] 去年の五月に書いて放置していたコードを読み返してたんだが、 百行に満たないライブラリコードなのに何をやってるのか全然分からなくて驚いた。 コメントを書いておかなかった俺も悪いが、Haskell恐るべし。
991 名前:デフォルトの名無しさん mailto:sage [2006/02/23(木) 23:45:05 ] 読めないコードでもバグは絶対無いのでご安心を。関数型だからね。
992 名前:デフォルトの名無しさん mailto:sage [2006/02/24(金) 02:31:21 ] 埋め
993 名前:デフォルトの名無しさん mailto:sage [2006/02/24(金) 03:05:10 ] 次スレ pc8.2ch.net/test/read.cgi/tech/1140717775/
994 名前:デフォルトの名無しさん mailto:sage [2006/02/24(金) 09:52:00 ] umeume
995 名前:デフォルトの名無しさん [2006/02/24(金) 10:19:39 ] 995
996 名前:デフォルトの名無しさん mailto:sage [2006/02/24(金) 16:27:10 ] 999
997 名前:デフォルトの名無しさん mailto:sage [2006/02/24(金) 17:21:52 ] 夢にHaskellが出てきた。 Haskellは少女だった。 形を持たず、目に見えず、概念的で、しかし可憐な、少女だった。 俺は喜び勇んで肉体関係を要求した。 拒否された。
998 名前:デフォルトの名無しさん mailto:sage [2006/02/24(金) 17:22:49 ] その日は、平凡な、曇り空の日だったが、気分は高揚していた。 俺の意志が、思考力が、誰かに支えられているような気がした。 出てくる発想はいつにも増して非凡だったし、 日常の、つまらない判断までも的確だった。 そして俺は、誰がこの研ぎ澄まされた思考を運んできてくれたのかを、 よく知っていたのだ。
999 名前:デフォルトの名無しさん mailto:sage [2006/02/24(金) 17:24:31 ] 全能感は一日しか続かなかった。 俺は戸惑うことなくそれを理解し、受け入れた。 それでも、ときどき、気がつくとGHCiを起動していることがある。 そんな時、俺は、こう打ち込むのだ。
1000 名前:デフォルトの名無しさん mailto:sage [2006/02/24(金) 17:25:22 ] Prelude> :m +Control.Monad.Fix Prelude Control.Monad.Fix> fix error 関数型プログラミング言語Haskell Part3 - 完 -
1001 名前:1001 [Over 1000 Thread] このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。