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
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] 結合法則は満たすけど交換法則は満たさないって状況、 小学校でやる一般的な算数にある?