関数型プログラミング言語Haskell Part11
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2009/09/08(火) 13:03:13http://www.haskell.org/
日本語サイト
http://www.sampou.org/cgi-bin/haskell.cgi
http://www.shido.info/hs/
過去ログ
関数型プログラミング言語Haskell
Part1 http://pc.2ch.net/tech/kako/996/996131288.html
Part2 http://pc2.2ch.net/test/read.cgi/tech/1013846140/
Part3 http://pc8.2ch.net/test/read.cgi/tech/1076418993/
Part4 http://pc8.2ch.net/test/read.cgi/tech/1140717775/
Part5 http://pc8.2ch.net/test/read.cgi/tech/1149263630/
Part6 http://pc11.2ch.net/test/read.cgi/tech/1162902266/
Part7 http://pc11.2ch.net/test/read.cgi/tech/1174211797/
Part8 http://pc11.2ch.net/test/read.cgi/tech/1193743693/
Part9 http://pc11.2ch.net/test/read.cgi/tech/1211010089/
Part10 http://pc12.2ch.net/test/read.cgi/tech/1231861873/
・2chの仕様により、行頭の半角スペースは表示されません。
コードをインデントしたいときは、代わりに または全角スペースを使うことができます。
0002デフォルトの名無しさん
2009/09/08(火) 13:04:00・Introduction to Functional Programming Using Haskell
http://www.amazon.co.jp/exec/obidos/ASIN/0134843460/
・Haskell: The Craft of Functional Programming
http://www.amazon.co.jp/exec/obidos/ASIN/0201342758/
・The Fun of Programming
http://www.amazon.co.jp/exec/obidos/ASIN/1403907722/
・The Haskell School of Expression: Learning Functional Programming Through Multimedia
http://www.amazon.co.jp/exec/obidos/ASIN/0521644089/
・入門Haskell
http://item.rakuten.co.jp/book/1794880/
・ふつうのHaskellプログラミング
http://item.rakuten.co.jp/book/4052963/
・Programming in Haskell
http://www.amazon.co.jp/exec/obidos/ASIN/0521692695/
・Real World Haskell
http://www.amazon.co.jp/exec/obidos/ASIN/0596514980
0003デフォルトの名無しさん
2009/09/08(火) 13:07:07・関数型言語Part IV
http://pc11.2ch.net/test/read.cgi/tech/1083649982/
・【数学者】Haskellはクソ言語【オナニー】
http://pc11.2ch.net/test/read.cgi/tech/1128011645/
・純粋関数型言語Concurent Clean
http://pc11.2ch.net/test/read.cgi/tech/1075629340/
・関数型言語ML (SML, OCaml, etc.), Part 6
http://pc11.2ch.net/test/read.cgi/tech/1245017721/
・Lisp Scheme Part27
http://pc12.2ch.net/test/read.cgi/tech/1248657331/
・【入門】Common Lisp その6【質問よろず】
http://pc12.2ch.net/test/read.cgi/tech/1234884136/
・Emacs Lisp 3
http://pc11.2ch.net/test/read.cgi/tech/1191875993/
0004デフォルトの名無しさん
2009/09/08(火) 13:07:561. ソース中の文字列 hello = "こんにちは" :: String は UTF-8
2. これを ghci で表示することは可能:(ただし、環境変数 LANG を UTF-8 にしておくこと、
また、ターミナルも UTF-8 で入出力できるようにしておくこと)
Main> print hello
こんにちは
Main>
3. 入出力 IO は Latin-1 だが、
package utf8-string (http://code.haskell.org/utf8-string/)
を導入することにより、入出力を UTF-8 にすることができる
4. その他の文字列エンコード(ShiftJIS, JIS, EUC-JP など) は、
package iconv (http://hackage.haskell.org/cgi-bin/hackage-scripts/package/iconv)
で UTF-8 な文字列にする
とまあ、こういうことで、日本語表示できるわけだ。iconv package は MacOSX と *BSD では
cabal を少しいじらなければいけないことに注意しろよ(iconv.cabal のコメントに書いてある)
0005デフォルトの名無しさん
2009/09/08(火) 13:09:24Haskell98によると、Charは一つのUnicode文字を表す(6.1.2)。
これに従って、比較的新しいHugsやGHC(6.4系を含む)ではCharは32ビット整数になっている。
ただし、どちらも入出力に際しての変換が完全でない。具体的には、
・ソースコード中の文字列リテラル
・System.IOライブラリでの入出力
が問題になる。
1. GHC6.4.2以前
ソースコード・入出力ともLatin-1を仮定する。Latin-1ではバイト値と
コードポイントが一致するので、入力時には外部エンコードの各バイトがそのままCharに
入り、出力時にはCharの下位8ビットのみが出力されるような実装になっている。
このため、あるエンコーディング(Latin-1とは限らない)の入力をgetLineで受け取り、
それをそのままputStrで表示すれば、入力時とおなじエンコードにおいて正しく表示される。
これを利用して、[Char]を、本来のコードポイントの列としてではなく、特定のエンコードの下での
バイト列として使うことができる。ただし文字列リテラルについては、GHCはLatin-1として
不正な文字を受け付けないので、EUC-JPのような例外を除くと、単純にリテラルを使うことはできない。
3.最近のHugs(非WindowsかつCのwchar_tがUnicodeの環境、というかLinux)
ソースコード・入出力ともロケールのエンコードを利用する。
4.最近のHugs(Windows)
ソースコード・入出力ともLatin-1を仮定する。ただし文字列リテラルにShift-JISを使ってもエラーにならない。
5.最近のHugs(それ以外)
未調査。
0006デフォルトの名無しさん
2009/09/08(火) 13:10:14規格どおりにCharにUnicodeを入れるか、Charを単なるバイトとして扱うかの二択。
i. CharをUnicodeとして扱う
(3)以外の場合入出力で変換が必要。(2)または(3)以外の場合文字列リテラルでは
明示的なエスケープ(たとえば"\22234")が必要。
ii. Charをバイトとして扱う
(3)ではファイルをバイナリモードで開くなどの対策が必要。(1)でEUC-JPを使う場合と(4)
を除き文字列リテラルでは明示的なエスケープ(たとえば"\143\153")が必要。
lengthやisAlphaのような関数、およびwin32パッケージの関数(win32API)が正しく動作しない。
0007デフォルトの名無しさん
2009/09/08(火) 13:51:07/´ ̄`ヽ /: : : \_____/: : : : ヽ、
,. -‐┴─‐- <^ヽ、: : : : : : : : : : : : : : : : : : : : : : }
/: : : : : : : : : : : : : :`.ヽl____: : : : : : : : : : : : : : : : : : /
,. -──「`: : : : : : : : : :ヽ: : : : : : : : :\ `ヽ ̄ ̄ ̄ フ: : : : :/
/: :.,.-ァ: : : |: : : : : : : : : :\: : : : :: : : :ヽ \ /: : : :/
 ̄ ̄/: : : : ヽ: : : . . . . . . . . . . .、 \=--: : : :.i / /: : : : :/
/: : ∧: \: : : : : : : : : : ヽ: :\: : : 〃}/ /: : : : :/ 、
. /: : / . : : :! ヽ: : l\_\/: : : : :\: ヽ彡: : | /: : : : :/ |\
/: : ィ: : : : :.i: : | \!___/ ヽ:: : : : : : :\|:.:.:.:/:! ,': : : : / |: : \
/ / !: : : : :.ト‐|- ヽ \: : : : : l::::__:' :/ i: : : : :{ |: : : :.ヽ
l/ |: : :!: : .l: :| \: : : l´r. Y {: : : : :丶_______.ノ: : : : : :}
l: : :l: : :ト、| 、___,ィ ヽ: :| ゝ ノ '.: : : : : : : : : : : : : : : : : : : : : : /
|: : :ト、: |: :ヽ ___,彡 ´ ̄´ ヽl-‐' \: : : : : : : : : : : : : : : : : : イ
!: :从ヽ!ヽ.ハ=≠' , ///// ///u /  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
V ヽ| }/// r‐'⌒ヽ イ〉、
ヽ、______ー‐‐' ィ´ /:/:7rt‐---、 こ、これは>>1乙じゃなくて
ィ幵ノ ./:/:./:.! !: : : : :!`ヽ ポニーテールなんだから
r‐'T¨「 |: | !:.∨:/:./: :| |: : : : .l: : : :\ 変な勘違いしないでよね!
/: : .|: :| !:.!ィ¨¨ヾ、:.:/ !: : : : l: : : : : :.\
0008デフォルトの名無しさん
2009/09/08(火) 19:40:240009デフォルトの名無しさん
2009/09/08(火) 22:10:550010デフォルトの名無しさん
2009/09/09(水) 01:00:48今月の予定らしいけどオライリーの近刊に出てないねー
0011デフォルトの名無しさん
2009/09/12(土) 16:14:07以下のモナドのなかで、union は Ord a であるところの Set a にしか使えません、と怒られるんだが、どこで制約課したらいいの?
---------------------------------------------------------------------------
import qualified Data.Set as S
data Distribution a =
Dist { sample :: a, support :: (S.Set a), expectation :: ((a -> Double) -> Double) }
always :: a -> Distribution a
always x = Dist { sample = x, support = S.singleton x, expectation = \f -> f x }
newtype Probability a = Prob { runProbability :: Distribution a }
instance Monad Probability where
p >>= f =
let x = runProbability p in
Prob $ Dist { sample = sample $ runProbability $ f (sample x),
support = S.fold (\d -> S.union $ support (runProbability $ f d)) (S.empty) (support x),
expectation = \g -> (expectation x) (\x -> (expectation (runProbability $ f x)) g) }
return a = Prob $ always a
----------------------------------------------------------------------------
Could not deduce (Ord b) from the context ()
arising from a use of `S.union'
Possible fix: add (Ord b) to the context of the type signature for `>>='
0012デフォルトの名無しさん
2009/09/12(土) 21:26:16今月じゃないって聞いてるよ。
近刊に出てきてないのはそのせいじゃないの?
0013デフォルトの名無しさん
2009/09/13(日) 02:35:04標準のモナドは要素の型に制約を掛けられない
逆に言うと、Probabilityは要素の型に制約があるのでMonadになっていない
だからどういう注釈をつけても無理
0014デフォルトの名無しさん
2009/09/13(日) 11:33:53ありがとう
ってことはリフレクションつかって自分で union 関数つくるしかないってことですね
しかし
Prelude Data.Set Data.Typeable> typeOf (empty :: Set Int)
>Set Int
はいいとして
Prelude Data.Set Data.Typeable> typeOf (empty :: (Ord a) => Set a)
>Set ()
これは納得いかねぇ…
0015デフォルトの名無しさん
2009/09/13(日) 14:42:57これだな
プロンプトじゃなくてファイルに書けばこの規則は適用されないから、ちゃんと曖昧エラーになるはず
0016デフォルトの名無しさん
2009/09/15(火) 00:12:55「週間Haskellコンパイラ」
なんて出してくれたら面白いのに
0017デフォルトの名無しさん
2009/09/15(火) 19:32:230018デフォルトの名無しさん
2009/09/15(火) 19:48:120019デフォルトの名無しさん
2009/09/15(火) 19:57:21んなもんはライブラリの解説がついた小冊子や小さなポスターでいいだろ。
トイレに貼って覚えるんだ。
0020デフォルトの名無しさん
2009/09/15(火) 20:01:21モナド構造わかってないけど、Distributionって超関数の意味?
ということは、Probabilityは確率測度ってこと?
0021デフォルトの名無しさん
2009/09/17(木) 14:35:020022デフォルトの名無しさん
2009/09/19(土) 13:45:46lifting というものの考え方がいまいちよく分かりません。
頭が混乱しています。
このページの例で言えば、lifting の考え方を使って
Picture でできる事を Animation でもできるようにしているんですよね。
では、先の章で定義した containsR 関数や containsS 関数は、
Resion から Shape への、あるいは Shape から Region への lifting ではないのですか。
Region できる contain の演算を Shape でもできるようにする、
あるいはその逆が実現されているような気がするのですが。
0023デフォルトの名無しさん
2009/09/19(土) 13:49:5410月に出るみたいだね
Books: 新刊・近刊情報
http://www.oreilly.co.jp/catalog/soon.html
0024デフォルトの名無しさん
2009/09/19(土) 18:42:38A Japanese version will be published around October 2009.
と、なってるよ。
第二次 haskell 本ブーム?
0025デフォルトの名無しさん
2009/09/20(日) 16:16:000026デフォルトの名無しさん
2009/09/20(日) 22:41:470027デフォルトの名無しさん
2009/09/21(月) 01:49:59あと岩波からもGofer本が出ていたから、それを入れると4冊目か
0028デフォルトの名無しさん
2009/09/21(月) 02:53:260029デフォルトの名無しさん
2009/09/21(月) 03:14:220030デフォルトの名無しさん
2009/09/21(月) 03:43:440031デフォルトの名無しさん
2009/09/21(月) 12:12:540032デフォルトの名無しさん
2009/09/21(月) 15:38:48という事が既に Lifting になっているのでしょうか。
型 A に対して可能な演算と型 B に対して可能な同類の演算の名前が違っていても、
それは Lifting には変わりなく、ただ同じ名前の演算が定義されていた方が
より洗練された Lifting だということなのでしょうか。
0033デフォルトの名無しさん
2009/09/22(火) 09:08:38普通出会わないだろ。liftMぐらいじゃね?
なんなのliftって?
0034デフォルトの名無しさん
2009/09/22(火) 09:11:41しょっぱなで出くわすのがlambda lifting
0035デフォルトの名無しさん
2009/09/22(火) 10:04:11でもいまの話ってtype lift(型持ち上げ)の話だろ。
0036デフォルトの名無しさん
2009/09/22(火) 10:10:02Payton JonesのImplementation of Functional Programming Languages
がどこかにpdfであったはず
13章を読むといいよ
0037デフォルトの名無しさん
2009/09/22(火) 10:13:040038デフォルトの名無しさん
2009/09/22(火) 11:23:12私が質問しているのは恐らく type lift の事だと思います。
もし type lift がどういうものか知っているのでしたら、
是非教えて頂きたいです。
172 ページを付近を飛ばしてとりあえず先に読み進んでみましたが、
やはり意味が分からず、内容が頭に入ってきません。
はっきりさせたいです。
0039デフォルトの名無しさん
2009/09/22(火) 23:39:450040デフォルトの名無しさん
2009/09/23(水) 06:08:41俺が知りたいのはtype liftingだ、lambda liftingなんて関係ない、
なんて言ってないで、関係あるものはさっさと読んだほうがいいぜ?
PJの説明はそう悪くないし。
0041デフォルトの名無しさん
2009/09/23(水) 07:33:17あんまり参考にならないだろうけど、型持ち上げはゲーデル(もしくはPM)にはじまる。
不完全性定理の証明に出てくる。
定義としては、
ある論理式aと別の論理式bがあるとして、
bがaの型持ち上げであるとは、bの全ての型のタイプ数を同じ数だけ
増加させると、bがaになることを指す。
というもの。PMがベースなのでそのままは適用できないけど、liftMを
使ってほぼ同じだと思われることは一応出来る。
a -> b => [a] -> [b]
みたいなの。
実は、自分もおなじことずっと調べていて、情報が欲しい。
そっちでなんか分かったら教えてくれると嬉しいかも。>>36も読んでみる。
004241
2009/09/23(水) 07:44:25じゃなかった。
a -> b -> (a,b) => [a] -> [b] -> [(a,b)]
だった。
タプルを作る関数を型持ち上げ=>直積を作る関数。
p x y = (x,y)
directProduct :: [a] -> [b] -> [(a,b)]
directProduct = liftM2 p
0043デフォルトの名無しさん
2009/09/23(水) 11:55:56ちょっと待って、飛躍しないで欲しい。
lambda liftingなんて関係ないなんて一言も言ってないし思ってもない。
そもそも、type lift と lambda lifting の違いすら今は全く分からない。
ただ、>>35 の言い方から、lambda lift は今回の話には繋がらないのか、
と推測しただけです(あの言い方ならそう推測してもおかしくないと思うが)。
で、私も「Implementation of Functional Programming Languages」を落としたので、
読んでみます。
0044デフォルトの名無しさん
2009/09/23(水) 12:57:400045デフォルトの名無しさん
2009/09/23(水) 20:51:05そうなんですか。
でも、やっぱりよく分かんないので、
とりあえず紹介された文献を読んでます。
まだ2章5節なんですけど、これはおもしろいですね。
ここまででもすごく勉強になります。
以前「Lambda-Calculus and Combinators an Introduction」を読んでいて、
p34 の不動点定理のところで意味が分からず挫折していたのですが、
ようやく意味が分かり、思わぬ収穫です。
13章にはほど遠いので、
lifting の意味はまだ全く分かんないですけど。
おもしろい文献の紹介、ありがとうございます。
0046デフォルトの名無しさん
2009/09/24(木) 10:00:51これは
単なる
イディオムだ
0047デフォルトの名無しさん
2009/09/24(木) 10:43:42う?どうもなか?最中どう?どうもなか?最中どう?どうもなか?最中どう?ど
うもなか?最中どう?どうもなか?もなかどう?どうもなか?もなかどう?どう
もなか?もなかどう?どうもなか?もなかどう?どうもなか?もなかどう?どう
もなか?もなかどう?どうもなか?もなかどう?どうもなか?もなどどう?どう
もなど?もなかどう?どうもなか?もなかどう?どうもなか?もなかどう?どう
もなか?もなかどう?どうもなか?もなかどう?どうもなか?もなかどう?どう
もなか?もなかどう?どうもなか?最中どう?どうもなか?最中どう?どうもな
か?最中どう?どうもなか?最中どう?どうもなか?最中どう?どうもなか?最
中どう?どうもなか?最中どう?どうもなか?最中どう?どうもなか?最中どう?
0048デフォルトの名無しさん
2009/09/24(木) 14:13:51http://d.hatena.ne.jp/coppieee/20090416/1239903149
導入したEclipse SDKはVersion: 3.3.2
Eclips用のHaskell モジュールが最新のEclips 3.5に未対応な為
リンク先の
>> 5. Windw -> Preferences -> Functional Programming -> Haskell -> Compiler -> GHC compiler -> Browseボタンでインストールしたghcのコンパイラ選択。
に有るように、正確にGHCの場所を指定しなくても動作する
ただし、インタープリタGHCiの場所を認識しないので、ghcの場所は正確に指定し
インタープリタghciの接待タブでghcの場所設定を利用するにチェックを入れる。
Eclipsの日本語化はhttp://mergedoc.sourceforge.jp/ を参考にどうぞ
少し疲れたw
0049デフォルトの名無しさん
2009/09/24(木) 16:19:33元の構造は保たないと。
ファンクタなんで。
0050デフォルトの名無しさん
2009/09/24(木) 18:50:01一意に決定しないと使い物にならない。
0051デフォルトの名無しさん
2009/09/24(木) 19:34:22ハルヒの射手座の日を思いだす
理由はよくわからない
0052デフォルトの名無しさん
2009/09/24(木) 23:04:26http://slashdot.jp/developers/09/09/24/039226.shtml
こういう連中がいる会社は最悪だろうな。まさに老害。
0053デフォルトの名無しさん
2009/09/24(木) 23:21:280054デフォルトの名無しさん
2009/09/24(木) 23:30:38極めれば即仙人になれる難しさだよね?
俺写像定義するだけで投げたレベルだからあれだけど
0055デフォルトの名無しさん
2009/09/24(木) 23:33:400056デフォルトの名無しさん
2009/09/24(木) 23:48:370057デフォルトの名無しさん
2009/09/24(木) 23:49:59死ぬまで学徒。
0058デフォルトの名無しさん
2009/09/26(土) 11:46:480059デフォルトの名無しさん
2009/09/26(土) 12:49:36別に難しくないじゃん。
数学系ならさほど障害は無いと思う。
0060デフォルトの名無しさん
2009/09/26(土) 13:00:42Coqよりだいぶマシ
0061デフォルトの名無しさん
2009/09/26(土) 22:47:020062デフォルトの名無しさん
2009/09/26(土) 22:55:22git/bzrメインに乗りかえたらすごい快適になった。Haskell製ってことで期待しすぎたのかもしれないが、
正直最近はdarcsなリポジトリみるとウンザリする。
0063デフォルトの名無しさん
2009/09/27(日) 00:51:45それ以降の奴ってdllが増えててやだなぁと思って使ってない。
git/bzr使おうかなぁとか思ったりもするけどmsysやらなんやら周辺のファイルの多さが気に入らない。
0064デフォルトの名無しさん
2009/09/29(火) 17:11:53例のおねーちゃんに乗っ取られてる
sampou.orgにあるから別にいいんだけど
なかのひとがどうしているのか気になる
0065デフォルトの名無しさん
2009/09/30(水) 21:37:25改行コードの自動変換をするらしい。
ttp://ghcmutterings.wordpress.com/2009/09/30/heads-up-what-you-need-to-know-about-unicode-io-in-ghc-6-12-1/
0066デフォルトの名無しさん
2009/10/04(日) 00:50:12ガベージコレクタがあって
8ビットCPUの時代Lispのインタープリタは4kbyteほどしかなかった気がする
Haskellのフロントはhaskellのカーネルに食わせるために単純な演算塊に展開してやると
で、Haskellの基本的部分はかなりコンパクトに実装できるのかな?と思った。
0067デフォルトの名無しさん
2009/10/04(日) 07:28:42> Haskell のカーネルって基本的にLispと同じだよね?
違う
0068デフォルトの名無しさん
2009/10/04(日) 14:35:490069デフォルトの名無しさん
2009/10/04(日) 18:57:28qsort[]=[]
qsort(x:xs)=qsort larger ++ [x]++ qsort smaller
where
smaller = [a|a<-xs,a <=x]
larger = [b|b<-xs,b>x]
What would be the effect of replacing <= by < in the definiton of qsort? Hint:consider the example qsort[2,2,3,1]
改変されたqsortをqsort'だと仮定する
qsort[2,2,3,1]=qsort [2,1] ++[2]++qsort [3]=(qsort[1]++[2]++qsort[])++[2]++(qsort[]++[3]++qsort[])
=((qsort[]++[1]++qsort[])++[2]++[])++[2]++([]++[3]++[])
=[]+[1]+[]+[2]+[]+[]+[2]+[]+[3]+[]=[1,2,2,3]
qsort'[2,2,3,1]=qsort [1] ++ [2] ++ qsort[3]=qsort[]++[1]++qsort[]++[2]++qsort[]++[3]++qsort[]
=[]++[1]++[]++[2]++[]++[3]++[]
つまり、同じ値が複数あるときは、ひとつを残して消えてしまう。
−−−−−−−−−
で、値が消えないんだけど文意を取り違えているのかどうなんだろう
消える様に改変しろなのかな?
smaller = [a|a<-xs,a <=x]をsmaller = [a|a<-xs,a <x]すると消えるけど
0070デフォルトの名無しさん
2009/10/04(日) 19:14:47「改変したらどうなるか?」ってのが問いで、「値が消える」が答え
What would be the effect of replacing <= by < in the definiton of qsort? Hint:consider the example qsort[2,2,3,1]
qsortの定義の中の<=を<に変えたとすると、何が起きるだろうか。ヒント qsort[2,2,3,1]という例で考えてみよ
0071デフォルトの名無しさん
2009/10/04(日) 19:15:16前者なら死ね。
後者ならどんだけ自分に自信がないんだ。君はできる子だよ。
0072デフォルトの名無しさん
2009/10/04(日) 19:17:46どう違うのか簡潔な説明が欲しいけど
”違う”の一言で終わりそうな感じなのであきらめます。
0073デフォルトの名無しさん
2009/10/04(日) 19:21:27インタープリタ込みの構造になってる。
そして動的型付け。
0074デフォルトの名無しさん
2009/10/04(日) 20:44:23それSchemeじゃない?Lispだと大抵コンパイラ込みで、宣言型型付けだろ。
0075デフォルトの名無しさん
2009/10/04(日) 21:23:36しかし、コンパイラでもマクロ展開を考えたら実質的にはインタプリタみたいなものは入ってなきゃだめだろう。
(CommonLisp でも Scheme でも。)
型については CommonLisp では型宣言できるけど、最適化のヒントでしかない。
型に応じて言語が何かしてくれるということはぜんぜん無い。
まぁ、「Lisp系」ってのは幅が広いので、ひとまとめで語るのが無茶だよ。
0076デフォルトの名無しさん
2009/10/04(日) 22:21:30型が宣言できるなら実装がなにかしてくれるかもしれないのでは?
007776
2009/10/04(日) 22:22:550078デフォルトの名無しさん
2009/10/05(月) 00:46:11Haskellをインタープリタだけ実装した場合lispに似てるのかな思ったので
言語仕様上は短精度、倍精度実数とか文字列とかあるけど
中身はリストさえclassとして実装している面白そうな物だなとか
a (n+1) = n で
a 1 を実行すると 0
a 2 を実行すると 1
a 0 を実行するとエラーになって思わず仰け反ったり、油断ならね〜
GHCのガベージコレクタは優秀とか言われているけどどうやっているのか興味が沸いたり
プログラムが関数の定義塊なのに、c系統のつもりで読んでパニック起こしたり
快感と言うかグッ来るものがある
0079デフォルトの名無しさん
2009/10/05(月) 00:50:570080デフォルトの名無しさん
2009/10/05(月) 01:04:25Yhcのソースでも読んで見りゃいいんじゃない?
http://www.haskell.org/haskellwiki/Yhc
0081デフォルトの名無しさん
2009/10/05(月) 06:18:40Haskellとの比較だから、コンパイラあるのは違う点に入らない。
実行時に型宣言ないlambda式生成できるので、
動的型付け必須で、データをunboxing出来ない。
0082デフォルトの名無しさん
2009/10/05(月) 08:43:130083デフォルトの名無しさん
2009/10/05(月) 09:34:34その型に応じた演算がされるから SBCL とか結構速い
0084デフォルトの名無しさん
2009/10/05(月) 19:18:360085デフォルトの名無しさん
2009/10/05(月) 21:44:42ps落としてきたんだけど、gvでエラーになっちゃう
0086デフォルトの名無しさん
2009/10/05(月) 21:55:43GhostScript を使って読むとか ps2pdf ってコマンドが同梱されているから pdf に変換するとかすればいいと思うよ
0087デフォルトの名無しさん
2009/10/05(月) 22:22:05d
0088デフォルトの名無しさん
2009/10/05(月) 22:51:24え、何で俺?
0089デフォルトの名無しさん
2009/10/06(火) 08:34:16強く強制されるから、コンパイラは、型的に正しいコードしか存在しないことを
仮定してコード生成ができる。
0090デフォルトの名無しさん
2009/10/06(火) 12:32:51オブジェクト指向プログラミングのSmalltalk
そして関数型プログラミングのHaskell
10年後くらいにはこんな感じの認識になってるんじゃないかと思う
0091デフォルトの名無しさん
2009/10/06(火) 12:33:480092デフォルトの名無しさん
2009/10/06(火) 13:08:140093デフォルトの名無しさん
2009/10/06(火) 13:38:26Lispは逆のアプローチじゃなかったかなあ
最適化に必要な型や仮定をプログラマが与える
コードが適切な振る舞いをすることは、型システムでなくてプログラマが保証する
0094デフォルトの名無しさん
2009/10/06(火) 19:48:530095デフォルトの名無しさん
2009/10/06(火) 20:19:230096デフォルトの名無しさん
2009/10/06(火) 21:02:300097デフォルトの名無しさん
2009/10/07(水) 00:39:22前は普通に/usr/local以下を管理してくれたと思ったが
0098デフォルトの名無しさん
2009/10/07(水) 16:26:460099デフォルトの名無しさん
2009/10/07(水) 19:47:44なんか前よりhaskellのランクが落ちてるような。他が良くなったのか。
0100デフォルトの名無しさん
2009/10/08(木) 08:17:56IronHaskellとかH#みたいな。
0101デフォルトの名無しさん
2009/10/08(木) 09:32:21http://php.cin.ufpe.br/~haskell/haskelldotnet/
0102デフォルトの名無しさん
2009/10/09(金) 12:10:570103デフォルトの名無しさん
2009/10/09(金) 16:00:31正格なんだっけ?
0104デフォルトの名無しさん
2009/10/09(金) 20:56:470105デフォルトの名無しさん
2009/10/09(金) 21:46:220106デフォルトの名無しさん
2009/10/10(土) 16:41:29Ocamlに圧倒的に負けてるね。とくに簡潔さで。
Haskellの記述力が弱いのか?
0107デフォルトの名無しさん
2009/10/10(土) 17:39:03によると、source sizeで一番Ocamlに差をつけられているのがregex-dnaというプログラム
Haskell GHCのコード
http://shootout.alioth.debian.org/u32/benchmark.php?test=regexdna&lang=ghc
Ocamlのコード
http://shootout.alioth.debian.org/u32/benchmark.php?test=regexdna&lang=ocaml
詳しい人解説プリーズ、と思ったらそもそもOcamlのコード動いてねえ!
0108デフォルトの名無しさん
2009/10/10(土) 18:06:07人が何に対して、何を基準にして簡潔さを感じるか、の違いだと思う。
私が感じる簡潔さはあのグラフでは表現されない。
私には Haskell は Ocaml に対して簡潔さにおいて圧倒的に負けてるとは思えない。
0109デフォルトの名無しさん
2009/10/10(土) 18:23:590110デフォルトの名無しさん
2009/10/10(土) 20:10:15ワロタw
オライリージャパンの近刊情報にRealWorldHaskellがあるけど
組み込みLinux〜とかとちがって発売日不明だし、十月は無理くさいね
ttp://www.oreilly.co.jp/catalog/soon.html
0111デフォルトの名無しさん
2009/10/10(土) 20:55:55きっとRWHもそれで必死に校正してるんだろうな
0112デフォルトの名無しさん
2009/10/10(土) 22:19:30> Fatal error: exception Failure("Buffer.add: cannot grow buffer")
バッファオーバーフローみたいなもの?
N=500,000(オリジナルの1/10)では動くらしい
Ocamlはメモリマネジメントがあまりうまくないのかな
0113デフォルトの名無しさん
2009/10/11(日) 14:14:21Word8 -> Word みたいなことをやりたいのですが
0114デフォルトの名無しさん
2009/10/11(日) 14:42:59fromIntegral = fromInteger . toInteger
でいいんじゃないか。
0115デフォルトの名無しさん
2009/10/11(日) 18:16:36それでいけました
質問にお答え頂きありがとうございました
0116デフォルトの名無しさん
2009/10/11(日) 18:32:19何かレベルの低い話っぽかったから見てなかったわ…
>型的に正しいコードしか存在しないことを
>仮定してコード生成ができる。
Lisp でも (declaim (optimize (safety 0) ... )) とかすれば、
型的に正しいコードしか存在しないことを仮定してコード
生成が出来るんだぜ。
0117デフォルトの名無しさん
2009/10/11(日) 18:36:27ミスがあったら実行時にエラーになっちゃう。Haskellのように安全かつ完全な型検査はできるわけじゃない。
そもそもスレ違い。
0118デフォルトの名無しさん
2009/10/11(日) 18:46:21そんなことを言って何が面白いのか知らんが。
0119デフォルトの名無しさん
2009/10/12(月) 16:22:01いや、おまえは型検査がまるでわかっていない。
0120デフォルトの名無しさん
2009/10/12(月) 16:28:14自分だけが知った気になってる奴が一番面倒くさいんだよな。
0121デフォルトの名無しさん
2009/10/12(月) 16:48:35>>81
>実行時に型宣言ないlambda式生成できるので、
>動的型付け必須で、データをunboxing出来ない。
Haskell のスレだが、Lisp について間違った認識をしている
人が居たから訂正したまでだよ。
0122デフォルトの名無しさん
2009/10/12(月) 16:55:52言い訳はそれで終わりか?
学部の授業受けなおしたらどうだ?
0123デフォルトの名無しさん
2009/10/12(月) 16:59:25>>121と>>122なら>>121の方に分があるように見える。
>>122のように無意味な誹謗を始めたら負けだ。
0124デフォルトの名無しさん
2009/10/12(月) 16:59:34>>121に異論が無いなら終わりだよ。
0125デフォルトの名無しさん
2009/10/12(月) 17:00:240126デフォルトの名無しさん
2009/10/12(月) 17:51:20話題を煽り論争にスリ替えようとしているのが
あまりにもミエミエで笑った!
0127デフォルトの名無しさん
2009/10/12(月) 18:16:07理解できてないだけでしょう。
単に煽りたいだけなのはミエミエだけどなあ。煽ればレスが貰えるみたいな、
レス乞食は面倒くさいから勘弁ね。ずっと笑ってなよ。
0128デフォルトの名無しさん
2009/10/12(月) 18:25:030129デフォルトの名無しさん
2009/10/12(月) 19:28:370130デフォルトの名無しさん
2009/10/12(月) 19:34:440131デフォルトの名無しさん
2009/10/14(水) 22:18:00で、Tシャツって4k以上だから、もう一冊買わないとダメなんですかね。
やるなー、オライリー
0132デフォルトの名無しさん
2009/10/14(水) 22:38:310133デフォルトの名無しさん
2009/10/15(木) 04:48:08ktkr
0134デフォルトの名無しさん
2009/10/15(木) 17:07:100135デフォルトの名無しさん
2009/10/17(土) 20:28:04金なくなってるから買えないよ
0136デフォルトの名無しさん
2009/10/17(土) 20:29:520137デフォルトの名無しさん
2009/10/17(土) 23:21:070138デフォルトの名無しさん
2009/10/17(土) 23:55:290139デフォルトの名無しさん
2009/10/18(日) 00:20:410140デフォルトの名無しさん
2009/10/18(日) 01:29:510141デフォルトの名無しさん
2009/10/18(日) 01:40:180142デフォルトの名無しさん
2009/10/18(日) 05:52:480143デフォルトの名無しさん
2009/10/18(日) 10:22:180144デフォルトの名無しさん
2009/10/18(日) 12:00:200145デフォルトの名無しさん
2009/10/18(日) 12:46:460146デフォルトの名無しさん
2009/10/18(日) 14:33:420147デフォルトの名無しさん
2009/10/18(日) 14:34:05Vista、XPは糞。Haskellとの親和性が最高なのはWindows7。
どこがいいって?そんなのやってみりゃすぐ分かるだろこれだらド素人は。。。。
0148デフォルトの名無しさん
2009/10/18(日) 14:35:300149デフォルトの名無しさん
2009/10/18(日) 14:59:29むしろVista、XPがHaskell的に糞だった事が異常だったわけで。
0150デフォルトの名無しさん
2009/10/18(日) 16:01:11http://programatica.cs.pdx.edu/House/
0151デフォルトの名無しさん
2009/10/18(日) 16:13:11ないだろw
0152デフォルトの名無しさん
2009/10/18(日) 16:48:350153デフォルトの名無しさん
2009/10/18(日) 18:10:100154デフォルトの名無しさん
2009/10/19(月) 18:18:530155デフォルトの名無しさん
2009/10/19(月) 18:21:39少なくとも>>150はネタじゃなかったりする。漏れも開いてみて驚いた。
0156デフォルトの名無しさん
2009/10/20(火) 19:40:16ざっとみると、ghc6.10.1で動作確認してあるみたい?
0157デフォルトの名無しさん
2009/10/20(火) 19:42:140158デフォルトの名無しさん
2009/10/20(火) 21:52:200159156
2009/10/20(火) 22:37:41原著よりも一回り小さいので文字も小さいw 電車で読みやすそうだからいいけど
0160デフォルトの名無しさん
2009/10/20(火) 23:32:350161デフォルトの名無しさん
2009/10/21(水) 23:41:050162デフォルトの名無しさん
2009/10/23(金) 18:33:00だから右結合。
<$> は部分適用みたいな使い方をよくするから、
左結合のほうが便利なのでは。
f <$> fx <*> fy <*> fz
で、<$>や<*>が右結合だと意味がおかしい。
あーなんか論理的じゃないな。
0163デフォルトの名無しさん
2009/10/24(土) 14:04:28それとも、別種の、実用言語ではなくて理論を突き詰めるためのものなんでしょうか。
アホな質問ですみません、Coqのサイトを少し見たのですがさっぱり分からなかったので。
よろしくお願いします。
0164デフォルトの名無しさん
2009/10/24(土) 14:32:02Haskell は証明系の理論をベースにしてはいるけど、用途としては汎用。
Coq は定理証明のために特化されているから立場が違うよ。
0165デフォルトの名無しさん
2009/10/24(土) 14:37:15実用言語しか興味のない人には何の関わりもない証明系。
0166デフォルトの名無しさん
2009/10/24(土) 14:42:430167デフォルトの名無しさん
2009/10/24(土) 16:26:460168デフォルトの名無しさん
2009/10/24(土) 16:48:01ないないw
0169デフォルトの名無しさん
2009/10/24(土) 17:03:380170デフォルトの名無しさん
2009/10/24(土) 17:12:59ここ行け
コンピューターによる定理の自動証明
http://science6.2ch.net/test/read.cgi/math/1126017312/
0171デフォルトの名無しさん
2009/10/24(土) 19:04:570172デフォルトの名無しさん
2009/10/24(土) 19:11:34カラーレーザープリンタ便利です
0173デフォルトの名無しさん
2009/10/24(土) 19:19:57CoqやAgdaなどの証明支援器はHaskellやOCamlなどと連携する機能があるから、むしろ一緒に使うのが実用的だね。
大部分はHaskellで作って、一部の関数だけ証明器で開発し、信頼性をよりよくするという使い方だね。
Agdaは日本の研究機関(AIST)が開発しているから、官公庁系の業務で将来的に積極的に使われるかも。
今はAgdaは不安定すぎてだめだね。もう少し枯れる必要があるね。
0174デフォルトの名無しさん
2009/10/24(土) 20:41:47全体の整合性があるかどうかが信頼性の根拠なんじゃないの?
0175163
2009/10/24(土) 21:54:30いや、次世代は「バグが無いことが証明されたコード」が可能になるのかと
勘違いしてました。少し安心です。
0176デフォルトの名無しさん
2009/10/24(土) 23:06:530177デフォルトの名無しさん
2009/10/25(日) 01:52:45知識の集積と普及に問題がありそうだけど。
入門書買って読んだ、目からうろがこぽろぽろ
0178デフォルトの名無しさん
2009/10/25(日) 10:37:37動的型のLISPより静的型のHaskellだろJK。
0179デフォルトの名無しさん
2009/10/28(水) 10:03:28もう充分な品質かな? 次の刷まで待った方がいいかな?
0180デフォルトの名無しさん
2009/10/28(水) 17:01:47Lisp は運用と開発の境界を曖昧にした。
運用の中で問題があればすぐに改善できるのがウリ。
だから使い続けていくうちに品質が向上していくという性質がある。
現実の問題ってのは最初から完全な制約が与えられるものではないし、
制約が変更されることもあるし、プログラマがミスをすることもある
という前提から出発している。
逆に言えば運用開始前にはバグがあって当然ということでもある。
つまり、「完璧」だとか「正しい」とは何かという問題なんだ。
完璧な制約を書けないなら、制約を完全に満たす出力があっても無意味だし、
全体の型整合が完全ってだけで完璧なプログラムなわけじゃないという点では
Haskell が常に最良じゃないのは確かにそうなんだけど…
最強を論じるのはナンセンスだ。
ある条件に対してよりマッチするかどうかってものがあるだけ。
0181デフォルトの名無しさん
2009/10/28(水) 22:41:52> 関数脳のつくり方 Second Season 〜モナドで悟りをひらく〜
ttp://itpro.nikkeibp.co.jp/article/COLUMN/20091023/339329/?ST=develop
0182デフォルトの名無しさん
2009/10/28(水) 22:52:52現時点での正誤表、680ページ前後有るのでまだ増えると思う
http://hop.timedia.co.jp/show/book/Real%20World%20Haskell
正誤表
p.444 上から6行目(コードを含む)
誤: ReaderTとWriterTの順番はどちらでも構いません。
正: ReaderTとStateTの順番はどちらでも構いません。
p.446 練習問題 1
誤: ..を変更してReaderTとWriterTの順序を入れ換えなさい。
正: ..を変更してReaderTとStateTの順序を入れ換えなさい。
p.447 ghciセッションの直前のパラグラフ,最初の文
誤: ..と働いているということに当てにせず、..
正: ..と働いているということを当てにせず、..
p.453 18.8節の手前3行目
誤: ..記録されだけということがわかります。
正: ..記録されるだけということがわかります。
p.464 19.2節 ヒント 下から2行目
誤: ..標準的なGHCライブラリから外され可能性があります
正: ..標準的なGHCライブラリから外される可能性があります
0184デフォルトの名無しさん
2009/10/29(木) 16:34:52http://blog.livedoor.jp/dankogai/archives/51314062.html
0185デフォルトの名無しさん
2009/10/29(木) 23:11:28dankogaiはhate対象
0186デフォルトの名無しさん
2009/10/30(金) 21:07:33プログラミングHaskell
http://www.amazon.co.jp/dp/4274067815/
0187デフォルトの名無しさん
2009/10/30(金) 22:08:11これって、入門者が主なターゲット?
0188デフォルトの名無しさん
2009/10/31(土) 00:15:490189デフォルトの名無しさん
2009/10/31(土) 07:23:40え、違わないでしょ。むしろプログラミング入門者向けって書かれてたと記憶してる。
0190デフォルトの名無しさん
2009/10/31(土) 10:31:47整理し、(自分用に)まとめられる力がある人にとっては、
もう目新しいトピックや目から鱗的なトピックは無いですか?
0191デフォルトの名無しさん
2009/10/31(土) 11:04:270192デフォルトの名無しさん
2009/10/31(土) 11:10:47全部が全部知っていること・理解していることってことはなかろう。
ひとつやふたつは何か新しい発見もあるだろうさ。
0193デフォルトの名無しさん
2009/11/01(日) 22:59:31wxHaskellをビルドしようとしてようやく気づいたけど、もしかしてこの頃からずっと?
0194デフォルトの名無しさん
2009/11/01(日) 23:22:40まだ、217p までしか読んでないけど、明らかに誤字だと分かるものでも7個見つけた。
(流し読みしたところもあるから、見逃してるのもあるかも)
700p 近くある翻訳本なら、これが普通なの?
まぁ、意味が正反対になったり、理解に苦しむレベルの誤字ではないから、
今のところいいけど。
0195デフォルトの名無しさん
2009/11/02(月) 00:58:530196デフォルトの名無しさん
2009/11/02(月) 01:12:46出版社に言え。誤字に訳本とか関係ないから。
0197デフォルトの名無しさん
2009/11/02(月) 07:27:08はい、全部読み切って、誤字をリストアップしたら
まとめて出版社の方に報告するつもりです。
内容はやはり素晴らしいですね。
まだ1/3も読んでませんが、ここまてでもかなり勉強になります。
JSONのプリティプリンティングの辺りからは、
小さいけど実用的なアプリを一から完成まで作り上げていく工程を
まるまる学べますね。
0198デフォルトの名無しさん
2009/11/07(土) 01:54:20ライプニッツの時代は原子論がまだ確立していなかった。
物の根源が原子であるということに確証がなかった。
だが、錬金術師としては最小単位があると記号的にも便利だよね。
0199デフォルトの名無しさん
2009/11/07(土) 02:07:35存在する数学的対象物を表す最小単位は?
0200デフォルトの名無しさん
2009/11/07(土) 02:11:110201デフォルトの名無しさん
2009/11/07(土) 02:16:550202デフォルトの名無しさん
2009/11/07(土) 04:53:520203デフォルトの名無しさん
2009/11/07(土) 05:55:43分解して小さなもので置き換えるだけではなく、むしろ還元とは小さなもので置き換えたときのそれぞれの関係について論じられるべき
関係が明らかになれば無駄に分解していく必要も無い
ってことでモナドの勝利
0204デフォルトの名無しさん
2009/11/07(土) 06:05:560205デフォルトの名無しさん
2009/11/07(土) 06:35:100206デフォルトの名無しさん
2009/11/07(土) 11:10:58あるよ
0207デフォルトの名無しさん
2009/11/07(土) 12:28:02何?
0208デフォルトの名無しさん
2009/11/07(土) 12:41:53粒子という概念で物質を考えると粒子は無限に小さくなる。
0209デフォルトの名無しさん
2009/11/07(土) 13:03:290210デフォルトの名無しさん
2009/11/07(土) 13:08:290211デフォルトの名無しさん
2009/11/07(土) 15:22:15依存関係のために先にインストールしておかなければならないものを
自動的に全てインストールする仕組みは無いでしょうか。
今は、ライブラリAを runhaskell Setup configure した時、
ライブラリB(の ver x.x.x)を先にインストールしておけと言われたら、
ライブラリAのインストール作業を一時中断し、
ライブラリBをダウンロードしてインストールしてから
先ほどのライブラリAのインストール作業を再開してます。
この先にライブラリBをダウンロードしてインストールする
という再帰的な作業を全自動で行ってほしいのですが、何か方法は無いですか。
0212デフォルトの名無しさん
2009/11/07(土) 15:47:10cabal-install
0213デフォルトの名無しさん
2009/11/07(土) 17:22:13すごい、素晴らしい。
めちゃくちゃ楽になった。
ありがと。
0214デフォルトの名無しさん
2009/11/10(火) 07:43:42primes::Integral i=> i -> [i]
primes = 2:sieve [3,5..]
where
sieve (p:xs) = p : sieve [x| x<-xs, x `mod` p /= 0]
そして primes を使用した, 素因数分解
rpf::Integral i=> i -> [i]
rpf n = _rpf n primes
where
_rpf m ps | pfs == [] = [m]
| otherwise = head pfs : _rpf (m `div` (head pfs)) pfs
where
pfs = dropWhile (\x -> m `mod` x /= 0) $ takeWhile (<=upb) ps
where
upb = floor . sqrt $ fromIntegral m
そしてこの素因数分解関数を利用して実装した素数判定
isPrime::Integral i=> i -> Bool
isPrime n = rpf n == [n]
0215デフォルトの名無しさん
2009/11/10(火) 07:46:08take 1000 primes
が簡単です
[2,3,…,7907,7919]
この処理に,自分の環境で33秒を要しました
別の実現方法として,
take 1000 $ filter isPrime [2..]
もすぐ思いつきます。
ここで悩ましいのは,isPrimeはrpfで実装されており,
rpfはprimesで実装されている所です。
つまりisPrimeはprimesを使って実装されているのです。
にも関わらず,後者の方法で要した時間は
6.79秒なのです
なんでですか?
0216デフォルトの名無しさん
2009/11/10(火) 10:07:17後者はたしかにprimesを使いますが
使うのは(takeWhile (<=upb) primes)だけですよね
これは(take 1000 primes)よりずっと短い
0217デフォルトの名無しさん
2009/11/10(火) 13:55:46primesは新しい数にぶつかる度にこれまでに
判明した素数で割れやしないかとテストするが
本来テストする数の二乗根までしかテストしなくて良いのだから
無駄な事をしていると
isPrime版ではこの事を考慮しているというわけですね
ではprimes自体最適化する必要があるわけですね
0218デフォルトの名無しさん
2009/11/10(火) 19:17:45RWHの誤りなどを報告するページができたもよう
http://www.sampou.org/cgi-bin/haskell.cgi?Books%3aRWH%3aBugReport
全部読み切ってからと言わずすぐに報告する方がいいぞ。
0219デフォルトの名無しさん
2009/11/10(火) 20:12:53今いくつか追加しといた
0220デフォルトの名無しさん
2009/11/11(水) 01:27:06これは、tellの引数 (Monoidのインスタンス) の
mappendを呼び出していると考えていいのでしょうか?
(そうだとするとmappendの引数は現在のログとtellの引数?)
以下のWriterのソースコードを読んだのですが、
tellはデフォルト実装が書かれていないようなので、
普段はどの処理を呼び出しているのか分かりませんでした。
ttp://www.haskell.org/ghc/docs/latest/html/libraries/mtl/src/Control-Monad-Writer-Class.html#tell
例えば、Data.Setや (a -> a) やリストの場合、
tellに渡すと呼ばれる処理がどこに書かれているのか、
ヒントだけでもいただけないでしょうか。
0221デフォルトの名無しさん
2009/11/11(水) 13:44:01>mappendを呼び出していると考えていいのでしょうか?
それで合ってる
そのソースは「Writer的モナド」のクラスを定義してるだけで、実装はこっち
http://www.haskell.org/ghc/docs/latest/html/libraries/mtl/src/Control-Monad-Writer-Lazy.html
厳密にはtellじゃなくて(>>=)がmappendを呼んでる
0222220
2009/11/11(水) 15:13:12最後に「Lazy」と「Strict」が付くリンクが、
それぞれ非正格と正格の場合の実装なんですね。
ついでにドキュメントの見方も理解できました。
ありがとうございました。
0223デフォルトの名無しさん
2009/11/11(水) 15:48:55ぐふふ バイトして金が用意できる
0224デフォルトの名無しさん
2009/11/12(木) 01:41:20RWHを買ったら覚えたHaskellで稼げば
その金をまたHaskellにつぎこめる
ぐふふふふ
0225デフォルトの名無しさん
2009/11/14(土) 21:10:17http://d.hatena.ne.jp/kazu-yamamoto/20091113/1258075565
0226デフォルトの名無しさん
2009/11/14(土) 22:30:490227デフォルトの名無しさん
2009/11/17(火) 09:12:51関数型プログラミングにどっぷり浸れる特別イベント「Haskellナイト」、今週末に開催
http://codezine.jp/article/detail/4615
0228デフォルトの名無しさん
2009/11/18(水) 05:09:15無いなら作る魂発揮できれば良いんだけど
0229デフォルトの名無しさん
2009/11/18(水) 07:57:41演算子が色々あるhaskellはその十数倍は見積もらないと。
haskellの最小コア命令セットってどうなるんだろ?
schemeだとapply evalに、if set! define lambda beginだったか。(マクロもあるけど)
0230デフォルトの名無しさん
2009/11/18(水) 08:34:14Haskellの教育向け実装処理系であるGoferはいかが?
ソースの合計行数(wc -l *.[chy])は、27110行だった。
作者によるユーザガイドと実装に関する論文も公開されている(ただし英語)。
0231デフォルトの名無しさん
2009/11/18(水) 12:17:32作れるの?
0232デフォルトの名無しさん
2009/11/18(水) 13:45:050233デフォルトの名無しさん
2009/11/18(水) 15:15:170234デフォルトの名無しさん
2009/11/18(水) 15:18:050235デフォルトの名無しさん
2009/11/18(水) 16:38:15なんか色々なものがclassで実装出来そうな気がする
つまり標準的な仕様から除外出来そうな。互換性には目を瞑るって事で
0236デフォルトの名無しさん
2009/11/18(水) 17:42:21良く分からんけどがんばれ
0237デフォルトの名無しさん
2009/11/20(金) 22:56:55事例があれば知りたい……
0238デフォルトの名無しさん
2009/11/20(金) 23:10:14次の様に書かれたダイアログが表示されました。
----------------------
GHC does not seem to be working.
GHC does not appear to be installed correctly, try reinstalling GHC version 6.10.3
Setup found what appears to be a non-working installation of GHC in the folder:
C:\Program Files\Haskell Platform\2009.2.0.2
□ Continue anyway. (You wil have to fix the DLL search path problem yourself later.)
----------------------
GHC 6.10.4 はインストールされています(Haskell Platform 2009.2.0.2 を使用)。
これは Gtk2Hs のインストーラーからは GHC が見えていないという事でしょうか。
また、DLL のサーチパスを自分で修正できるならそのままインストールしていいよ、
と言われていると思いますが、どこの設定をどのように変えればいいのでしょうか。
0239デフォルトの名無しさん
2009/11/20(金) 23:54:53仕事で使ってるけど何か?
ちなみに俺の仕事は大学の卒論を書くこと。
0240デフォルトの名無しさん
2009/11/21(土) 00:33:34このご時勢でもパスさせてきたけど
落としたほうがよさそうな気がしてきた。
0241デフォルトの名無しさん
2009/11/21(土) 00:45:310242デフォルトの名無しさん
2009/11/21(土) 10:50:190243デフォルトの名無しさん
2009/11/21(土) 18:26:01そのgtk2hsのバイナリはghc 6.10.3でコンパイルされてるとかじゃね?
0244デフォルトの名無しさん
2009/11/21(土) 18:36:45今は\from to-> readProcess "iconv" ["-f", from, "-t", to]
みたいなもの使って無理矢理やってますが、これはどうかと思うんで
0245デフォルトの名無しさん
2009/11/21(土) 19:21:120246デフォルトの名無しさん
2009/11/21(土) 21:07:060247デフォルトの名無しさん
2009/11/21(土) 22:15:53プログラミングHaskell
Real World Haskell
どれ買うのがいい?
0248デフォルトの名無しさん
2009/11/21(土) 22:54:29どれも買え。
0249デフォルトの名無しさん
2009/11/21(土) 23:15:180250デフォルトの名無しさん
2009/11/22(日) 00:14:33原本より安い
RWHは原本の間違いが50箇所以上修正されている
0251デフォルトの名無しさん
2009/11/22(日) 00:32:000252デフォルトの名無しさん
2009/11/22(日) 00:33:23代わりに日本語の間違いが同じくらいあるけどね。
0253デフォルトの名無しさん
2009/11/22(日) 00:43:44つttp://www.sampou.org/cgi-bin/haskell.cgi?Books%3aRWH%3aBugReport
これから買う俺のために報告しておいてくれ
「ふつうの」本の作者なんて、報告しても梨の礫だし、サポートページも放置プレイなんだぜ
0254デフォルトの名無しさん
2009/11/22(日) 01:11:15とりあえず俺が今まで気づいたところは報告済み
0255デフォルトの名無しさん
2009/11/22(日) 09:36:56重版かかるのはいつごろになりそうなんだろうな
修正された版を買おうと待ってるんだけど
0256デフォルトの名無しさん
2009/11/22(日) 14:53:29/´ ̄`ヽ /: : : \_____/: : : : ヽ、
,. -‐┴─‐- <^ヽ、: : : : : : : : : : : : : : : : : : : : : : }
/: : : : : : : : : : : : : :`.ヽl____: : : : : : : : : : : : : : : : : : /
,. -──「`: : : : : : : : : :ヽ: : : : : : : : :\ `ヽ ̄ ̄ ̄ フ: : : : :/
/: :.,.-ァ: : : |: : : : : : : : : :\: : : : :: : : :ヽ \ /: : : :/
 ̄ ̄/: : : : ヽ: : : . . . . . . . . . . .、 \=--: : : :.i / /: : : : :/
/: : ∧: \: : : : : : : : : : ヽ: :\: : : 〃}/ /: : : : :/ 、
. /: : / . : : :! ヽ: : l\_\/: : : : :\: ヽ彡: : | /: : : : :/ |\
/: : ィ: : : : :.i: : | \!___/ ヽ:: : : : : : :\|:.:.:.:/:! ,': : : : / |: : \
/ / !: : : : :.ト‐|- ヽ \: : : : : l::::__:' :/ i: : : : :{ |: : : :.ヽ
l/ |: : :!: : .l: :| \: : : l´r. Y {: : : : :丶_______.ノ: : : : : :}
l: : :l: : :ト、| 、___,ィ ヽ: :| ゝ ノ '.: : : : : : : : : : : : : : : : : : : : : : /
|: : :ト、: |: :ヽ ___,彡 ´ ̄´ ヽl-‐' \: : : : : : : : : : : : : : : : : : イ
!: :从ヽ!ヽ.ハ=≠' , ///// ///u /  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
V ヽ| }/// r‐'⌒ヽ イ〉、
ヽ、______ー‐‐' ィ´ /:/:7rt‐---、 こ、これは>>254乙じゃなくて
ィ幵ノ ./:/:./:.! !: : : : :!`ヽ ポニーテールなんだから
r‐'T¨「 |: | !:.∨:/:./: :| |: : : : .l: : : :\ 変な勘違いしないでよね!
/: : .|: :| !:.!ィ¨¨ヾ、:.:/ !: : : : l: : : : : :.\
0257デフォルトの名無しさん
2009/11/22(日) 15:05:18なるほどと思って、MinGW + MSYS 入れてコンパイルしてみようとしたが、
色々やっても make で失敗する原因が掴めん。
(GHC のバージョンをひとつ下げれば良いだけの話だが、なんか気持ち悪い)
vmplayer + ubuntu 上でコンパイルしたら、すんなりできた。
せっかくのアドバイスにすまんが、
とりあえず諦めてこっちでプログラムすることにした。
0258デフォルトの名無しさん
2009/11/22(日) 23:47:13正誤表は表紙の裏に貼っておいて
修正箇所にはマーカーで線を引いておくといい
版が上がるのを待っていると購買意欲が薄れてゆく
本は勢いで買うものだ
ネットでリアルタイムに正誤表が入手できるようになったのは
多大な進歩だと思うけど、紙とシリコンに情報が分散する点が不便だ
表紙の裏に貼るくらいの大きさでプリンタブルなフォーマットを
用意してくれるとすごい助かる
wikiやblogのプラグインでそういうのないかな
0259デフォルトの名無しさん
2009/11/26(木) 11:04:36Gauche本なんかはすぐに第二刷が出たよね。
ところで、「刷」ってのは内容に変更なしで追加で刷った場合に使うもんだと
思ってたけど、Gauche本では結構修正されてたよね。
誤植訂正は変更の内には入らないのかね。
0260デフォルトの名無しさん
2009/11/26(木) 13:52:310261デフォルトの名無しさん
2009/11/26(木) 14:21:55難しい…
0262デフォルトの名無しさん
2009/11/26(木) 14:30:340263デフォルトの名無しさん
2009/11/26(木) 15:38:48> ところで、「刷」ってのは内容に変更なしで追加で刷った場合に使うもんだと
いや。改訂版、増補版などの場合に第2版とかになる。誤植の修正程度では
刷数が上がるだけ。
0264デフォルトの名無しさん
2009/11/26(木) 16:06:41区別されたわけだけど、電子化でそういう区別はなくなっちゃったけどな。
0265デフォルトの名無しさん
2009/11/28(土) 10:06:40do {
putStr "input >";
s <- getLine;
}
というような場合,コンパイルすると書いた順に実行されません。
インタプリタで実行したり改行の入るprint やputStrなどを使うと
ちゃんとできるようです。
書いた順に実行させるにはどうしたらいいのでしょうか。
0266デフォルトの名無しさん
2009/11/28(土) 11:03:36putStrLn "input >";
s <- getLine;
}
0267デフォルトの名無しさん
2009/11/28(土) 11:07:30do {
putStr "input >";
hFlush stdout;
s <- getLine;
}
0268デフォルトの名無しさん
2009/11/28(土) 11:08:22バッファリングされてるからフラッシュする
import IO
main = do{
putStr "input >";
hFlush stdout;
s <- getLine;
putStrLn s;
}
0269268
2009/11/28(土) 11:09:080270デフォルトの名無しさん
2009/11/28(土) 11:12:540272265
2009/11/28(土) 11:23:230273デフォルトの名無しさん
2009/11/28(土) 11:40:37難解な問題
0274デフォルトの名無しさん
2009/11/28(土) 19:29:140275デフォルトの名無しさん
2009/11/28(土) 19:30:470276デフォルトの名無しさん
2009/11/29(日) 14:13:510277デフォルトの名無しさん
2009/11/30(月) 10:17:150278デフォルトの名無しさん
2009/11/30(月) 15:57:47もうちょいマシな仕組みはなかったんだろうか
0279デフォルトの名無しさん
2009/11/30(月) 19:08:06たまにliftだらけになって見た目汚くなっちゃうよねwwwwwww
0280デフォルトの名無しさん
2009/11/30(月) 19:20:05関数分けろよ。
関数的スパゲッティまずい
0281デフォルトの名無しさん
2009/12/01(火) 00:24:31fmapの定義はどのようなものなのでしょうか?
0282デフォルトの名無しさん
2009/12/01(火) 03:56:04↓ ↓
f fmap f
↓ ↓
Y → (A×) Y
だからControl.Arrow.Arrow.secondかな
0283デフォルトの名無しさん
2009/12/01(火) 07:44:540284デフォルトの名無しさん
2009/12/04(金) 09:26:02Haskell大好きな人助けてください
http://icpc.baylor.edu/past/icpc98/Finals/Report/Problems/Problems98.pdf
0285デフォルトの名無しさん
2009/12/05(土) 02:42:590286デフォルトの名無しさん
2009/12/05(土) 02:52:52みなさんどうしてます?
0287デフォルトの名無しさん
2009/12/05(土) 10:53:45と計算すると
1.0e-2
と表示されてしまうんですが、これを
0.01
と表示したい場合、どうするのでしょうか
0288デフォルトの名無しさん
2009/12/05(土) 11:38:530289デフォルトの名無しさん
2009/12/05(土) 11:44:11printf "%2f" $ 1/100
0290デフォルトの名無しさん
2009/12/05(土) 11:47:43ReaderT,StateTなんかを使うグローバル変数的なものはunsafePerformIO (newIORef hoge)で代用
MaybeT,ErrorTは Monad m => m (Maybe a) -> (a -> m (Maybe b)) -> m (Maybe b)等の
バインド関数を用意してIOモナドの中でやる
IOのほうが少ない場合は変換子のほうが綺麗に書けるけど
GUIだとどうしてもね…
0291デフォルトの名無しさん
2009/12/05(土) 11:59:51thx
0292sage
2009/12/05(土) 12:35:04> (1) Scalaでのモナドは,「map,flatMap,filter,unitコンストラクタ」を実装し,モナド則を満たしたクラスのことです。
Scalaのモナドってfilterが必要なの?どういうこと? Scalaはクソ仕様ってこと?
それとも単に豆蔵がアホってこと?
0293デフォルトの名無しさん
2009/12/05(土) 14:01:07Exercise 1.5 の問題がどうしても誤植に思えてしまいます。
0294デフォルトの名無しさん
2009/12/08(火) 21:13:13ttp://hop.timedia.co.jp/show/book/Real%20World%20Haskell
0295デフォルトの名無しさん
2009/12/08(火) 23:58:53第3刷まで待とうかな。
0296デフォルトの名無しさん
2009/12/09(水) 11:23:33版を重ねないと駄目だよね
0297デフォルトの名無しさん
2009/12/09(水) 12:17:14増刷時に訂正が入ることもある。翔泳社のサイトでは自社出版物に関して
そういう情報を公開している。オライリーがどういう基準なのかは知らん
が、昔に買った sed & awk の本だと訂正されていたこともあった。
0298デフォルトの名無しさん
2009/12/09(水) 13:21:302刷の締切までに発見済みの誤りは訂正されるはず。
0299デフォルトの名無しさん
2009/12/09(水) 17:09:25うん、その通り「はず」だよ。いつも保証は無い。なので、第3刷までは待っている。
それまでの間に品切(=絶版)になったら、そのとき考える。
0300デフォルトの名無しさん
2009/12/09(水) 18:34:230301デフォルトの名無しさん
2009/12/09(水) 21:28:500302デフォルトの名無しさん
2009/12/10(木) 07:58:39三版でも直ってる「保証」はない。
0303デフォルトの名無しさん
2009/12/10(木) 10:04:490304デフォルトの名無しさん
2009/12/10(木) 11:25:03無いヨ。勝手に期待してるだけ。そもそも出る保証すら無いんだから。
しかし原著のサンプルコードのミスに気がつかなかったケースもある
みたいだけど、翻訳時に検証ってしてないんかね?
>>303
ゴメンね。
0305デフォルトの名無しさん
2009/12/11(金) 19:13:540306デフォルトの名無しさん
2009/12/11(金) 23:23:21もれなく人力によるFAQのDDOS攻撃が付いてきます
0307デフォルトの名無しさん
2009/12/12(土) 08:33:340308デフォルトの名無しさん
2009/12/13(日) 04:43:40http://d.hatena.ne.jp/nobsun/20091211/1260541003
0309デフォルトの名無しさん
2009/12/13(日) 19:04:580310デフォルトの名無しさん
2009/12/13(日) 19:24:360311デフォルトの名無しさん
2009/12/14(月) 20:53:52どんな言語を受理するアルゴリズムでも手続き型言語とHaskellで
同じオーダーの使用メモリと速度で書けるって証明はあるのん?
0312デフォルトの名無しさん
2009/12/14(月) 22:07:12リストを使うアルゴリズムと、リストを使わないけど同じアルゴリズムを仮定して
両者は同じではないので矛盾するということを証明すれば?
0313311
2009/12/14(月) 22:23:28相当難しいと思うんだが。
でもHaskellにとってそこを保障しとくのは大事だろうから
偉い人がもう証明してくれてるかな〜とおもってた。
0314デフォルトの名無しさん
2009/12/14(月) 23:29:28http://haskell.org/ghc/docs/6.12.1/html/users_guide/release-6-12-1.html
0315デフォルトの名無しさん
2009/12/14(月) 23:54:49「どんな言語を受理するアルゴリズムでも」ってどういう意味だよ?
おまえら本当に自分が書いてることの意味わかってて会話してんの?
0316311
2009/12/15(火) 00:09:47計算理論では割と一般的な言葉では?
0317デフォルトの名無しさん
2009/12/15(火) 00:18:32OCamlみたく配列やmutableコレクションをサポートしてると、
そっちに逃げることも多いな。
0318デフォルトの名無しさん
2009/12/15(火) 00:21:55好きなのをどうぞ
ttp://hackage.haskell.org/packages/archive/pkg-list.html#cat:data
0319デフォルトの名無しさん
2009/12/15(火) 00:27:04とりあえずgoogle先生では引っかからなかった
0320デフォルトの名無しさん
2009/12/15(火) 00:52:21同じアルゴリズムを異なる言語で書くと、それらは何をもって同じだというのか。
0321311
2009/12/15(火) 01:04:18なんとなく話がかみ合ってないが。
この場合の言語てのはHaskellとかJavaとかのプログラム言語のことじゃないよ。
大雑把に言うと解きたい問題のこと。
計算理論だとそういう言い方したりする。
0322デフォルトの名無しさん
2009/12/15(火) 01:06:55配列もあればタプルもあるしハッシュもある。
ろくに調べもせずそういうこと言わない。
0323デフォルトの名無しさん
2009/12/15(火) 01:16:430324デフォルトの名無しさん
2009/12/15(火) 09:13:21まぁアルゴリズムでも意味は通るが。
0325デフォルトの名無しさん
2009/12/15(火) 12:06:47なら答えは「Haskellにも定数時間で読み書きできる配列があるから同じ」
詳しくはIOArrayあたりを調べればいい
0326デフォルトの名無しさん
2009/12/15(火) 15:14:39dynamic loadingってあるけど
これで糞長いLinking..から開放されるってこと?
0327311
2009/12/15(火) 22:15:05けっきょくモナドなん?
つかモナドってよくわかってないんだけども。
Haskellは副作用がないから純粋でいいんだ〜ってよくきくよね?
でも副作用を使うためにモナドが用意されてて、
モナドは使わないに越したことはないんだけども、
モナドを使ってもHaskellは純粋なままなんだ〜とか。
さっぱりわからんw。
0328ちんこ ◆GbXlaaQNk.
2009/12/15(火) 22:27:15"+++"は一体何のために作られたのか?
説明よろ。
0329デフォルトの名無しさん
2009/12/15(火) 22:35:29311じゃないんだが、横から質問させてください。
たとえば整数の二次元配列の1要素に書き込む処理を考えると、
手続き型言語であれば、機械語のレベルで数ステップから十数ステップ程度の
オーバーヘッドで実行できる。1要素の読み出しと大差は無いし、処理時間も定数的です。
で、HaskellのIOArrayへの書き込み処理というのも、「1要素の読み出しと大差の無い時間で
実行できる」ものなのでしょうか?もしYesなら「手続き型言語と同じ」と言えるでしょう。
でも個人的には、おそらくIOArrayの実装とは、書き込んだ状態変化を差分として保持し、
それをハッシュで管理することでオーバヘッドを最小限に押さえているのだと想像しています。
だとすれば、とても読み出し処理と同じオーバヘッドで実行できるはずはありません。
それともHaskellのIOArrayは、素人の想像を超えた(魔法のような)ロジックで
実装されているのでしょうか?それがモナド・マジックとやらなのかなぁ.....。
0330デフォルトの名無しさん
2009/12/15(火) 22:38:22俺が昔書いたHaskellのライブラリ、今日のダウンロード数0だよ。乙ですw
0331デフォルトの名無しさん
2009/12/15(火) 23:33:00何見て勉強してるんだ?
いくつかネットで読めるチュートリアルを最初から読めば
そんな質問はしないはずだが
0332デフォルトの名無しさん
2009/12/16(水) 01:44:170333デフォルトの名無しさん
2009/12/16(水) 15:37:38Haskellでは「いかにも関数的」な書き方もできるし、IOモナドを使えば手続き的にも書ける
関数的に綺麗に書ける場合はそれに越したことはないが、
IOモナドを使って手続き的に書いた場合でも参照透明性は損われない、ってだけのこと
>>329
実装は読んでないけど、IOArrayの実体はポインタの配列で、
IOArrayへの書き込みは(ポインタの)破壊的代入で実装されてるはず
GC関係でもうちょっと追加の作業をやってるかもしれんが、
少くとも差分を管理するような複雑なことはやってない
IOモナドを使えば順序立った入出力ができるんだから、
メモリを外部の装置と思えば入出力と同じ要領で破壊的書き換えができる
どこにも魔法はないよ
0334329
2009/12/18(金) 03:19:55遅くなりましたが、レスありがとうございました。
「メモリを外部の装置と思えば」という比喩で理解できました。
Haskellからすれば添字でアクセス可能な外部データベースに見えるわけですね。
というか、IO-という接頭辞でそれに気付けなかった自分がおバカでした。
0335デフォルトの名無しさん
2009/12/21(月) 15:31:350336デフォルトの名無しさん
2009/12/21(月) 16:05:270337デフォルトの名無しさん
2009/12/21(月) 16:32:490338デフォルトの名無しさん
2009/12/21(月) 16:33:300339デフォルトの名無しさん
2009/12/21(月) 16:34:22ん、どうして?
遅延評価があるから無限リストができるのに。
0340デフォルトの名無しさん
2009/12/21(月) 18:09:43[a] -> IO a
0341デフォルトの名無しさん
2009/12/21(月) 18:16:35たとえば
hoge :: [a] -> IO a
hoge = return . head
0342デフォルトの名無しさん
2009/12/21(月) 18:39:55できれば、無限リストを、と言ってるのを無視しないで・・・
それだと有限でも無限でも関係ないから
0343デフォルトの名無しさん
2009/12/21(月) 19:32:19ほしいということでしょ?
0344デフォルトの名無しさん
2009/12/21(月) 19:40:580345デフォルトの名無しさん
2009/12/21(月) 19:42:32それは証明できないことだと思うよ。
0346デフォルトの名無しさん
2009/12/21(月) 19:47:350347デフォルトの名無しさん
2009/12/21(月) 20:04:27手続き型言語的には、ループになってるリストを検出するとか。
Haskellだと関数呼び出しが単純な何もしない無限ループになってると処理系で検出するよね...
と思ったらghciだとダメだったorz
0349デフォルトの名無しさん
2009/12/21(月) 20:06:04こういうの?
有限リストを渡すと突然死ぬ
import Control.Concurrent
listToGenerator :: [a] -> IO (IO a)
listToGenerator list = do
m <- newMVar list
return $ modifyMVar m $ \(x:xs) -> return (xs, x)
main = do
g <- listToGenerator [1..]
print =<< g
print =<< g
0351デフォルトの名無しさん
2009/12/21(月) 20:43:58do
g1 <- listToGenerator [1..]
g2 <- listToGenerator [1..]
としたら、g1とg2は相互に独立した、系列の違うジェネレータにならないと困るだろ?
つまり、listToGeneratorは呼ばれるたびに別のものを返さないといけないので、
普通の関数じゃなくてIO動作としてしか定義できない
0352340
2009/12/21(月) 22:38:02それは分かったけど、
IO aを返すにしても、IO (IO a)を返すにしても、IOであることには変わりない。
型を見る限りでは「Generatorを返す関数」である可能性はぜんぜん否定できてない。
型レベルでは
「普通の関数が、呼ばれるたびに別のものを返す」可能性を否定できないの?
0353デフォルトの名無しさん
2009/12/21(月) 23:37:44Generatorって何、普通の関数って何?
0354デフォルトの名無しさん
2009/12/21(月) 23:46:45相互に独立した、系列の違うジェネレータを返さないといけない。
IOはジェネレータである。
ゆえに、IOを返す関数は、呼ばれるたびに、別のものを返す。
0355デフォルトの名無しさん
2009/12/22(火) 00:14:30繰り返して実行することで、ある型の値を次々と取り出せるモノのことをジェネレータと呼びたい
>>351でいうg1やg2のこと。具体的に定義するなら
type Generator a = IO a
問題は、ある型Tのリスト[T]が与えられたとき、これに対応するジェネレータGenerator Tを得たい、というもの
この変換を直接行う関数[a] -> Generator aはうまく定義できず、
IOアクションを返す関数[a] -> IO (Generator a)を書くしかない、というのが>>351の主張
>>352
>「普通の関数が、呼ばれるたびに別のものを返す」可能性を否定できないの?
Haskellの関数は、同じ引数で呼ばれたら同じものを返すと決まってる。参照透明性ってやつ
[a] -> IO aという型を持つ関数は、同じ[a]を与えられたらいつも同じIO aを返さないといけない
(一方、IO aを実行するとa型の値が結果として得られるけど、この結果は毎回異なる可能性がある)
0356デフォルトの名無しさん
2009/12/22(火) 00:49:03b = Generator aとすると
IO (Generator a)
= IO b
= Generator b
0357デフォルトの名無しさん
2009/12/22(火) 09:29:29[a] -> Generator b を作って何とも思わないの?
0358デフォルトの名無しさん
2009/12/22(火) 17:43:53それはその通りだけど、何が言いたい?
0359デフォルトの名無しさん
2009/12/22(火) 18:20:17・ジェネレータを返す関数(≠アクション)が存在する
・その関数は参照透明にならないかもしれない
・ちゃんと参照透明になっているかどうか、型推論では推論できない
0360デフォルトの名無しさん
2009/12/22(火) 18:51:59うん
listToGeneratorの結果のGenerator (Generator T)は毎回異なる必要がないので、関数でおk
>・その関数は参照透明にならないかもしれない
Haskellの関数は基本的に全部参照透明だよ。もちろんlistToGeneratorも参照透明
参照透明じゃない関数はunsafePerformIOを直接間接に使うくらいしか書く方法がないし、滅多に書かない
特に理由がなければ関数は参照透明だと仮定して議論しても問題ないと思う
>>355でもほとんど同じことを言ってるけど、listToGenerator :: [a] -> IO (IO a)は同じ[a]を与えられたら常に同じIO (IO a)を返す
>・ちゃんと参照透明になっているかどうか、型推論では推論できない
「型推論では推論できない」ってのは、「型を見ただけでは判定できない」って意味?
それなら上で答えたとおり、特に理由がなければ参照透明とみなす
ついでに言うと、「型推論」ってのは、明示的に型が書かれていない式や変数の型を計算することね
0361デフォルトの名無しさん
2009/12/22(火) 19:07:11>特に理由がなければ関数は参照透明だと仮定
ジェネレータがからむと参照透明じゃなくなる場合があるって言ってるのに
なんで「特に理由がない」ってことにするわけ?
それと「仮定」ってあいまいな言い方をするのも、どうかと思う
0362デフォルトの名無しさん
2009/12/22(火) 19:08:050363デフォルトの名無しさん
2009/12/22(火) 19:13:06>ジェネレータがからむと参照透明じゃなくなる場合があるって言ってるのに
俺はそんなこと言ってない。もしそういう場合があると主張するなら根拠を示してくれ
>それと「仮定」ってあいまいな言い方をするのも、どうかと思う
それはすまん。「とりあえず正しいと信じる」って意味で使った
0364デフォルトの名無しさん
2009/12/23(水) 17:22:50みたいにしたい
0365デフォルトの名無しさん
2009/12/23(水) 22:17:050366デフォルトの名無しさん
2009/12/23(水) 22:19:13スレ違い
女性に質問!マジレスしてくれ part579
http://hideyoshi.2ch.net/test/read.cgi/lovesaloon/1261474477/
0367デフォルトの名無しさん
2009/12/23(水) 22:35:400368デフォルトの名無しさん
2009/12/24(木) 00:02:05遅延評価するにしても結局は必要になるんだぞ?
0369デフォルトの名無しさん
2009/12/24(木) 01:10:3225日は家族と何事も無かったかのようにクリスマスパーティだろ。
0370デフォルトの名無しさん
2009/12/24(木) 15:51:160371デフォルトの名無しさん
2009/12/24(木) 16:01:4516…予約はじまる
22…予約最盛期
23…我慢できない
24…最盛期
25…ロスタイム
26…半額
27…更に半額
28…返品
29…廃棄処分
30…廃棄処分逃れてもカビ
____
/_ノ ヽ、_\
ミ ミ ミ o゚((●)) ((●))゚o ミ ミ ミ クリスマスケーキのことだお
/⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\ /⌒)⌒)⌒) 自分の年齢当てはめてんじゃねぇおww
| / / / |r┬-| | (⌒)/ / / // バ
| :::::::::::(⌒) | | | / ゝ :::::::::::/ ン
| ノ | | | \ / ) / バ
ヽ / `ー'´ ヽ / / ン
| | l||l 从人 l||l l||l 从人 l||l
ヽ -一''''''"~~``'ー--、 -一'''''''ー-、
ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))
0372デフォルトの名無しさん
2009/12/24(木) 17:16:05Haskell Platform = GHC + ライブラリパッケージ
0373デフォルトの名無しさん
2009/12/24(木) 18:29:32ライブラリパッケージだけじゃなく、
Cabal とか便利なツールも最初からいくつか入ってるよ。
0375デフォルトの名無しさん
2009/12/24(木) 19:32:16インストールするにはGHCやCabalが必要となっているし。
0376デフォルトの名無しさん
2009/12/24(木) 19:42:02外出中にネットを利用できないときに、基本的なライブラリが既にインストールされているとコードのコンパイルに失敗しない場合がある。
0377デフォルトの名無しさん
2009/12/24(木) 20:24:53それで本当に必要になったときに現れるのでしょうか?
0378デフォルトの名無しさん
2009/12/24(木) 20:28:49遅延できるのは彼女の作り方にパラメータを入れて計算する作業だ
彼女の作り方が定義されていなければ必要な時に答えを出すことはできない
遅延評価は魔法ではない
0379デフォルトの名無しさん
2009/12/24(木) 20:51:31勝手に投機計算が始まっても困るのですが?
0380デフォルトの名無しさん
2009/12/24(木) 21:27:16きみの処理系はどのように実装されているんだ?
0381デフォルトの名無しさん
2009/12/24(木) 22:37:58どうすれば良いのですか?
黙殺してPlatformの更新を待てば良いのですか?
それともghcだけすげ替える事が可能なのですか?
0382デフォルトの名無しさん
2009/12/24(木) 23:08:38当たり前だが実行ファイルサイズは激減した
非標準パッケージはdyn.hiを同梱していないものが現状では多いので
今後に期待
0383デフォルトの名無しさん
2009/12/24(木) 23:18:37Platform使ってるの?あれって普及用だろ。インサイダーは個別にインストールが原則
0384デフォルトの名無しさん
2009/12/25(金) 00:09:130385デフォルトの名無しさん
2009/12/26(土) 00:07:02>今回のリリースから GHC は開発者向けのリリースになり、一般ユーザー向けのリリース
>は Haskell Platform で行われるよう変更されたので気をつけてください。
要するに自分でどうにか出来る奴だけが自己責任で使えってことだな。
0386デフォルトの名無しさん
2009/12/26(土) 21:17:436.12で日本語文字列を試す為に、文字数を数える簡単なプログラムを
#!/usr/bin/runhaskell を使って書いてみたら、速くなっているように感じた。
計ってみたら、
0.8s (6.10.4) -> 0.4s (6.12.1) と半減してたよ。
0387デフォルトの名無しさん
2009/12/27(日) 13:26:44そのデータ構造をあらわす構造体にコピーするのは簡単ですが、
Haskellではバイト列が与えられたとき、Haskell内部のデータ構造として扱うにはどうすればいいですか?
0388デフォルトの名無しさん
2009/12/27(日) 17:32:11データ型を定義して、ByteStringを入力とする関数を定義するしかないんじゃない?
強い型付けだから暗黙キャストは無理
0390デフォルトの名無しさん
2009/12/27(日) 20:08:20アクセスできませんが
0391デフォルトの名無しさん
2009/12/27(日) 20:50:19Cabal で com-1.2.3 をインストールしようとしたのですが、エラーが出ました。
Missing header file: include/WideStringSrc.h
Missing C libraries: kernel32, user32, ole32, oleaut32, advapi32
調べてみたところ、これらのファイルがあるパスを
config ファイルの extra-include-dirs と extra-lib-dirs の項に
書き込んでコメントを外せばいいのではないかと思いました。
しかし、kernel32.lib らのライブラリ ファイルはあるのですが、
WideStringSrc.h ファイルがストレージ内に見あたりません。
Windows7 sdk をフルインストールしているのですが、ありませんでした。
(インデックス作成機能を切った状態で、
エクスプローラでストレージ内に検索をかけて探しました)
このファイルはどこからかダウンロードしてくるのでしょうか。
0392デフォルトの名無しさん
2009/12/27(日) 20:59:470393デフォルトの名無しさん
2009/12/27(日) 21:32:02com-1.2.3.tar.gz を落としてきて中を見てみました。
たしかにありますね。
cabal\config ファイルに次の行を書いてみました。
extra-include-dirs: C:\Users\*名前*\Desktop\com-1.2.3.tar\com-1.2.3
extra-lib-dirs: C:\Program Files\Microsoft SDKs\Windows\v7.0\Lib
そして "cabal install com" を実行してみましたが、全く同じエラーが出ます。
kernel32.lib らも include/WideStringSrc.h も全てそのパスにあるのですが、
cabal は見てくれないのでしょうか。
0394デフォルトの名無しさん
2009/12/27(日) 22:05:09extra-lib-dirs に指定するパスを下記のものに変えてみましたが、
結果は同じでした。
C:\Program Files\Haskell Platform\2009.2.0.2\gcc-lib
0395デフォルトの名無しさん
2009/12/27(日) 23:30:35http://article.gmane.org/gmane.comp.lang.haskell.cafe/68204
cabal のオプションに -v3 とかつけると原因が分かると思う
0396デフォルトの名無しさん
2009/12/28(月) 01:05:02おかげさまで原因がわかり、ネット上の情報も参考にして、
無事インストールできました。
"cabal install com" でダウンロード+インストールはあきらめ、
com-1.2.3.tar.gz を展開して、その中で "cabal install" しました。
そのとき、com.cabal ファイルを2ヶ所修正しました。
[1つ目]
Ld-options: --enable-stdcall-fixup --disable-stdcall-fixup
これはコメントアウトしました。
同じフラグの enable と disable を同時にすることに意味はないと判断しました。
[2つ目]
Includes: の StdTypes.h を WideStringSrc.h の前に移動させました。
そういえばC言語のインクルードは順番が大事だったので。
1つ目の修正が何となく気持ち悪いですが、とりあえずインストールはできました。
これから実際に使ってみます。
0397デフォルトの名無しさん
2009/12/29(火) 20:51:14C言語で次のような定義の関数があるとします。
int mkData (int** ppData)
これは引数でポインタのポインタを取り、内部でメモリ領域をいくらか確保し、
その先頭アドレスを *ppData に入れてます。
そして、エラーコードを戻り値で示します。
このような関数を haskell から使いたい場合、
foreign import 宣言はどのように書いたらいいのでしょうか。
つまり、引数に値を入れて返してくるタイプの関数の呼び方です。
0398デフォルトの名無しさん
2009/12/29(火) 23:13:52import Foreign.Ptr
import Foreign.C.Types
foreign import ccall "mkData" mkData :: Ptr (Ptr CInt) -> IO CInt
0399デフォルトの名無しさん
2009/12/30(水) 00:59:36ありがとうございます。
コンパイルは通りました。
ただ、実行時にアクセス違反らしきエラーが出ます。
こちらの問題はもう少し自分で考えてみます。
0400デフォルトの名無しさん
2009/12/30(水) 03:24:56haskell 側でたとえば a = nullPtr :: Ptr CInt として a を定義し、
「これのポインタ」を mkData 関数に渡す必要があるのですよね。
この a のポインタはどのように得るのでしょうか。
もしかして全く見当外れでしょうか。
0401デフォルトの名無しさん
2009/12/30(水) 14:19:53import Foreign.Ptr
import Foreign.C.Types
import Foreign.Marshal.Alloc
import Foreign.Marshal.Array
import Foreign.Storable
foreign import ccall "mkData" mkData :: Ptr (Ptr CInt) -> IO CInt
makeData :: IO (Maybe [CInt])
makeData = alloca $ \ a -> do { num <- mkData a; if num < 0 then return Nothing else (peek a >>= peekArray (fromIntegral num) >>= return . Just) }
0402デフォルトの名無しさん
2009/12/30(水) 16:29:52ありがとうございました。
おかげさまで、mkData の引数を使って値を得ることができました。
ついでに確認なんですが、
C言語の方で malloc を使ってメモリ領域を確保しているのなら、
プロセス終了時に自動的に全て解放してくれると思います。
しかし、たとえば同じような方法で COM のインスタンスを得ている場合は、
最後の return . Just の前で COM を Release しておかないと、
参照カウンタがいつまでたっても減らずにメモリリークしますよね?
0403デフォルトの名無しさん
2009/12/30(水) 16:33:350404デフォルトの名無しさん
2009/12/30(水) 16:43:59あ、peek か peekArray の結果も一緒にタプルなんかでまとめて返せば、
後でいつでも解放はできますね。
Haskell のプログラムが終了する前に Release しておかないとダメですよね、
という確認です。
> どうしてそう思ったの?
いろんなプロセスで共有している COM は、
参照カウンタがゼロにならない限り、解放されない作りになっていると
学んだ記憶があるからです。
0405デフォルトの名無しさん
2010/01/01(金) 20:00:42どういった意味なのでしょうか。
具体的には、encoding-0.6.2 というパッケージの中に
次ようなのシグネチャの関数がありました。
System.IO.Encoding.print :: (Data.Encoding.Base.Encoding e, Show a, ?enc::e) => a IO
=> 以降に型変数 e が現れていないのも不思議です。
併せて教えていただけないでしょうか。
0406デフォルトの名無しさん
2010/01/01(金) 20:02:18おっと、間違えました。
System.IO.Encoding.print :: (Data.Encoding.Base.Encoding e, Show a, ?enc::e) => a -> IO ()
です。
0407デフォルトの名無しさん
2010/01/01(金) 20:43:00分かりました。
Implisit Parameter(暗黙パラメータ)なんですね。
使い方も理解できました。
一人で騒いですいませんでした。
0408デフォルトの名無しさん
2010/01/01(金) 20:44:23うぁぁ、Implicit Parameter でした。
ほんとすいません
0409デフォルトの名無しさん
2010/01/01(金) 22:28:40しようとしているのですが、GHC-6.10.4-i386.pkgのインストール中、
「インストールの種類」までいったところで右下の「インストール」ボタン
がグレーになってて押せず途方に暮れています。どうすればいいのでしょう?
0410デフォルトの名無しさん
2010/01/03(日) 13:58:32次のように複数個のメモリ領域を続けて確保したい場合、
もっと入れ子を減らして短縮できる書き方は無いでしょうか。
with (1::Int) (\pi -> do
with (2.0::Double) (\pd -> do
with ...
駄目もとで次のようにタプルにしてみましたが、
そのタプル自体(各要素ではなく)が Storable のインスタンスではないため、
peek の所でエラーになります。
当然、let の所でもエラーです。
with ((1::Int), (2.0::Double), ...) (\p -> do
(i, d, ...) <- peek p
let (pi, pd, ...) = p
複数個同時に確保できる関数を自作するしか無いでしょうか。
0411デフォルトの名無しさん
2010/01/03(日) 16:05:34($)を使うといいよ。それにdoも必要ない
with (1::Int) $ \pi ->
with (2.0::Double) $ \pd ->
with ...
0412デフォルトの名無しさん
2010/01/03(日) 17:23:49↓を参考にして((1::Int), (2.0::Double), ...)に相当する代数型を作ってStorableのインスタンスにしてやれば良いんじゃないかと。
http://www.unkar.org/read/pc12.2ch.net/tech/1231861873#l589
あと、3個組(x,y,z)までなら↓これを使えば良いのかも。
storable-tuple: Storable instance for pairs and triples: http://hackage.haskell.org/package/storable-tuple-0.0.1
0413デフォルトの名無しさん
2010/01/03(日) 17:28:53すいません、自分のプログラムをコピペしないで、
あたまで急いで考えたスニペットを深く考えずにそのまま載せてしまいました。
実際のプログラムでは ($) を使って、かつ do も無いです。
with の入れ子を減らすのに使えそうな関数を
標準ライブラリ内で色々探してみましたが無さそうです。
仕方なく自作しました。
with2 d1 d2 f = with d1 $ \pd1 ->
with d2 $ \pd2 ->
f pd1 pd2
withN は withN-1 を使って作りました。
0414デフォルトの名無しさん
2010/01/03(日) 17:31:00リロードし忘れました。
とりあえず自前ので問題は解決しましたが、
おもしろそうなので調べてみます。
0415デフォルトの名無しさん
2010/01/04(月) 15:51:57125 ページに、text、double、string の各関数は
Prettify モジュールに書くと言っています。
また、早めのコンパイルのために、とりあえず型と何もしない内容を書いた
スタブ(PrettyStub)モジュールを作るとも言っています。
にもかかわらず、次のページで早くも string 関数が
「PrettyJSON モジュール」に実装されています。
後の方のページをざっと見てみますと、text 関数や double 関数らは
ちゃんと Prettify モジュールで定義されているようです。
これは誤字の類なんでしょうか。
それとも何らかの意図があってそうしているのでしょうか。
誤字なら報告しておきたいのですが。
0416デフォルトの名無しさん
2010/01/05(火) 13:16:53index ページの Search: 欄に "const" を入れて [Search] ボタンを押しても、
"No results found, displaying all" と表示されます。
しかし、同じページでブラウザのページ内検索機能を使って
同じ文字列を検索すると、ちゃんとヒットします。
こういうものですか? それともインストール失敗?
0417デフォルトの名無しさん
2010/01/05(火) 22:40:59原文確認してみたら
ttp://book.realworldhaskell.org/read/writing-a-library-working-with-json-data.html
0418デフォルトの名無しさん
2010/01/05(火) 23:54:53原文とコメントを読んでみましたが、
Kevin の「何で string が PrettyJSON.hs にあるんだよ」的なコメントと、
gmaths の「俺もそう思う」的なコメントしか得られないんですけど・・・
結局、間違いなのか意図があるのか、分からないです。
なにか見落としてますでしょうか。
0419デフォルトの名無しさん
2010/01/06(水) 00:26:12ちょうど同じところで引っかかってた。
たぶんXcodeが入ってないか、正しくインストールできてない。
自分の場合は一応入ってたんだけど、AppleのDeveleper Centerから
最新のXcodeを落としてきて入れ直したら先に進めたよ。
0420デフォルトの名無しさん
2010/01/07(木) 05:47:040421デフォルトの名無しさん
2010/01/07(木) 06:33:46むしろlispじゃないか?簡単に実装できるし。
0422デフォルトの名無しさん
2010/01/07(木) 21:05:18それでした。Xcodeでかいので昨夜はダウンロードしかけて寝ちゃいましたが
今試してばっちりインストールできました。しょうがないのでvmware上の
ubuntsuで遊んでたんですが、メモリ2Gしかないとやっぱりきびしいので、
ネイティブで動くのは助かります。
0423デフォルトの名無しさん
2010/01/08(金) 13:28:46思ったことを直ぐ作れるかどうかはライブラリによるけど
0424デフォルトの名無しさん
2010/01/08(金) 20:05:500425デフォルトの名無しさん
2010/01/09(土) 17:39:02念のため言っておくが、>>423は私ではないし、私はブログを持っていない
0426デフォルトの名無しさん
2010/01/10(日) 13:59:110427デフォルトの名無しさん
2010/01/10(日) 21:21:360428デフォルトの名無しさん
2010/01/10(日) 23:59:370429デフォルトの名無しさん
2010/01/11(月) 01:14:24safeGetDirectoryContents path
| doseDirectoryExist path = getDirectoryContents path
| otherwise = return []
上のような関数作りたいのですけど、
existDirectory pathがIO Boolでどうしようもできん。
どう書いたらいいの?
0430デフォルトの名無しさん
2010/01/11(月) 01:37:12safeGetDirectoryContents path = do b <- doesDirectoryExist path
if b
then getDirectoryContents path
else return []
safeGetDirectoryContents path = catch (getDirectoryContents path) (const (return []))
0431デフォルトの名無しさん
2010/01/11(月) 05:35:48exist <- doesDirectoryExist path
ifM exist (liftM Just $ getDirectoryContents path) (return Nothing)
ifM True a _ = a
ifM False _ b = b
0432デフォルトの名無しさん
2010/01/11(月) 15:51:47>> 431
thanks!
なぜかガードにこだわってたのが敗因だわ。
0433デフォルトの名無しさん
2010/01/11(月) 23:58:54p.267 からの [11.2.1 テストデータを生成する] を読んでいますが、
ファイル構成からコンパイルの仕方まで、さっぱりです。
p.268 で Arbitrary クラスを自作してますが、
これは Test.Quicktest.Arbitrary ではなく「自作」なんですよね。
でも、Gen 型構成子は Test.Quicktest.Gen のものなんですよね。
すぐ下にある elements、choose、oneof の3関数は、
当然先ほど自作した Arbitrary クラスのものだと思います。
p.269 でさっそく Ternary 型を自作 Arbitrary クラスのインスタンスに定義し、
arbitrary 関数を定義していますが、elements 関数の定義は無いですよね。
自作 Arbitrary クラスにデフォルトの定義があるわけでもない。
どうやって実行するんですか。
それとも、これは「こういう使い方だよ」という単なる例示でしょうか。
しかし、Doc 型を自作 Arbitrary クラスのインスタンスに定義する時も、
oneof 関数を定義無しで使用しているにも関わらず、
今度は実際に ghci で実行を試していますが、どうやって?
0434デフォルトの名無しさん
2010/01/15(金) 01:06:21lispのstalinに相当する
処理速度が早いコンパイラはありませんか?
0435デフォルトの名無しさん
2010/01/15(金) 01:26:57http://mlton.org/
0436デフォルトの名無しさん
2010/01/15(金) 10:26:34生成されるコードの性能なら普及率とかまで考えたら今のとこGHC。
だいぶ前に論文ではもっと高性能だという話だったGRINってのがあって、
それを使ったコンパイラUHCというのがちょっと前のハカソンでリリースに
なってるようだ。
0437デフォルトの名無しさん
2010/01/15(金) 11:48:27名前変えろよボケ
GlasgowやめたんならGlasgow Haskell Compilerなんて名前は変えればいいのに。
0438デフォルトの名無しさん
2010/01/15(金) 11:57:320439デフォルトの名無しさん
2010/01/15(金) 13:09:16カチンとくる書き込みするなぁ。並列処理の記述に関しては
HaskellはGHCの足元にも及ばないよ。
0440デフォルトの名無しさん
2010/01/15(金) 14:07:09まずボクシングが思い浮かぶ俺もどうかと思うけどw
0441デフォルトの名無しさん
2010/01/15(金) 14:19:000442デフォルトの名無しさん
2010/01/15(金) 18:46:07プロレスだろ。ノアの至宝だ
0443デフォルトの名無しさん
2010/01/16(土) 01:45:30関数型言語であって、直列とか並列とかは言語レベルの問題ではない
0444デフォルトの名無しさん
2010/01/16(土) 11:40:53察してやれよ
0445デフォルトの名無しさん
2010/01/16(土) 12:12:580446デフォルトの名無しさん
2010/01/16(土) 12:27:010447デフォルトの名無しさん
2010/01/16(土) 12:33:43では質問するが、>>433 についてはどう思う?
君の見解が聞きたい。
他の者らは私の質問にちっとも相手してくれないんだ。
0448デフォルトの名無しさん
2010/01/16(土) 13:39:27提供: フリー百科事典『ウィキペディア(Wikipedia)』
GHC
ガーナの通貨単位セディをあらわす通貨コード(ISO 4217)
グローバル・オナード・クラウン - 日本のプロレス団体プロレスリング・ノアの管理する選手権
グローバル・ハードコア・クラウン - 同団体の秋山準がタイトル管理委員長を務めるハードコア王座
Guarded Horn Clauses - 並行論理型プログラミング言語
ガード付きホーン節 (Guarded Horn Clause)
Glasgow Haskell Compiler - プログラミング言語Haskellの主要なコンパイラ
このページは曖昧さ回避のためのページです。
一つの言葉や名前が二つ以上の意味や物に用いられている場合の水先案内のために、
異なる用法を一覧にしてあります。お探しの用語に一番近い記事を選んで下さい。
このページへリンクしているページを見つけたら、リンクを適切な項目に張り替えて下さい。
カテゴリ: 曖昧さ回避
0449デフォルトの名無しさん
2010/01/16(土) 13:40:36From Wikipedia, the free encyclopedia
GHC can stand for more than one thing:
Galway Hockey Club (in Galway, Ireland)
Geography History Civics
Georgia Highlands College (in Rome, Georgia)
Ghanaian cedi, the ISO 4217 code for the currency of Ghana
Glasgow Haskell Compiler
Global Hybrid Cooperation is a set of hybrid vehicle technologies jointly developed by General Motors and Daimler AG, with BMW joining in 2005.
Gorkha Hill Council in India
Grace Hopper Celebration, a conference for women in computing. The full name is the Grace Hopper Celebration of Women in Computing
Grays Harbor College (in Aberdeen, Washington)
Group Health Cooperative (in Seattle, Washington)
Guarded Horn Clauses (a concurrent logic programming language)
Guitar Hero Carabiner, a handheld portable gaming device
Glasgow Hardcore - hardcore music from the city of Glasgow, Scotland.
Global Honored Crown, the names of championships in the Japanese promotion Pro Wrestling Noah
This disambiguation page lists articles associated with the same title.
If an internal link led you here, you may wish to change the link to point directly to the intended article.
Categories: Disambiguation pages
0450デフォルトの名無しさん
2010/01/16(土) 13:57:280451デフォルトの名無しさん
2010/01/16(土) 16:15:310452デフォルトの名無しさん
2010/01/16(土) 22:27:42Supply モナドを乱数の発生源として利用する方法が書かれていますが、
このように Supply モナドを利用する意義が分かりません。
(もう少し言えば、この目的で State モナドを利用する意義)
評価するたびに違う乱数がほしいだけなら、次のようなものでもいいはず。
rand :: IO Int
rand = liftM fst (getStdRandom $ \g ->
let (a, b) = split g
in (random a, b))
あるいは、次ページにあるように Control.Arrow の first を使用して、
rand = fst `liftM` getStdRandom (first random . split)
でもいい。
Real World Haskell の解説において、
random ではなく、わざわざ randoms を使用して乱数リストを得るのは、
Supply モナドの利用方法を例示するために無理矢理そうしたとしか思えないのですが、
ちゃんとした意義はあるのでしょうか。
0453デフォルトの名無しさん
2010/01/16(土) 22:37:28IOを使わないためでしょう。確か本にはそう書かれていたはずです。
あやふやな私の記憶なので間違っていたらごめんなさい。
0454デフォルトの名無しさん
2010/01/16(土) 23:27:54改めて前のページを読み返してみたところ、
State モナドで乱数を得る仕組みや意義は分かりました。
しかし、Supply で乱数を得る意義は未だに分かりません。
P.360 で、C 言語の rand 関数に相当する関数の定義例が載っていました。
rand :: IO Int
rand = getStdRandom (randomR (0, maxBound))
その後で、今まで IO モナドをできるだけ使うなと言ってきたのに、
ちょっと乱数を生成するためだけに IO モナドに引き戻されるのは残念と言い、
State モナドで乱数を生成する例が載っています。
正確に言えば、IO モナドを伴う getStdRandom 関数の代わりに、
IO モナドを伴わない random 関数を使うのですが、
この関数は乱数生成器(RandomGen)を持ち回らなければならず、
そのために State モナドを利用するという話です。
これで、IO モナドを使わずに乱数を取得できる仕組みや意義は分かりました。
しかし、Suplly モナドを利用した乱数の取得では、
その心臓部で getStdRandom 関数を使用しています。
しっかりと IO モナドに捕らえられています。
IOを使わないためというのは理由にならないような気がします。
0455デフォルトの名無しさん
2010/01/16(土) 23:44:41Supplyを使うのは実装の隠蔽です。Supply型を使うことで、イテレータ的なインタフェースで乱数を取得できます。
後で型クラスを使った例が出てきます。
0456デフォルトの名無しさん
2010/01/17(日) 22:32:17もうにっちもさっちもブルドッグ状態
0457デフォルトの名無しさん
2010/01/17(日) 22:56:58最後に「ワォ!」をつけるとなお良い
0458デフォルトの名無しさん
2010/01/17(日) 22:57:180459デフォルトの名無しさん
2010/01/17(日) 23:01:110460デフォルトの名無しさん
2010/01/18(月) 02:41:53ますだおかだの岡田かと思った。
0461デフォルトの名無しさん
2010/01/20(水) 10:42:13にはどうしたらいいですかごはん
xcode と emacs 以外でシンタックスカラーで
コード読みたいです
0462デフォルトの名無しさん
2010/01/20(水) 13:04:550463デフォルトの名無しさん
2010/01/21(木) 15:32:240464デフォルトの名無しさん
2010/01/23(土) 19:50:01RTSオプションで -N1 より -N2 を指定して実行した方が圧倒的に遅い。
CPU のコア数は2個なのにも関わらず。
参考にしたのは [本物のプログラマはHaskellを使う] のページの
[第10回 Haskellで学ぶ並列プログラミング(その1)] のトピック。
http://itpro.nikkeibp.co.jp/article/COLUMN/20070501/269948/?ST=ittrend
記事の Parallel.hs ファイルと ParallelTest.hs ファイルをコピペした。
ghc -threaded --make ParallelTest.hs -cpp -O でコンパイルし、
ParallelTest +RTS -N1 と ParallelTest +RTS -N2 でテストしてみた。
-N1 の方は 2.5 秒程度、-N2 の方は 10 秒程度で処理が完了した。
どちらも目覚まし時計の秒針を見て比べたので正確ではないが、
これだけ差が開けば多少の誤差はどうでもいいと思う。
それより -N2 の方が遅いのが納得いかない。
何が原因なんだろう。
[環境]
GHC : version 6.10.4
CPU : Intel(R) Core(TM)2 Duo CPU P8600 (2.40GHz)
メモリ : 2.0GB
0465デフォルトの名無しさん
2010/01/23(土) 20:05:56環境を一つ書き忘れました。
OS : Windows 7 HomePremium
0466デフォルトの名無しさん
2010/01/23(土) 23:53:020467デフォルトの名無しさん
2010/01/23(土) 23:56:00そりゃ答えになってないでしょ。
俺も同じ問題にぶち当たったから真相が知りたい。
0468デフォルトの名無しさん
2010/01/24(日) 00:01:39試してないけど、GHCは6.12.1で並列性能がずいぶん向上したと言ってる
最新版でも-N2で遅くなるなら、GHCの開発者に報告したら喜ばれると思う
0469デフォルトの名無しさん
2010/01/24(日) 00:20:56http://book.realworldhaskell.org/read/concurrent-and-multicore-programming.html#id675076
0470デフォルトの名無しさん
2010/01/24(日) 06:21:46> (1+2):(3+4):[]という値を考えましょう。seqをこの式に適用すると、
> サンク(1+2)は評価されます。最初の(:)構成子に到達したところで止まりますので、
> 2つ目のサンクには影響を与えません。
とありますが、(:)構成子の中に(1+2)と(3+4):[]があるわけで、サンク(1+2)は評価されないはずですよね。
let x = undefined:[] in x `seq` 2
としてもエラーにならないし。
0471デフォルトの名無しさん
2010/01/24(日) 09:12:11同じコードを同バージョンGHCでFedora12でやってみたけど、同じ状況ですね。
並列プログラミングと銘打ちながら、「並列化のための…多くの機能がまだ実装されていません」と言うw
0472デフォルトの名無しさん
2010/01/24(日) 14:16:27興味深い記事を紹介してくれたのはありがたいのだが、
その意図が全く分からない。
記事を読めばその理由が分かるのか、
それとも記事の通りにすれば -N2 の方が速くなるのか。
その記事の parSort2 関数を使い、閾値を色々変えて実験してみたが、
どれも -N1 より -N2 の方が圧倒的に遅かった。
記事には、デュアルコアでは 25% スピードアップすると書かれているが、
どうやったらそうなるのか知りたい。
ちなみに、>>469 の環境ではどうだったのかも教えてくれないだろうか。
0473デフォルトの名無しさん
2010/01/24(日) 16:45:31>>469 のページは、このスレで何度か話がか出ている「Real World Haskell」の英語版なんで、
英語が苦手なら日本語版の書籍に頼ればいいと思う。
なんとなくだが、>>464 は、[0..10000]のようなソート済みのリストをソートしようとしている気がする。
>>469 にある SortMain.hs を計測に使えば、-N1 より -N2 の方が圧倒的に遅いなんてことはないと思う。
少なくとも、こちらで試した感じでは、"parSort2 2"で要素数700000のリストのソートが -N1 と -N2 で同程度の時間だった。
0474デフォルトの名無しさん
2010/01/24(日) 20:00:35いや、>>464 が紹介してくれた英語は問題なく読めた。
言葉が少なくて誤解を与えたが、parSort2 関数を使って実験したというのは、
あの記事に載っている SortMain.hs ももちろん使っての話。
あの記事に載っている sort 関数と parSort2 2 関数で試してみた。
どちらも "ghc -threaded -O2 --make SortMain" でコンパイルし、
意味は無さそうだが sort の方でも -N1 と -N2 で実験してみた。
リストの要素数は 200000 だ(700000 では -N2 で固まる)。
下記は4パターンそれぞれを5回試した時の処理時間の平均値だ。
(小数点第2位で四捨五入した)
ちなみに、タスクマネージャで目測した2つのCPUの使用率において、
片方を1とした場合の2つの割合を CPU 1:y と記した。
sort -N1 [1.0s] [CPU 1:0.5] / -N2 [20.6s] [CPU 1:0.8]
parSort2 2 -N1 [1.0s] [CPU 1:0.3] / -N2 [20.8s] [CPU 1:0.7]
-N2 の方は何故かどちらも4秒程度で完了したり、
10秒程度で完了したりした時もあり、あまり安定しない。
そういうものは平均値の測定から省いた。
本当は20回くらい実験しているが、その中の比較的安定している5回の平均だ。
まったくもって、さっぱりだ。
原因が何処にありそうなのかも見当がつかない。
> 少なくとも、こちらで試した感じでは、"parSort2 2"で要素数700000のリストのソートが -N1 と -N2 で同程度の時間だった。
同程度ではまずいのではないか?
0475デフォルトの名無しさん
2010/01/24(日) 21:38:59> sort -N1 [1.0s] [CPU 1:0.5] / -N2 [20.6s] [CPU 1:0.8]
> parSort2 2 -N1 [1.0s] [CPU 1:0.3] / -N2 [20.8s] [CPU 1:0.7]
sort でも paraSort2 でも -N2 を指定した時の速度が変わらないとなると、並列GCのせいじゃないかね?
たしか、6.10から並列GCが導入されて、-N で指定した数のプロセッサをGCに使うようになったらしいし。
↓の"-gthreads"の説明にいろいろ書いてあるから試してみたら?
http://www.haskell.org/ghc/docs/6.10.4/html/users_guide/runtime-control.html
あと、こっちの環境(書くの忘れてたが Mac OS X)では、-N1 と -N2 とでこんなに差が出ないので、
Windows 版特有の問題もあるんじゃないかね?
> 同程度ではまずいのではないか?
まずいとは思うが、>>469 のGHCのバージョンが6.8なので、バージョンが違うせいだと思い放置した。
上の結果のようなあからさまな差はない、ということだけ伝えたかった。
0476デフォルトの名無しさん
2010/01/25(月) 20:38:21以下が parSort2 2 を3つのパターンで実験してみた結果だ。
パターン番号 : 指定オプション : 処理時間
1 : -g1 -N1 : 1.0s
2 : -g1 -N2 : 20.0s
3 : -g2 -N2 : 20.0s
-N2 においては、-g1 でも -g2 でも処理時間的にはほとんど違いはなかった。
十数回程度の繰り返したが、結果は変わらず。
次レスに、-S オプションをつけて出力された統計データの一部の概略を示す。
0477デフォルトの名無しさん
2010/01/25(月) 20:40:59下記が -S オプションをつけて出力された統計データ(の一部の概略)だ。
--------------------
パターン 1 では、Alloc bytes は最初から最後まで
520424 〜 524288 でほぼ一定だった(最後だけガクっと落ちるが)。
Copied bytes の前半は 180000 付近でほぼ一定、後半から 20000 〜 330000 付近で波を繰り返す。
たまに 7300000 付近までスパイク状に跳ね上がる時があるが、その時は第2世代までGCしている。
それ以外の時は第1世代までのGCで済んでる。
Live bytes は 184680 で始まって前半は上昇し、しばらく波を緩やかに繰り返した後、下降する。
--------------------
パターン 2 の Alloc bytes の前半はパターン 1 と同じ傾向だが、
後半から 600000 〜 1000000 付近で波繰り返してる。
Copied bytes の形状はパターン 1 と似ているが、上限が倍近くに上がっている。
スパイク状になるのはパターン 1 と同じ。
Live bytes も形状はパターン 1 と似てるが、上限が 150000000 付近まで上がる。
--------------------
パターン 3 の Alloc bytes はパターン 2 とほぼ同じ。
若干、波が穏やかなような気がする。
Copied bytes もパターン 2 とほぼ同で、スパイク状になるのも同じ。
Live bytes はパターン 1 や 2 と違い、細かな上下はするが、最後まで上昇が続く。
ただし、上限(最後付近)は 134000000 付近で、パターン 2 よりは若干低い。
--------------------
パターン 1 が他の2つと明らかに傾向が違うのは、Alloc bytes がほぼ一定である事。
私は GC の仕組みをよく理解していなく、ここから有益な情報を得ることができないのだが、
処理時間が大幅にかかる原因と思われるものは何か分かるだろうか。
0478デフォルトの名無しさん
2010/01/25(月) 21:59:46そんなもんわからん。
> 2 : -g1 -N2 : 20.0s
> 3 : -g2 -N2 : 20.0s
これの時間が変わらん時点で並列GCのせいという予想が誤りだとわかる。
念のため、Windows XP Professional、GHC 6.10.4 で試してみたが、
"parSort2 2"で要素数700000のリストのソートが -N1 と -N2 で同程度の時間だった。
(CPU: Core2Duo 2.83GHz、メモリ: 4GB)
これで、Windows版固有の問題というのも間違いだということがわかる。
あとは正直、そちらのコードにミスがある可能性ぐらいしか思いつかない。
(疑うようで悪いが、万が一ということもあるので)
試しに、以下のコンパイルオプションでビルド・実行して、
SortMain.prof に parSort2 が含まれているか確認してもらえないだろうか。
ghc -prof -auto-all --make SortMain.hs
SortMain +RTS -p -RTS 200000
あと念のため確認だが、sort 関数は >>469 のページからとってきたものを
そのまま使用しているだろうか。
0479デフォルトの名無しさん
2010/01/25(月) 23:57:54> そんなもんわからん。
何か気に障ることを言ってしまっただろうか。
であれば、すまん。
もっとすまないのは、最初は素直にコピペしてきたのだが、
関数名をわかりやすくするために変更している時に、
触ってはいけない部分まで変えてしまっていた。
もう一度コピペし直してきたら、貴殿のように -N1 と -N2 で「似たような」結果になった。
お騒がせして本当に申し訳ない。
ただ、やはり -N2 の方が遅い。
例えば parSort2 2 で、リスト数 300000 で実行すると、
-N1 で 1.51s、-N2 で 1.57s、-g1 -N2 で 1.82s。
parSort2 n の n を増やせば増やすほど -N1 と -N2 の差が開く。
逆転したことが一度もない。
もう少し落ち着いて、自分で調べてみる。
つきあってくれてありがとう、申し訳なかった。
0480デフォルトの名無しさん
2010/01/26(火) 01:31:52まず、前提として、>>464 が遅い理由は、>>469 を読めば理解できると思っている。
parSort2 が遅いことが理解を妨げていると思ってここまで付き合ってきたが、
それが解消しても理解が進んでないと思われることが悔しい。
>>468 によると、GHC 6.12.1 で並列性能が上がったらしいが、
それを逆に考えると、それ以前のバージョンは並列性能がそれほど期待できないということになる。
そのようなバージョンで高速化できないことに拘泥するのは無意味だと気づいて欲しい。
これ以上スレを汚すのは申し訳ないので、ここで消える。
スレを私物化する形になってしまい、申し訳なかった。
0481デフォルトの名無しさん
2010/01/26(火) 19:31:53> そのようなバージョンで高速化できない ことに拘泥するのは無意味だと気づいて 欲しい
他にも興味深いトピックがあったから日本語版を買ってみたが、
翻訳者はバージョン6.10.4で動作を検証してるそうじゃないか。
であれば、このバージョンでの25%の速度向上も確認してるはず。
数%しか向上しないのなら環境の違いで納得できるが、
-N2の方が遅いというのは、やはり何処かに問題があると考える方が自然ではないか。
0482デフォルトの名無しさん
2010/01/28(木) 13:42:40上手くいかない。良かったら教えてください。
0483デフォルトの名無しさん
2010/01/28(木) 15:27:34アホすぎ。死ね
0484デフォルトの名無しさん
2010/01/28(木) 16:25:380485デフォルトの名無しさん
2010/01/28(木) 19:47:00ヒントを与えるのやめろよ
自立しないだろ
0486デフォルトの名無しさん
2010/01/28(木) 21:36:430487デフォルトの名無しさん
2010/01/29(金) 02:17:36ネタにマジレスは注意信号です、気軽にお近くの(ry
0488デフォルトの名無しさん
2010/01/29(金) 09:01:250489デフォルトの名無しさん
2010/01/29(金) 15:20:380490デフォルトの名無しさん
2010/01/29(金) 16:03:36すみません、
zip,unzipのプログラムを書こうとするとなぜアホということになるのですか?
0491デフォルトの名無しさん
2010/01/29(金) 18:14:500492デフォルトの名無しさん
2010/01/29(金) 18:14:55なに、近々バージョンアップする予定なの?
0493デフォルトの名無しさん
2010/01/29(金) 18:18:05うまくいかないのがアホ。
0494デフォルトの名無しさん
2010/01/29(金) 18:28:27Haskellってやはり凄いんですね。zipやunzipの関数を書くのは
結構難しい課題だと思い込んでいました。
0495デフォルトの名無しさん
2010/01/29(金) 19:19:150496デフォルトの名無しさん
2010/01/29(金) 19:37:07それは Haskell というより関数型言語に慣れてないだけだと思うよ
0497デフォルトの名無しさん
2010/01/29(金) 19:51:21そういう(zip、unzip自作の基になる)基礎知識は
ここで中途半端に得るより、本を一冊買ってじっくり学んだ方がいい。
「Haskell: The Craft of Functional Programming」を薦める。
0498デフォルトの名無しさん
2010/01/29(金) 19:59:56idとかを組み合わせて。
途中に名前を使う関数(\x -> (x,x))等を使用するのは無しで。
0499デフォルトの名無しさん
2010/01/29(金) 20:15:52少々汚いやり方だがこんなのはどうだ?
まあPreludeの関数がパターンマッチングを使っているから美学的な意味しかないが
import Control.Arrow (first ,second)
makeTuple = second head . first head . splitAt 1 . repeat
main = print . makeTuple $ "You can do it!"
0500デフォルトの名無しさん
2010/01/29(金) 20:36:00なるほど目から鱗だわありがと。
first f = \(x,y) -> (f x, y)
だからsplitAtしちゃえばいけるな。
0501デフォルトの名無しさん
2010/01/29(金) 21:15:540502デフォルトの名無しさん
2010/01/29(金) 21:23:39そのほうがいいな
0503デフォルトの名無しさん
2010/01/29(金) 21:28:05ありがと。
Arrow人気すぎワロタ
0504デフォルトの名無しさん
2010/01/29(金) 21:37:050505デフォルトの名無しさん
2010/01/30(土) 09:30:370506デフォルトの名無しさん
2010/01/31(日) 05:08:57同じくmac portsのghcが壊れてて入らない
darcs使いたいだけなのになんでこんなに苦労するんだろう
0507デフォルトの名無しさん
2010/01/31(日) 08:22:36私もHaskell勉強中だが触発されてzip関数書いて見たら
普通に出来たけど?
パターンを網羅してないのかも
ソースコードは自立してもらう為非公開が良いのかな
次はunzipに挑戦だ!
0508デフォルトの名無しさん
2010/01/31(日) 13:08:33myunzip [] = ([],[])
myunzip ((x,y):ns) = ((x:(fst (myunzip ns))), (y:(snd (myunzip ns))))
最初 fst snd使ってなくて型が違うと怒られた
もっとこうするとスマートに再帰で書けるとか有ったら教えてください
0509デフォルトの名無しさん
2010/01/31(日) 13:23:030510デフォルトの名無しさん
2010/01/31(日) 14:29:39どうどす?
0511デフォルトの名無しさん
2010/01/31(日) 15:11:520512デフォルトの名無しさん
2010/01/31(日) 15:37:57勉強になりました
ありがとう御座いました!!
とくに510は再帰と言うのにも拘ってスマートに書かれてて感動です
511もまだ知らない演算子(***)が使われてて勉強になりました
0513デフォルトの名無しさん
2010/01/31(日) 20:19:42http://www.haskell.org/ghc/download_ghc_6_12_1.html#macosxintel
今は、バイナリをインストールするか
ソースコードからビルドするしかないんじゃないかな
0514デフォルトの名無しさん
2010/01/31(日) 20:40:400515デフォルトの名無しさん
2010/01/31(日) 20:43:550516デフォルトの名無しさん
2010/01/31(日) 21:24:25片方を1要素分横にずらして和を取りたいです。
たとえば [1, 2, 3] と [7, 8, 9] であれば
[1, 2, 3, 0] と [0, 7, 8, 9] の和です。
今は定義を素直に実装して次のようにやってます。
shearAdd :: (Num a) => [a] -> [a] -> [a]
shearAdd as bs = zipWith (+) (as ++ [0]) (0 : bs)
もっと洗練された方法はあるでしょうか。
たとえば (++) 演算子は左辺のリストの要素数が大きいと不利なので、
これを改善できるとか。
0517デフォルトの名無しさん
2010/01/31(日) 21:36:570518デフォルトの名無しさん
2010/01/31(日) 22:21:450519デフォルトの名無しさん
2010/01/31(日) 22:24:37その定義でも遅延評価のおかげで非効率にならないと思う。
0520デフォルトの名無しさん
2010/01/31(日) 23:03:48あ、なるほど。
zipWith 関数でリストの分解->再構築が行われる時、
(as ++ [0]) の「先頭から順に」要素を取ってくるから、
++ 演算子によるリストの分解->再構築は処理されませんね。
盲点でした。
ありがとうございました。
0521デフォルトの名無しさん
2010/01/31(日) 23:47:31zipWithと(++)はどちらもfoldrで書ける関数だから
最適化がかかって一つの再帰関数の置き換えられると期待。
そのままで大丈夫だと思う。
遅延評価のおかげではなく、最適化のおかげで非効率にならない。
見た目通りに処理されるなら
(as ++ [0]) の先頭要素を取ってくるときに
毎回 (x:xs ++ [0]) -> x:(xs ++ [0]) というパターンマッチが入るから、
結局リストの分解・再構築の分の処理はされちゃうよ。
0522デフォルトの名無しさん
2010/02/01(月) 00:23:30次にzipWithを評価するというような、二度手間のリスト走査には
ならないという意味だったんだ。
GHCではzipWithはbuildを使うようになっているから、最適化も
されるんだろう。
0523519
2010/02/01(月) 00:24:360524デフォルトの名無しさん
2010/02/04(木) 19:58:580525デフォルトの名無しさん
2010/02/04(木) 22:27:50次の cat プログラムの例が載っているのですが、
main = do cs <- getContents
putStr cs
これを実行すると、標準入力への入力が出力されるのですが、
これが何度も繰り返される仕組みがよくわかりません。
% ./cat
aaa # 入力
aaa # 出力、入力待ち
bbb # 入力
bbb # 出力、入力待ち
...
本には遅延評価って説明がありましたが、
ループが無いのに何度も入力/出力されるのが不思議です。
なぜこうなるんでしょう?
0526デフォルトの名無しさん
2010/02/04(木) 22:36:12本の説明で理解できないなら、それ以上にわかりやすく説明するのは難しいな。
データフロー言語的な考え方が出来れば疑問に感じることはないと思うんだが…
0527デフォルトの名無しさん
2010/02/04(木) 23:11:55>ループが無いのに何度も入力/出力されるのが不思議です。
ループはputStrの実装の中にある
getContentsアクションは標準入力の内容を一切読まずに、未評価の文字列を返す
putStrは、その文字列の中身を先頭から調べて、順番に表示していく
文字列の中身を調べる(つまり評価する)ときに初めて、標準入力からの読み込みが必要に応じて発生する
論理的にはユーザが一文字入力するたびにputStrが一文字出力するような動作と考えてもいい
実際はOSの行バッファが間に入るから、一行入力するたびに一行出力、になってる
あと、getContentsみたいな遅延IOはHaskellの振る舞いとしてはかなり例外的なものだから、
初心者ならあまり気にしないで先に進んでいいと思うs
0528デフォルトの名無しさん
2010/02/05(金) 15:03:14cs は遅延評価されるから、
getContents - プロミスだけ渡すお
↓
putStr - プロミス評価するよー
↓
getContents - まだ入力ないから評価できないお
↓
getContents - 入力あったから、あった分だけ評価するお
↓
putStr - 評価きたから表示したよ。でも、まだ続きが評価できないよー
↓
getContents - まだ入力ないから(r
↓
getContents - 入力あったから(r
↓
putStr - 評価きたから(r まだ続きが(r
↓
・
・
・
無限ループ
0529デフォルトの名無しさん
2010/02/06(土) 12:17:21一方、標準入力は事実上の無限リスト
putStrは続きの要素が表示できるようになったら表示してるだけ
0530デフォルトの名無しさん
2010/02/06(土) 15:49:46その演算を頻繁に使うので効率性を高めたいが、
同時にプログラムの堅牢性も可能な限り高めたい。
たとえば2次元ベクトルをたまたま2要素のタプルで表現し、
その上の演算として加算 add を定義するとする。
データ構造と演算の間に抽象の壁を設けずにプログラムするとこうなる。
newtype Vec2 a = Vec2 (a, a)
(Vec2 x0, y0) `add` (Vec2 x1, y1) = Vec2 (x0+x1, y0+y1)
抽象の壁を設けて堅牢性を高めるとこうなる。
newtype Vec2 a = Vec2 (a, a)
newVec2 x y = Vec2 (x, y)
getX (Vec2 x, _) = x; getY (Vec2 _, y) = y
v0 `add` v1 = newVec2 (getX v0 + getX v1) (getY v0 + getY v1)
前者の場合、add のパターンマッチでデータ構造を2回分解し、
右辺で1回再構築して演算している。
後者の場合、4回分解して1回再構築している。
データ構造によってはもっと差が開く場合もありうる。
当然前者の方が効率はいいだろうが、演算の数が多く、
もっと良いデータ表現方法があればデータ構造を変えたい場合もあるので、
後者の堅牢性もほしい。
前者の効率性を重視しながら後者の堅牢性に近づける方法、あるいは
後者の堅牢性を重視しながら前者の効率性に近づける方法はないだろうか。
もしかしたら、データ構造に依るところが大きく、
一般的に解決する方法はないのだろうか。
0531デフォルトの名無しさん
2010/02/06(土) 16:11:010532デフォルトの名無しさん
2010/02/06(土) 16:22:15単純すぎて、どう堅牢性が上がっているのかも分からないし、
コンパイラが十分賢ければ、同じコードがでるんでは、という気が。
あと後者のほうは、
newVec2 x y = (x, y)
getX = fst
getY = snd
v0 `add` v1 = newVec2 (getX v0 + getX v1) (getY v0 + getY v1)
で十分だよね。
0533デフォルトの名無しさん
2010/02/06(土) 16:39:00> 単純すぎて、どう堅牢性が上がっているのかも分からないし、
それは申し訳ない。
後者は、抽象データ構造にしてモジュールを分ければ、
プログラムの堅牢性が高まる。
module Vector (Vec2, newVec2, getX, getY) where
newtype Vec2 a = Vec2 (a, a)
newVec2 x y = Vec2 (x, y)
getX (Vec2 x, _) = x; getY (Vec2 _, y) = y
---
module Operation where
import Vector
v0 `add` v1 = newVec2 (getX v0 + getX v1) (getY v0 + getY v1)
とすれば、たとえば何らかの理由で2元ベクトルの表現方法を
2要素のタプルから2要素のリストに変えることになっても、
Vector モジュールの定義だけを変えるだけでよく、
Operation モジュールの定義には影響を与えない。
つまり、add の定義はそのまま使える。
これを私は「堅牢性が高い」と表現している。
>>530 の前者のように抽象の壁を設けないと、
データ構造の表現を変えた場合に、
そのデータ構造上の全ての演算の定義を変えなければならない。
0534デフォルトの名無しさん
2010/02/06(土) 17:04:31>> 530 の後者でも最適化でほぼ同等の効率性を維持できると期待したいが、
「最適化で同じコードが出力された事を確かめる術」はあるのだろうか。
今はコンパイラとして GHC を使っているので
GHC のドキュメントをいろいろ眺めている最中なのだが、
この辺りの最適化の仕組みがあるのかどうかもまだ分からない状態だ。
0535デフォルトの名無しさん
2010/02/06(土) 19:47:040536デフォルトの名無しさん
2010/02/06(土) 20:30:41やっぱり、結局はそうなるのか。
いや、ダメってわけじゃないし、当然実際に測って比較はする。
誠にごもっともなんだが・・・
何というか、もっと理詰めで論理的に推論したいなぁと思う。
こういう最適化の仕組みがあって、今回この部分にこのような適用できるから、
このように最適化されることが期待できる、みたいな。
0537デフォルトの名無しさん
2010/02/06(土) 20:34:06GHCのソースでも読むしかないんじゃね?
0538デフォルトの名無しさん
2010/02/06(土) 20:38:50どのように実装しているかの議論は軽く本一冊にはなるしね
0539デフォルトの名無しさん
2010/02/06(土) 20:42:27関数型に限った話じゃないけど
0540デフォルトの名無しさん
2010/02/06(土) 20:47:08人が読むのはつらいかもしれんが、小規模なものならなんとかなるだろ。
0541デフォルトの名無しさん
2010/02/06(土) 21:00:570542デフォルトの名無しさん
2010/02/06(土) 21:04:37なんだか話がちょっと飛躍しそうなんで戻す。
そもそもの質問はどのように最適化されるかではなくて、
>>530 の最後の方の文をくりかえすと、
> 前者の効率性を重視しながら後者の堅牢性に近づける方法、あるいは
> 後者の堅牢性を重視しながら前者の効率性に近づける方法はないだろうか。
なんだが、答えは「無い ==> 最適化を期待しろ」 という理解でいいんだろうか。
この答えがまだ得られていない。
この理解が正しいと確定してから、GHC のソースを読むなり、
C 言語に変換するなりして最適化の仕組みを調べる作業に入りたい。
やはり、安易に最適化に期待するよりは、
プログラムで何とかするよう努力したほうがいいような気がする。
0543デフォルトの名無しさん
2010/02/06(土) 21:07:10というのがたぶん530の言いたい「堅牢化」であって、実現によって効率に差があることとは別の話だろう。
で、その点で>>530は「堅牢化」の利点がない。
0544デフォルトの名無しさん
2010/02/06(土) 21:11:23足し算に期待する制約を表現すべきであって、それだとほんとに壁を作っただけになってないか?
0545デフォルトの名無しさん
2010/02/06(土) 21:28:31本質的に同じフローであれば同じになる。 少なくともそれを目指しているはず。
小手先のテクニックで変形しても処理系のフロー解析を邪魔するだけになるのがオチだよ。
オーダーが変わらない範囲での変形はあまり意味がない。
自分の脳味噌が処理系以上の解析能力がある自信があるかい?
0546デフォルトの名無しさん
2010/02/06(土) 21:49:34違う。
プログラムの局所的な変化が他の広い部分に影響を及ぼさないとき、
私はそれを「堅牢性が高い」状態と言う、と >>533 で伝えたつもり。
あなたと同じ事を言っているのであれば申し訳ない。
私の理解力がまだ足りないせいだ。
0547デフォルトの名無しさん
2010/02/06(土) 21:50:580548デフォルトの名無しさん
2010/02/06(土) 21:52:28> 本質的に同じフローであれば同じになる
この場合の「フロー」とは何だろうか、詳しく訊きたい。
私が示した例の場合に限れば、同じフローだということだろうか。
0549デフォルトの名無しさん
2010/02/06(土) 22:01:18言っている意味がよく分からないし、笑われている意味はもっと分からない。
壁を作っただけになってないかと言うが、
壁を作ることそのものに意味があるのではないだろうか。
(もちろん、その壁で仕切った高レベル側の関数を使わないと意味が無いが)
私が示した「例」に限ったとしても、
もしベクトルを配列で表現することに変えたとしたらどうなるか。
抽象の壁を設けないと、add に代表される「そのデータ構造上の関数」は、
データ構造の構造に依存しているため、「全て」書き直しになる。
0550デフォルトの名無しさん
2010/02/06(土) 22:46:18newtype Vec2 a = Vec2 {toTuple: (a, a)}
v1 `add` v2 = Vec2 (x0+x1, y0+y1)
where
(x0, y0) = toTuple v1
(x1, y1) = toTuple v2
Vec2の定義を変えた場合はtoTupleの定義を変える。
0551550
2010/02/06(土) 23:01:17・(>>550のように)タプルやリストなどの単純なデータ構造に変換する関数を定義し、アプリケーション側ではそちらを使う
・例えばfmap, fold, traverseなどや、データの(論理的な)構造に合わせてデータを走査する高階関数を定義し、(ry
・Zipperを定義し、(ry
0552デフォルトの名無しさん
2010/02/06(土) 23:14:43getX や getY などのようにデータ構築に使う材料をひとつずつ得るのではなく、
タプルやリストなどの形で「一度に全部」得ることで余計なパターンマッチを防ぐ
ということだと理解したが、合ってる?
うまくいきそうな気がするので検討してみる。
0553デフォルトの名無しさん
2010/02/06(土) 23:25:48して完璧で太郎!!!
位置かこちらへ向こう岸だろ。
いいかげんカンペ見たらええのに。
0554デフォルトの名無しさん
2010/02/07(日) 04:46:310555デフォルトの名無しさん
2010/02/07(日) 05:11:500556デフォルトの名無しさん
2010/02/07(日) 10:22:32コンパイルオプションで、C経由でコンパイルを指定すればできるけど、
相当小さなソースからでも、普通は読めたもんじゃないシロモノが出てくるよ。
0557デフォルトの名無しさん
2010/02/07(日) 12:32:43>>550 の取得系関数をタプルで一度に得るようにする方法 [3]、
併せて3つの方法で処理速度を測ってみた。
意外な結果が出て戸惑っている。
[実験方法]
ランダムな値の2次元ベクトルを 500000 個作ってリストにする。
そのリストに対して foldl1' add で総和を計算して結果を表示する {*}。
この処理 {*} の前後に Data.Time.Clock.getCurrentTime を置いて時間の差を測る。
同じ実験を3回行って平均を出す。
GHC 6.10.4 で -O2 オプションのみを付けてコンパイルした。
また、[1] や [3] にも取得関数 newVec2 を3者同じ形で作り、
それぞれの add 関数の右辺で使った。
つまり、それぞれの add 関数において、newVec2 に渡す2つの引数の
作り方による処理時間の差だけを計った(つもり)。
[結果]
[1] : 17.3s
[2] : 10.2s
[3] : 10.2s
処理速度だけなら抽象の壁を設けない [1] が最も速いだろうと思っていたが、
意外にも他の2つより1.5倍以上遅かった。
[1] において newtype Vec2 a = Vec2 (a, a) ではなく type Vec2 a = (a, a) のように
データ構築子を作らずにやっても同じ 17 秒だった。
どうしてこうなるのか、今のところ推論できずにいる。
CソースやCore言語なるものを出力して調べるしかないんだろうか。
0558デフォルトの名無しさん
2010/02/07(日) 15:44:21ttp://mitpress.mit.edu/sicp/full-text/book/book-Z-H-14.html#%_sec_2.1
実際のデータがどのように実装されているかに関わらず、
データを生成する関数、各要素にアクセスする関数さえ定義できれば
それよりも「高度な」関数(2次元ベクトルだったらaddとかmulとか)は
アクセッサ、生成子を用いて定義できるっていう話で合ってるよね?
>>557
ソース見せて欲しいです。メモリの使用率はどれが良かった?
一応、Wikiにこんなページがあることを。
http://www.haskell.org/haskellwiki/Performance
0559デフォルトの名無しさん
2010/02/07(日) 16:17:440560デフォルトの名無しさん
2010/02/07(日) 16:31:38それのこと。
なるほど、メモリの使用率は考慮してなかった。
これから解析してみる。
が、その前に実験に使ったソースをさらす。
"Real World Haskell" に載ってた処理時間を測るプログラムをほぼそのまま流用した。
http://book.realworldhaskell.org/read/concurrent-and-multicore-programming.html#id675679
モジュールは2次元ベクトル型とその演算を定義する Vec.hs と、
処理時間を計るメインの Test.hs に分けた。
文字数を減らすために型宣言やコマンドライン引数のエラーチェックは省いた。
行間も詰めたので見にくいが、コピペすればそのまま動くはず。
以下、ソースを載せるために立て続けにレスするがご諒承願う。
0561デフォルトの名無しさん
2010/02/07(日) 16:32:45newtype Vec2_1 a = Vec2_1 (a, a)
newVec2_1 x y = Vec2_1 (x, y)
(Vec2_1 (x1, y1)) `add1` (Vec2_1 (x2, y2)) = newVec2_1 (x1 + x2) (y1 + y2)
instance (Show a) => Show (Vec2_1 a) where
show (Vec2_1 (x, y)) = '[' : show x ++ ", " ++ show y ++ "]"
----------------------------------------------------------------------
newtype Vec2_2 a = Vec2_2 (a, a)
newVec2_2 x y = Vec2_2 (x, y)
getX (Vec2_2 (x, _)) = x
getY (Vec2_2 (_, y)) = y
v1 `add2` v2 = newVec2_2 (getX v1 + getX v2) (getY v1 + getY v2)
instance (Show a) => Show (Vec2_2 a) where
show v = '[' : (show . getX) v ++ ", " ++ (show . getY) v ++ "]"
----------------------------------------------------------------------
newtype Vec2_3 a = Vec2_3 {getV :: (a, a)}
newVec2_3 x y = Vec2_3 (x, y)
v1 `add3` v2 = newVec2_3 (x1 + x2) (y1 + y2)
where (x1, y1) = getV v1
(x2, y2) = getV v2
instance (Show a) => Show (Vec2_3 a) where
show v = '[' : show x ++ ", " ++ show y ++ "]"
where (x, y) = getV v
0562デフォルトの名無しさん
2010/02/07(日) 16:34:30import Data.Time.Clock (diffUTCTime, getCurrentTime)
import System.Environment (getArgs)
import System.Random (StdGen, getStdGen, randoms, split)
import Control.Parallel (par, pseq)
import Data.List (foldl1')
import Vec
type Vec2 = Vec2_1 Int
newVec = newVec2_1
add = add1
randomInts k g = let (g1, g2) = split g
med1 = take k (randoms g1)
med2 = take k (randoms g2)
res = (zipWith newVec med1 med2) :: [Vec2]
in force res `seq` res
force xs = go xs `pseq` ()
where go (_:xs) = go xs
go [] = 1
-- 続く
0563デフォルトの名無しさん
2010/02/07(日) 16:35:20main = do
args <- getArgs
let count = read (head args)
input <- randomInts count `fmap` getStdGen
putStrLn $ "We have " ++ show (length input) ++ " elements to sum."
start <- getCurrentTime
let res = foldl1' add input
putStrLn $ "sum is " ++ show res
end <- getCurrentTime
putStrLn $ show (end `diffUTCTime` start) ++ " elapsed."
0564デフォルトの名無しさん
2010/02/07(日) 16:35:36http://hpaste.org/
0565デフォルトの名無しさん
2010/02/07(日) 16:36:43それぞれ _2 や _3 に変えて実験する。
コンパイルは以下の通り。
ghc --make -O2 Test.hs
-- 以上
0566デフォルトの名無しさん
2010/02/07(日) 17:52:490567デフォルトの名無しさん
2010/02/07(日) 18:50:21すまない、そんな便利なものがあるとは知らなかった。
次回から利用させてもらう。
>>558
実行時に RTS オプションで -S を与えてメモリ状況を見てみたが、
1.5倍以上の時間差が開くほどの違いがあるとは私には分からなかった。
[1] は [2] や [3] の状況をそのまま時間軸に拡大したような感じだ。
GC の稼働率は [1]=90%、[2],[3]=83% で、[1] が他に比べて若干高いなとは感じるが、
時間差の原因となるような違いには思えないんだが。
ちなみに、最適化オプションを省くと [1] が最も速くなる(他の1/2)。
単純に、生成したコードの効率の違いではないかと思ってる。
ただ、迷惑そうなので、しばらくレスは控えることにする。
0568デフォルトの名無しさん
2010/02/10(水) 00:32:06(。^ω^゜)オロローン
Windows2000 SP4
HDBC-2.2.2はインストールできたのに
0569デフォルトの名無しさん
2010/02/10(水) 03:41:38ttp://software.complete.org/software/issues/show/164
ghc 6.10.4 のときにHDBC-sqlite3がビルドできなかったけど、
これでできるようになった。
0570デフォルトの名無しさん
2010/02/10(水) 10:13:190571デフォルトの名無しさん
2010/02/10(水) 22:14:11次のエラーが出た。
Resolving dependencies...
Configuring old-time-1.0.0.2...
cabal: Error: some packages failed to install:
directory-1.0.0.3 depends on old-time-1.0.0.2 which failed to install.
haskell98-1.0.1.0 depends on old-time-1.0.0.2 which failed to install.
hmatrix-0.8.3.1 depends on old-time-1.0.0.2 which failed to install.
old-time-1.0.0.2 failed during the configure step. The exception was:
sh: runGenProcess: does not exist (No such file or directory)
process-1.0.1.1 depends on old-time-1.0.0.2 which failed to install.
いろんなもんが old-time-1.0.0.2 に依存してるけど
old-time-1.0.0.2 がインストールに失敗するってメッセージだと思うけど、
"cabal info old-time" で調べると、このバージョンは既にインストールされている。
これはどういうことなの?
0572デフォルトの名無しさん
2010/02/11(木) 00:00:26windows上でやるならmingwとか入れる必要がある
0573デフォルトの名無しさん
2010/02/11(木) 05:50:36Haskell: The Craft of Functional Programming (International Computer Science Series)
Simon Thompson (ペーパーバック - 2011/4/19)
出版社: Addison-Wesley Educational Publishers Inc; 3rd Revised edition版 (2011/4/19)
http://www.amazon.co.jp/Haskell-Functional-Programming-International-Computer/dp/0201882957/
0574デフォルトの名無しさん
2010/02/11(木) 09:30:270576デフォルトの名無しさん
2010/02/11(木) 12:38:59試しに cabal-install を "cabal install cabal-install" で更新してみようとしたら、
こちらも "depends on old-time-1.0.0.2 which failed to install." って言われる。
その他に、一昨日まで cabal でインストールできていたライブラリが、
昨日から old-time-1.0.0.2 のせいでインストール(更新)できない。
ちなみに、なぜか最新の old-time-1.0.0.3 も同じ理由でインストールできない。
これも、mingw とかに関係してる?
それとも GHC 自体を一度再インストールした方がいい?
それだと今までインストールしたライブラリも再インストールしなきゃならないから、
正直ちょっとしんどいが。
0577デフォルトの名無しさん
2010/02/11(木) 13:50:390578デフォルトの名無しさん
2010/02/11(木) 14:35:11mingw と msys 入れて、msys のコンソール上で同じ事を試したけど、
全く同じエラーだった。
0579デフォルトの名無しさん
2010/02/11(木) 15:55:240580デフォルトの名無しさん
2010/02/11(木) 22:15:55どっちのパッケージで試したんだよ
同じエラーってどこの部分のことを言ってるんだよ
言葉足らずにもほどがある
0581デフォルトの名無しさん
2010/02/11(木) 23:13:15mingw と msys 入れて、msys のコンソール上で
"cabal install hmatrix" を実行したら
>>571 と同じメッセージが表示されて、インストールできなかった。
また同コンソール上で、>>576 のように
"cabal install cabal-install" を実行しても同様に
old-time-1.0.0.2 パッケージのインストールに失敗し、
これに依存している全てのパッケージがインストールできない。
さらに同コンソール上でも、>>576 のように
old-time-1.0.0.3 すらも old-time-1.0.0.2 のせいでインストールできない。
0582デフォルトの名無しさん
2010/02/11(木) 23:55:52sh があるパスを環境変数 path に追加してみたら?
0583デフォルトの名無しさん
2010/02/12(金) 00:26:00sh というのは msys にある sh だよね。
(C ドライブ内を検索したら、そこにしか無かった)
Windows の環境変数の PATH に追加して同じ事を試してみたけど、
変わりなかった(同じメッセージのエラーが出ていろんなパッケージがインストールできない)。
しかし、>>576 でも言ったけど、
ついこの前まで cabal でインストールできていたライブラリが
昨日から old-time-1.0.0.2 のせいでインストールできなくなったから、
sh が原因とも思えないんだけど。
気を悪くしたらごめん。
今日はもう寝て、仕事が終わってからまた調べてみるけど、
それで駄目だったら、アドバイスくれた人たちには申し訳ないけど、
諦めて再インストールします。
0584デフォルトの名無しさん
2010/02/12(金) 01:27:350585デフォルトの名無しさん
2010/02/12(金) 01:32:43>sh: runGenProcess: does not exist (No such file or directory)
ここの部分な
0586デフォルトの名無しさん
2010/02/12(金) 07:19:16これって
sh が「runGenProcess がねぇよ」って言ってるの?
それとも sh の runGenProcess が「〜はねぇよ」って言ってるの?
(〜の部分に何が入るかは読み取れない)
どっちにしても、ないのは sh じゃない何か別なもののように見えるんだけど
0587デフォルトの名無しさん
2010/02/12(金) 14:14:27readFileあたりに存在しないファイルを開かせて、例外を掴まえて表示してみれば分かる
0588デフォルトの名無しさん
2010/02/12(金) 14:21:44> runGenProcessが「shがねぇよ」って言ってる
runGenProcess を実行しようとしてるのは sh じゃねえの?
0589デフォルトの名無しさん
2010/02/12(金) 15:21:03"shが無い"でないのはそうなのだが、MSYS+MinGWをちゃんとインストールすれば回避できる。
shだけにパスが通ってるんじゃねえの?
runGenProcessがどうのって出るのはここいら(createProcess,runGenProcess_)のせいだと思う
http://www.haskell.org/ghc/dist/stable/docs/libraries/process/src/System-Process.html
0590デフォルトの名無しさん
2010/02/12(金) 15:41:36違うよ
runGenProcessがshを実行しようとして、見つからなかったというエラー
0591デフォルトの名無しさん
2010/02/12(金) 15:44:540592デフォルトの名無しさん
2010/02/12(金) 15:45:240593デフォルトの名無しさん
2010/02/12(金) 15:51:09これのShow IOExceptionのところを見れば分かるけど、最初の部分(この例だとsh)は対象のファイル名で、
エラーの発生場所(runGenProcess)はその次にくる
0594デフォルトの名無しさん
2010/02/12(金) 20:48:30自分ではちゃんとインストールしたつもりなんだけど・・・
最初に "MinGW-5.1.6.exe" をインストールした。
ダイアログで "Select components to install:" と訊いてくるので、
デフォルトのまま [Next ボタン] を押してインストール。
次に "MSYS-1.0.11.exe" インストールした。
インストール後に、MinGW があるか、
あるならそのパスを訊いてきたから入力した。
そして最後に >>582 の指摘を参考に、
Windows の環境変数 "path" に "C:\msys\1.0\bin" を追加した。
これでも駄目だったんだけど、何か足りない作業がある?
0595デフォルトの名無しさん
2010/02/13(土) 13:17:13MinGW + MSYS を再インストールしてみたりしたけど、駄目だった。
もう限界。
アドバイスしてくれた方々には良い結果を出せなくて申し訳ないけど、
GHC を再インストールするわ。
板汚しただけになってすまなかった。
0596デフォルトの名無しさん
2010/02/13(土) 14:07:20その上で使う方が遥かに楽だからな
0597デフォルトの名無しさん
2010/02/13(土) 14:44:57だよな
俺はエミュレータ上でほとんどの開発をしている。コードをバージョン管理していれば同期できる
0598デフォルトの名無しさん
2010/02/13(土) 22:59:24Ross Paterson の論文 [A New Notation for Arrows] を読んでも、
rec の構文がよく分かりません。
たとえば、loop 関数でリスト [n, n-1 .. 0] を作る Arrow (->) を定義しました。
(http://d.hatena.ne.jp/mzsms/20091119/1258657366 を参考にした)
let f (a, g) = (g a, \n -> if n == 0 then [n] else n : g (n-1))
let af = loop f
これを Arrow 表記で rec を使って表現するには、どう書くのでしょうか。
0599598
2010/02/13(土) 23:00:500600デフォルトの名無しさん
2010/02/14(日) 11:28:31af1 :: Num a => a -> [a]
af1 = proc x -> do
rec
g <- returnA -< \n -> if n == 0 then [n] else n : g (n-1)
returnA -< g x
こんなんか?
0601デフォルトの名無しさん
2010/02/14(日) 13:32:25なるほど、再帰的に呼ぶ必要がある式のみを rec でマーキングすれば十分なんですね。
ありがとうございました。
0602デフォルトの名無しさん
2010/02/14(日) 13:35:11どこかでcircular programmingとか言うキーワードを見た気もしますがそれも含めて
0603デフォルトの名無しさん
2010/02/14(日) 21:40:56http://haskell.org/haskellwiki/WxHaskell/Quick_start
の最初のサンプルをそのままコピペして動かしてみたんだけど、
ウィンドウタイトルとボタンの文字がそれぞれ "H" と "Q" しか表示されない。
つまり最初の一文字だけ。
これってうちだけ?
ちなみに環境は
wx-0.12.1.2
wxcore- 0.12.1.2
wxWidgets 2.8.10
OS : Windows7
GHC 6.10.4
0604デフォルトの名無しさん
2010/02/20(土) 11:29:23gtkhsやqthaskellとかを見たんだけど、それらしきものが見つかりません。
0605デフォルトの名無しさん
2010/02/20(土) 12:07:23HaskellではなくOSの勉強をしたほうがいい
0606デフォルトの名無しさん
2010/02/20(土) 18:35:360607デフォルトの名無しさん
2010/02/20(土) 18:37:13みんな最新版じゃないの?
0608デフォルトの名無しさん
2010/02/20(土) 20:37:03気のせいか
0609デフォルトの名無しさん
2010/02/20(土) 21:20:42Haskell.org でも Platform の方を薦めてるし。
0610デフォルトの名無しさん
2010/02/20(土) 23:59:58ttp://www.haskell.org/pipermail/cvs-ghc/2010-February/052606.html
反応は・・・
早めに追加出来れば、llvmがバージョンアップする時も
エラー箇所の報告も上がるだろうし、パッチの問題も減るからマージしたいんだろうな。
ただ、メンテナー確保しつづけれるのか?
0611デフォルトの名無しさん
2010/02/22(月) 13:45:32何かそれに同機能・似た機能を実現する方法ってないの?
0612デフォルトの名無しさん
2010/02/22(月) 21:16:54date TypeA = TypeA {getInt :: Int, getFloat :: Float, getStr :: String}
次のように、型の一部だけ値を変えた変数を作ったら、
t1 = TypeA 1 0.2 "foo"
t2 = t1 {getFloat = 0.3}
全体がコピーされるんじゃなくて、
getFloat だけコピーされて後は t1 も t2 も同じものを参照する
というように処理されることは期待できるの?
0613デフォルトの名無しさん
2010/02/22(月) 22:06:220614デフォルトの名無しさん
2010/02/23(火) 07:23:47ありがと
0615デフォルトの名無しさん
2010/02/23(火) 12:46:14GUIの開発は wxHaskell,gtk2hs どちらがの方が多数派なの?
0616デフォルトの名無しさん
2010/02/23(火) 21:19:17gtk2hsを基盤としたものの方が多い様に思われる。
0617デフォルトの名無しさん
2010/02/23(火) 21:27:07Haskellの意味論とよく合うのはFRPだが、ライブラリはどれも実験的でろくにメンテナンスされていない
0618デフォルトの名無しさん
2010/02/23(火) 23:18:55> Haskellの意味論とよく合うのはFRPだが、ライブラリはどれも実験的でろくにメンテナンスされていない
FRPやAFRPによる各GUIライブラリの使い方を学ぶんじゃなく、
GUIライブラリという例を通してFRPやAFRP自体を学ぶ姿勢の方がいいかもしれんね。
0619デフォルトの名無しさん
2010/02/23(火) 23:29:11thx。ふんぎりついた。勉強するわ。
0620デフォルトの名無しさん
2010/02/24(水) 00:37:11そう。だからFRPの論文を読んでみたんだが、まず数学をやる必要があると思った。
0621デフォルトの名無しさん
2010/02/24(水) 12:42:06英語でも構いません。
0622デフォルトの名無しさん
2010/02/24(水) 19:28:26GHC6.12にアップグレードする場合にはGHCとcabal-installをアンインストールしてからGHC6.12をインストールする必要があるのでしょうか?
ubuntuやcabalで管理している依存関係が壊れたりしないか不安です。
0623デフォルトの名無しさん
2010/02/24(水) 19:33:50正確に覚えていませんが、ubuntuのGHCと自分でインストールしたGHCで、
GHCのパッケージ管理が競合したか何かですごく苦労しました。
私は、結局ubuntuの用意しているものに一本化に落ち着きましたが、
それ以外のGHCを入れるなら完全にアンインストールしたほうが良いと思います。
0624デフォルトの名無しさん
2010/02/24(水) 19:56:53Debian系のghcパッケージはバージョンが古いので、バイナリのtarballのほうがいいんじゃないか。
俺は結局Arch Linuxに移行したがね。
Arch Linuxのパッケージは新しいし、ヘッダーも一緒(-devに分離されていない)なので、
Xを自分でセットアップする覚悟があるならおすすめ。
0625デフォルトの名無しさん
2010/02/24(水) 20:30:53次の型の関数があるとします。
one :: x -> Int
one n = 1
rev :: String -> String
rev = reverse
このとき、次の式の型が String -> Int になる理由が分かりません。
fmap one rev
fmap の型は (a -> b) -> f a -> f b ですよね。
自分では、まず (a -> b) を one の型より (x -> Int) と推論したのですが、
すると b は Int となって、ここで既に結果の型と違い、躓きました。
それとも、これで合ってるのでしょうか。
どなたか a は〜から〜と推論できるなどと、
詳しく演繹の様子を示していただけないでしょうか。
0626デフォルトの名無しさん
2010/02/24(水) 20:40:38> このとき、次の式の型が String -> Int になる理由が分かりません。
> fmap one rev
ならなくね?
(fmap one) . rev なら、 String -> [Int]になる。
0627デフォルトの名無しさん
2010/02/24(水) 20:52:29fmap :: (Functor f) => (a -> b) -> f a -> f b
one :: x -> Int
rev :: String -> String
だから、
a = String
b = Int
f = (->) String
よって、結果の型は、
f b = (->) String Int = String -> Int
ポイントは、一つの型rからの関数が一つのFunctorであること
instance Functor ((->) r)
0628デフォルトの名無しさん
2010/02/24(水) 20:56:100629デフォルトの名無しさん
2010/02/25(木) 07:42:06理解できました。
はじめ f が Functor で、f a の a が (->) String だと思っていました。
それが頭にあったので、one から b を推論した時点で訳が分からなくなっていました。
f は Functor f という文脈上の f なので (->) r になるんですね(関数ファンクタの場合)。
おかげさまで解決しました、ありがとうございました。
>>626,628
よくわかりませんが、私が実験した時は Prelude しかロードしていません。
0630デフォルトの名無しさん
2010/02/25(木) 20:38:15そのモジュールが公開しているもの(関数や data、typeなど)の名前と
その型シグネチャを表す文字列とのペアのリストを返す関数、
といったものは作れるのでしょうか。
たとえば以下のモジュールの場合、
module Sample (T1, f1) where
data T1 = T Int String
f1 :: T1
f1 = T 1 "one"
getExpList "*.hs あるいは *.hi へのパス" を評価すると、
リスト [("data T1", "T Int String"), ("f1", "T1")] が帰ってくるような。
0631622
2010/02/25(木) 21:46:47レス有り難うございます。
>>624
見るのが遅れてしまいました。
サイトで確認したところソースからビルドするにはGHCが使われると書いて在りましたので、ソースからビルドすれば矛盾は生じないと思いコンパイルを始めたのですが、今日一日コンパイルをしていても未だ終わりません。
電源が落とせなくて困ってます。(笑)
Arch Linuxは良いですね。
ubuntuを入れているマシンに入れた事がありますが、グラフィックスのドライバが合わなくマシンの調子が悪くなったので諦めました。
最近は無用なトラブルは嫌なのでubuntuにXmonadで使ってます。
0632デフォルトの名無しさん
2010/02/27(土) 01:56:090633デフォルトの名無しさん
2010/02/27(土) 11:04:58ある型クラスのインスタンスを定義している時、
その型クラスが持つ複数の関数の一部だけを実装し、
残りの関数は何らかの理由で未実装のままライブラリを公開したいとします。
(それを実装するのはまだ難しく、とりあえず試用版として公開するとか)
この場合、その関数の実装を undefined 関数で代用しても、
コンパイルは一応問題なく通ってしまい、ライブラリのユーザーは
実行時に例外が起きて初めて未実装に気づきます。
(気づければまだいい方で、メッセージも分かりやすいとはとても言えない)
それを実行時ではなく、
その関数を使用しているモジュールをコンパイルしている時に、
何かメッセージを生じさせてコンパイルエラーを起こし、
未実装であることを知らせたいです。
しかし、そのインスタンスの実装済みの関数だけを使用している場合は、
問題なくコンパイルを通らせたいです。
何かいい方法は無いでしょうか。
(使用コンパイラ:GHC)
0634デフォルトの名無しさん
2010/02/27(土) 11:44:31無理だと思う
class X a where -- 問題の型クラス
methodA :: a -> Int
methodB :: a -> String
instance X YourType where -- >>633のライブラリ内で
methodA = ...
methodB = error "X YourType: methodB is not implemented"
foo :: (X a) => a -> IO () -- 第三者(>>633のライブラリの存在を知らない)のライブラリ内で
foo x = ... -- ここでmethodBを使う
たとえばこういう状況で、>>633のライブラリのユーザが、
YourType型の値にfooを適用したとする
でも、この時点ではfooはコンパイル済みなので、fooがmethodBを使っていることがGHCには分からない
fooをコンパイルする時点では、YourTypeのことをGHCが知らないので、やはり警告できない
型クラスを定義するのも自分なら、メソッドにDEPRECATEDプラグマを付けるという選択肢があるけど、
その場合どのインスタンスについても警告が出る
一般論としては、undefinedじゃなくてerrorを使ってなるべく分かり易いメッセージで例外飛ばすのがいいんじゃないか
0635デフォルトの名無しさん
2010/02/27(土) 19:21:46やはり方法は無さそうですか。
> 一般論としては、
そうですね、error で分かりやすいメッセージを出して、
かつライブラリのリファレンスにも
それと分かるように書いておくことで対処します。
ありがとうございました。
0636デフォルトの名無しさん
2010/03/03(水) 02:05:010637デフォルトの名無しさん
2010/03/03(水) 02:07:560638デフォルトの名無しさん
2010/03/03(水) 02:22:43俺はGHC6.12.1のバイナリをhaskell.orgから取ってきて、個別のディレクトリ(/opt/lang/haskell/ghc/ghc-6.12.1)にインストールしている。
一方で、apt-getでインストールしたghcはアンインストールしていない。
/opt/…下のGHC6.12.1と、apt-getでインストールしたGHCは、下記みたいにして使い分けている。おバカだけど。
(1) 環境変数PATHの先頭の方に、使いたい方のGHCのパスを設定する。
(2) ~/.cabal/と~/.ghc/を、「/opt下GHC6.12.1用」のものと「apt-getのGHC用」のものとで、差し替えて使う。
emacsのflymakeで使うのは、/opt下のGHC6.12.1だけだな。
本当におバカ。でも良いんだ不便ではないし。
0639デフォルトの名無しさん
2010/03/03(水) 07:14:58難しい論文を読む前に、"The Haskell School of Expression" を読んでおくと
イメージがつかみやすい。
0640デフォルトの名無しさん
2010/03/03(水) 13:43:120641デフォルトの名無しさん
2010/03/03(水) 17:02:000642デフォルトの名無しさん
2010/03/03(水) 21:32:380643デフォルトの名無しさん
2010/03/03(水) 21:46:590644デフォルトの名無しさん
2010/03/03(水) 21:48:430645デフォルトの名無しさん
2010/03/04(木) 16:22:33どなたか理由わかる人がおりましたら、ご教授をいただきたく。
エラーメッセージ:
Failed to load shared library 'comctl32.dll' error 126 指定されたモジュールが見つかりません
++環境++
Haskell 6.10.4
wx 0.11.1.2
wxcore 0.11.1.2
windows7
0646デフォルトの名無しさん
2010/03/04(木) 17:20:070647デフォルトの名無しさん
2010/03/04(木) 17:28:31C:\Windows\System32\comctl32.dll
はすでに存在していた。にも関わらずエラーが出て困る、ということです。こちらの不手際で、申し訳ない。
0648デフォルトの名無しさん
2010/03/05(金) 11:37:15今すぐ計算する事がサンクを作る事より安上がりな時に使うの?
0649デフォルトの名無しさん
2010/03/05(金) 11:45:000650デフォルトの名無しさん
2010/03/05(金) 12:55:060651デフォルトの名無しさん
2010/03/05(金) 18:58:36僕は、遅延IOのデータをファイルをクローズするまえに評価するために使っている。
0652デフォルトの名無しさん
2010/03/06(土) 05:15:500653デフォルトの名無しさん
2010/03/08(月) 15:06:11あとはマーカーでチェックだ
0654デフォルトの名無しさん
2010/03/08(月) 19:35:510655デフォルトの名無しさん
2010/03/08(月) 21:00:28第2刷は昨年末ぐらいに出てるみたいだけど(有楽町ビックにて確認)、
それ以降の増刷ってこと?
0656デフォルトの名無しさん
2010/03/08(月) 21:09:42お、出てたんだ。 いや、うちの近所じゃ見掛けないもんで。
四国は東京から見れば辺境だしな。
でも! 宮脇カルチャースペースがある! 宮脇なら! 宮脇ならきっとやってくれる!
次の休みに高松まで言ってみるわー
0657デフォルトの名無しさん
2010/03/09(火) 21:48:50田舎は大変だよなぁ
0658デフォルトの名無しさん
2010/03/10(水) 02:43:09理工学系の中古書店がないから通販で買うにも高いし、
公的な図書館に行っても資料が蔵書扱いで一般の手に触れられない所に置いてあったり、そもそも置いてなかったり。
専門的な勉強してる人はみんな街に出て行っちゃうから生活能力のない内はそういうのに触れられないし、
生活能力が付く頃には学術知識に大きな開きが出て無縁な生活送っちゃうはめになるし。
0659デフォルトの名無しさん
2010/03/10(水) 08:32:09図書館にある本はみんな「蔵書」。
利用者が入れない書庫は「閉架」、館外に借り出せない本は「禁貸出」(辞書とか)。
0660デフォルトの名無しさん
2010/03/10(水) 16:08:190661デフォルトの名無しさん
2010/03/10(水) 17:04:190662デフォルトの名無しさん
2010/03/10(水) 18:29:32gtk2hsはdarcs版にパッチを当てないと使えない有様
足引っ張りすぎだわ
0663デフォルトの名無しさん
2010/03/10(水) 21:26:490664デフォルトの名無しさん
2010/03/10(水) 22:36:560665デフォルトの名無しさん
2010/03/10(水) 22:53:38俺は色々ゴニョゴニョやってもインストールできなかったから諦めた。
代わりに wxWidgets + wsFruit に挑戦したらインストールできたんで、
今はこっちっで遊んでる。
0666デフォルトの名無しさん
2010/03/10(水) 23:15:0653枚のカード(1..13x4+JOKER)[1..53]のリストを人間がシャッフルするみたいにかき混ぜる処理で躓いた
乱数の発生も分からないけど、何処かで読んだ気がする
l = [1..53]
リストlの中を抜いて後ろにつなげる処理をランダム回繰り返して
ううう、普通の処理系と勝手がすこし違うよね
スマートな処理をと考えると、データ構造にも頭使うし
0667デフォルトの名無しさん
2010/03/11(木) 00:21:41ランダムな数のリストを作って
ランダムな数のリストと zip してランダムな数の方でソート
んで、カードの方を残す
0668デフォルトの名無しさん
2010/03/11(木) 00:38:55やったことないけど
0669デフォルトの名無しさん
2010/03/11(木) 01:06:02f [] = return []
f l = do
i <- randomRIO (0, length l - 1)
ns <- f ((take i l) ++ (drop (i+1) l))
return $ (l!!i) : ns
0670デフォルトの名無しさん
2010/03/11(木) 02:15:25どこかで議論を読んだ気がするんだけど忘れちゃった
0671デフォルトの名無しさん
2010/03/11(木) 02:20:25乱数の範囲が十分広くて、値の重複が起こらないようなら大丈夫そう。
0672デフォルトの名無しさん
2010/03/11(木) 13:33:59import System.Random
import System.IO.Unsafe
import Data.List
g a b = unsafePerformIO $ do {i <- randomRIO (0, 1); case (i::Int) of {0 -> return GT; 1 -> return LT}}
test l = sortBy g l
0673デフォルトの名無しさん
2010/03/11(木) 20:51:05> The I/O libraries are now Unicode-aware, so your Haskell programs should now handle text
> files containing non-ascii characters, without special effort
って書いてあるんだけど、これって、ghciで、
Prelude> ["あああ","いいい"]
["あああ","いいい"]
Prelude>
みたいに、エスケープされていない文字列で出力されるっていうこと?
0674デフォルトの名無しさん
2010/03/11(木) 23:20:33違う。putStr "あああ"みたいなのが期待通りに動くようになるってこと
エスケープはShow Stringの実装の話
0675デフォルトの名無しさん
2010/03/11(木) 23:47:06windows ghc-6.12.1 + gtkhs-0.10.1
windows ghc-6.10.4 + gtkhs-0.10.1
web 上 gtk2hs*split-objs で検索して設定ファイルを手で修正して
ソースパッケージから MinGW+msys環境 でインストールした。
一応ほとんどのdemo プログラムはコンパイル、実行できた。
0676デフォルトの名無しさん
2010/03/11(木) 23:48:18おお、サンクス。でも、ってことは、それほどうれしくないなぁ。
data SimpleString = S String
instance Show SimpleString where
show (S s) = "\"" ++ s ++ "\""
みたいなのを作れば良いんだとは思うんだけど。
でも、その一歩前進で、Show Stringの実装が変わることを期待しよう。
0677デフォルトの名無しさん
2010/03/11(木) 23:57:39あと、カードは53枚固定なので頭四行は蛇足
cardSet = zip [1..53] ([(a,b)|a<-["SPD","DIA","CLV","HRT"],b<-[1..13]]++[("JKR",0)])
tbls = [[1,a]|a<-[1..13]] ++ [[2,a]|a<-[14..26]] ++ [[3,a]|a<-[27..39]] ++ [[4,a]|a<-[40..52]]
cardlist = [1..53]
shuffle [] = []
shuffle [a,b] = [b,a]
shuffle [a,b,c] = [a,c,b]
shuffle [a,b,c,d] = [a,d,b,c]
shuffle l = retl
where
len = length l
thed = 1 + (rnd len) `div` 2
tbody = rnd (len - thed)
retl = take thed l : drop (thed + tbody) l : take tbody (drop thed l)
0678デフォルトの名無しさん
2010/03/12(金) 21:31:04Functor 型クラスのインスタンス一覧に Functor ((,) a) があるのですが、
このインスタンスの fmap はどのように使うのでしょうか。
ghci で :t (`fmap` (1,2)) を調べてみたら
(`fmap` (1,2)) :: (Num t, Num a, Functor ((,) t)) => (a -> b) -> (t, b)
となったので、試しに (+1) `fmap` (1,2) とやったところエラーが起きました。
No instance for (Functor ((,) t)) だそうです。
なぜ?
使い方が分かりません。
0679デフォルトの名無しさん
2010/03/12(金) 21:36:52$ ghci
GHCi, version 6.10.4: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer ... linking ... done.
Loading package base ... linking ... done.
Prelude> :m + Control.Monad.Instances
Prelude Control.Monad.Instances> (+1) `fmap` (1, 2)
(1,3)
ってできたお。
0680デフォルトの名無しさん
2010/03/12(金) 21:53:13ライブラリ リファレンスの Prelude のページに書かれているからといって、
必ずしも Prelude だけをロードすれば全て使えるというわけではないのですね。
ありがとうございました。
0681デフォルトの名無しさん
2010/03/14(日) 13:20:54コンパイルできず(CFilter 型シグニチャが違うなど)、docContent、Posn, posInNewCxt
を探し出して、何とか動くようになった。Unix環境、他のHaXmlのバージョンでは、本のコード
で動作するのか? ご存知の方がいましたら、参考のために教えてください。
0682デフォルトの名無しさん
2010/03/14(日) 16:55:050683656
2010/03/14(日) 17:58:260684デフォルトの名無しさん
2010/03/14(日) 18:44:31HaXmlの公式サイトにある通り、1.13から1.20でインタフェースが大きく変わった
たぶんRWHでは1.13を前提にしてるんだと思う
0685デフォルトの名無しさん
2010/03/14(日) 20:06:30ありがとうございました。
0686デフォルトの名無しさん
2010/03/14(日) 21:09:13たとえば Arrow を導入することでこんなに見通しが良くなったとか。
(Arrow + FRP で本当に見通しが良くなったのかは置いておいて)
0687デフォルトの名無しさん
2010/03/15(月) 19:59:39正の無限大方向に最も大きい値などは、どのようにすれば得られますか。
0688デフォルトの名無しさん
2010/03/15(月) 20:41:04http://stackoverflow.com/questions/1780489/haskell-minimum-maximum-double-constant
0689デフォルトの名無しさん
2010/03/15(月) 21:39:34ありがとうございます。
ところで、こはなんで引数を必要とするのでしょうか。
何か意味があるのでしょうか。
0690デフォルトの名無しさん
2010/03/16(火) 09:08:53floatRangeなんかがダミーの引数を要求する(これがないとどのインスタンスのメソッドか区別できない)ので
それに合わせてるだけだと思う
引数が邪魔なら、
myMinPositiveFloat :: (RealFloat a) => a
myMinPositiveFloat = minPositiveFloat undefined
0691デフォルトの名無しさん
2010/03/16(火) 12:34:04わかりました。
0692デフォルトの名無しさん
2010/03/16(火) 22:40:02class Class1 a where
func1 :: (Class2 b) => a -> b
class Class2 a where
func2 :: a -> String
newtype Type1 = Type1 ()
newtype Type2 = Type2 ()
instance Class1 Type1 where
func1 t = Type2 ()
instance Class2 Type2 where
func2 t = "Type2"
コンパイルしようとすると func1 t = Type2 () の部分で
Couldn't match expected type `b' against inferred type `Type2'
`b' is a rigid type variable bound by
the type signature for `func1' at ...
というようなエラーが出る。
rigid type variable をキーワードにしてググってみたけど、いまいち理解できません。
どなたか、エラーの意味と解決策を説明して頂けないでしょうか。
やりたいことは、Class1 クラスの様々なインスタンス型が、
それぞれ Class2 の様々なインスタンス型を返す仕組みを作ることです。
オブジェクト指向で言う Abstract Factory パターンみたいなことです。
0693デフォルトの名無しさん
2010/03/16(火) 23:33:34Haskellの型変数は、そこにどんな型を代入しても良いということを表す(暗黙の全称量化)
> func1 :: (Class2 b) => a -> b
だから、これだと、func1はClass2のインスタンスであるようなbならどれでも生成できるという意味になる
Class1 Type1の実装ではType2という特定の型の値しか返せないので、これに適合しない
意図としては、func1はClass2の「何らかの」インスタンスbの値を生成する、と言いたいんだろう
そういう場合、Haskell98にはないけど、GHCなら(たぶんHugsでも)存在量化という言語拡張が使える
{-# LANGUAGE ExistentialQuantification #-}
class Class1 a where
func1 :: a -> SomeInstanceOfClass2
class Class2 a where
func2 :: a -> String
data SomeInstanceOfClass2 = forall a. (Class2 a) => SIOC2 a
0694デフォルトの名無しさん
2010/03/17(水) 10:17:10明日あたり発表してくれないかなー。
0695694
2010/03/17(水) 10:17:530696デフォルトの名無しさん
2010/03/17(水) 19:51:41簡潔でとても分かりやすい説明なのですぐに理解できました。
型変数をただのワイルドカードのような感覚で使っていましたが、
意味がまるで違うのですね(どこかでそう解説してた様な気がする)。
全称量化と存在量化だと理屈が分かって納得できました。
ありがとうごさまいした。
0697デフォルトの名無しさん
2010/03/18(木) 14:18:36できるvimプラグインって無いかな?
taglistはhaskellには使えないみたい
0698デフォルトの名無しさん
2010/03/18(木) 21:55:54foldl ($) Hoge [0..2]だとfoldに渡した($)の型が展開される度に変わるのでNGです。
リストから一気にHogeを作る方法はありませんか?
0699Mail: sage
2010/03/18(木) 23:36:58じゃ駄目なのかな。
0701デフォルトの名無しさん
2010/03/19(金) 00:03:010703Mail: sage
2010/03/19(金) 00:35:52Intの数が20とかになったときに使い勝手のよいアクセス方法はあるの?
Hoge [Int]だったら0,1,..,n番目の要素を取得したい場合
getElem n (Hoge xs) = head $ drop n xs
でいけるけど。
0704698
2010/03/19(金) 00:44:24問題を単純化するためにIntにしたけど実際のコードでは
Gtkのウィジットを保持するdata GUIがあって、
Gladeで作ったxmlから連番で("button[0..n]"等)各ウィジットを読み込んで初期化
アクセスする時には個別なんでリストより一つ一つ名前が付いてる方が使い易いんです。
0705デフォルトの名無しさん
2010/03/19(金) 01:29:58data Hoge = Hoge [(String, Int)]
でlookupしてアクセスするぐらいしかないんじゃないかと。
0706デフォルトの名無しさん
2010/03/19(金) 01:55:44そういうのって、ほんとはLispとかが得意なんだと思うけど。
0707698
2010/03/19(金) 23:55:28方法に落ち着きました。
[button1, button2...] <- forM.. 元の動機がこれよりシンプルで保守性が
よい方法は無いものかと言うことでしたので
レスくれた方々、ありがとうございました。
0708デフォルトの名無しさん
2010/03/21(日) 18:16:250709デフォルトの名無しさん
2010/03/25(木) 07:39:250710デフォルトの名無しさん
2010/03/25(木) 08:54:090711デフォルトの名無しさん
2010/03/25(木) 09:45:54さっきのはなかったことにして下さい。
0712デフォルトの名無しさん
2010/03/25(木) 19:44:01gtkのせいじゃないか?ついでにパッケージ名がgtk2hsじゃなくてgtkなのも気に入らん。どっちかに統一しろよ
0713デフォルトの名無しさん
2010/03/28(日) 22:24:49プログラミングHaskellからの方が良い?
ちなみに、遊び程度だけどLispとOcamlは触れる。
CGIで掲示板作ろうと思ってるんだけど・・・
よろしこ
0714デフォルトの名無しさん
2010/03/28(日) 22:29:58目的による。
RWHはcomprehensiveなtutorialなので、特に他の本を読むべきということはない。
しかしHaskellを深く理解するにはそれ以上の研究が必要になるであろう。
0715713
2010/03/28(日) 22:41:42目的は
>>713
>CGIで掲示板作ろうと思ってるんだけど・・・
他にもSNSとかも作ろうと思ってる
あくまで趣味というか、息抜きレベル
700ページ読むのはきついけど、プログラミングHaskell読んでも
どうせRWH読まないとDBとの接続とか、セッション管理とか、
その辺のことが載ってないよっていうんなら最初からRWHかな
と・・・ どう?
0716デフォルトの名無しさん
2010/03/28(日) 22:57:50RWHを読むつもりなら、他の本は読まなくていい。
ただしRWHはHTTPやRDBそのものについて詳しく説明しているわけではなく、
数学を体系的に教えてくれる本でもない。だからネットを併用する必要がある。
0717デフォルトの名無しさん
2010/03/28(日) 23:00:45THX
ついでに、やりたいことが>>715 くらいのことだったら、プログラミングHaskell
でも十分ってことはないですか?
200頁ってのは、こうし難い魅力でもある。
スレ汚しスマソ
0718デフォルトの名無しさん
2010/03/28(日) 23:09:32yi: user errror (GConf: cannot get value of key, key is unser)とかでて起動しねぇ
gtk2hsのサンプルとかは一通り動くようになったんだけど
6.10.3までじゃないと難しいのかねぇ
0719デフォルトの名無しさん
2010/03/28(日) 23:32:06プログラミングHaskell はあくまで言語の入門書で、
実用的なこと始めるには不足な印象。
でもまぁ、本の値段なんて大したことないんだから両方買えばいいんじゃね?
0720デフォルトの名無しさん
2010/03/28(日) 23:33:33それどころか本を買う必要すらないかもしれない。
スキルがあれば、Wikibookと
http://en.wikibooks.org/wiki/Haskell
HaskellWikiだけでも何とかやれるんじゃないか?
0721デフォルトの名無しさん
2010/03/28(日) 23:44:48ttp://book.realworldhaskell.org/read/
0722デフォルトの名無しさん
2010/03/29(月) 00:15:46まあそうだが、Real World Haskellは長すぎるという不満があったから、
簡潔なWikibookを紹介したんだよ。
0723デフォルトの名無しさん
2010/03/29(月) 01:13:240724デフォルトの名無しさん
2010/03/29(月) 15:15:49オレもちょっとGCIにチャレンジしているが(PHPでかくか迷っている…)、RWHは通しては読んでないよ。
データベースのところは参照したし、たいへん参考になった。
ただ、結局は、SQL文を文字列として生成して発行するわけで、インターフェースの基本さえ分かればそれ以上は必要なかった、という感じ。
むしろ、apachの設定とか、(実行するのがGHCがインストールされていない環境なら)ライブラリを静的リンクした実行ファイルを作るとかではまるんで、とにかく何でもいいからCGIとして実行的できるものを一つ作るのが先だと思う。
0725デフォルトの名無しさん
2010/03/29(月) 21:53:54それとも根本的に無理な話?
0726デフォルトの名無しさん
2010/03/29(月) 21:55:520727デフォルトの名無しさん
2010/03/29(月) 22:05:43House: Haskell User's Operating System and Environment
http://programatica.cs.pdx.edu/House/
0728デフォルトの名無しさん
2010/03/30(火) 06:34:500729デフォルトの名無しさん
2010/03/30(火) 08:45:51Haskellでunitではなくreturnという名前にしているのは、
do記法がより手続的に見える以上の理由があるの?
0730デフォルトの名無しさん
2010/03/30(火) 12:33:35誰もが失敗したネーミングだと言ってる。
そもそも、「手続的に見える」よりもっと狭い。
C言語のように見える(見えなくもない)というだけの話。
0731デフォルトの名無しさん
2010/03/30(火) 22:27:06ソースの先頭からの絶対位置を取得する方法はないでしょうか?
ソースはファイルなので行と列を取得しておいて
行、列の分だけhGetLineとhGetCharを回す等を考えていますが
ベターな方法はないものかと思っています。
0732デフォルトの名無しさん
2010/03/31(水) 03:24:15import Text.Parsec.String
main = do
parseTest myp "abc\ndef"
parseTest myp' "abc\ndef"
myp = do
ret <- many $ holdLine $ oneOf "abc\nde"
eof
return ret
string' s = mapM (holdLine . char) s
myp' = do
ret <- string' "abc\nde"
eof
return ret
holdLine parser = do
pos <- getPosition
ret <- parser
setPosition $ flip incSourceColumn 1
$ setSourceLine pos $ sourceLine pos
return ret
0733732
2010/03/31(水) 03:28:38もし、Text.Parsec.Char の関数を使いたいなら、これでいちおうお望みのことはできると思います。
いまひとつスマートな感じがしないし、もっとスマートな方法がありそうな気がするけど。
Text.Parsec.Char の関数を使う気がないなら、もっとどうとでもやりようはあると思う。
0734731
2010/03/31(水) 22:10:55ありがとうございます。
書き方が悪かったのかもしれません
「ソースの先頭からの絶対位置」というのは
パースが終ってから hSeek h AbsoluteSeek pos とできる位置のことです。
今、パーサをbinaryで書く方法とParsecで取得しておいたLine/Columnを辿って
絶対位置を割り出す方法のどちらがましか検討しています。
0735732
2010/03/31(水) 22:41:02あ、hSeek だとバイトオフセットだから、>>732ではダメですね。
というか、エンコーディングのことを考えていませんでした。ごめん。
0736デフォルトの名無しさん
2010/04/02(金) 23:26:080737デフォルトの名無しさん
2010/04/03(土) 16:56:040738デフォルトの名無しさん
2010/04/03(土) 18:28:30立ち読みで軽く見ただけだが、
自分の指摘した一件が修正されてるのを確認した。
0739デフォルトの名無しさん
2010/04/03(土) 22:36:29foldr step zero (x:xs) = step x (foldr step zero xs)
と記されているけれど、
foldr step zero (x:xs) = step (foldr step zero xs) x
と書くべきじゃないかしら。あまり意味ないか
0740739
2010/04/03(土) 22:45:140741デフォルトの名無しさん
2010/04/05(月) 22:11:28alignment 関数の戻り値として返す値は、C 言語の構造体で言うところの
4バイト アライメントや8バイト アライメントの「アライメント」の値ですか。
「本物のプログラマはHaskellを使う」で hsc2hs の使い方が簡単に紹介されていますが、
(http://itpro.nikkeibp.co.jp/article/COLUMN/20080805/312151/?ST=ittrend&P=3)
ここでは alignment = sizeOf と定義していますが、これは正しいのでしょうか。
0742デフォルトの名無しさん
2010/04/05(月) 22:23:58http://haskell.org/ghc/docs/latest/html/libraries/base-4.2.0.0/Foreign-Storable.html#v:alignment
>4バイト アライメントや8バイト アライメントの「アライメント」の値ですか。
そう
>ここでは alignment = sizeOf と定義していますが、これは正しいのでしょうか。
Cのsizeof(T)の値はTのアラインメントの倍数になる
(そうでなければ、Tの配列を作ったとき、全ての要素のアラインメント要求を満たすことができない)
だから、alignment = sizeOfは(厳しすぎる可能性があるものの)正しい
0743デフォルトの名無しさん
2010/04/05(月) 22:35:31ということは、アライメントがはっきり分かっている場合はその値を、
分からなければとりあえず sizeOf を返しておけば問題は無いということですね。
ありがとうございました。
0744デフォルトの名無しさん
2010/04/08(木) 07:58:05関数型言語のエッセンスを手っ取り早く学ぶのに良い言語って何だろう。
とりあえず、Java使いなのでScalaに傾き中なんだけど。
0745デフォルトの名無しさん
2010/04/08(木) 09:07:58何事もまずは手を動かすことが大事だから、自分が入りやすいと思う言語、気になった実装系でよいと思う。
ただ、まぁ、ひとつあげろと言われるとHaskellだな、真面目な話。
理論的な話は置いておいて、プログラマとして実践的な面からの関数型言語のエッセンスは、高階関数の多用だと思う。
高階関数を多用するためには、無名の関数、有名の関数の両方が非常に簡潔にかけることが望ましい。
で、Haskell以上にそれが簡潔な言語をオレは知らん(Lazy Kを除いて)。
0746デフォルトの名無しさん
2010/04/08(木) 10:38:58上にほぼ同意だが、余裕があればHaskellに加えてLISPもやるといい。
特に、Schemeインタプリタを自力で実装するといい。
しかし関数型言語ということであればHaskellだろう。Expand your brainといわれている。
0747Mail: sage
2010/04/08(木) 10:44:56個人的にはカリー化が簡単にできるのもポイント高い。
add x y = x + yとかあるのをカリー化したいときに
(add 3) で簡単に作れるのがいい。
schemeとかlispだと
(define (add3 x) (add 3 x))ってやらないといけない。
0748デフォルトの名無しさん
2010/04/08(木) 10:53:03こういった場合、中途半端はよくない。純粋関数型言語を選択して欲しい
0749デフォルトの名無しさん
2010/04/08(木) 12:42:41書籍「関数プログラミング」を読んでから
純粋関数型である Haskell の魅力にとりつかれました。
この本に関数型言語のエッセンスが凝縮されています。
この本 + Haskell がまさに「手っ取り早い」と思います。
(ただし、この本に Haskell の使い方は載っていない)
0750デフォルトの名無しさん
2010/04/08(木) 12:55:30検索したら複数出てきましたがどれでしょうか?
0751デフォルトの名無しさん
2010/04/08(木) 15:06:340752デフォルトの名無しさん
2010/04/08(木) 19:20:59おっと、そいつはすまなかったな
これです。
http://www.amazon.co.jp/dp/4764901811
0753デフォルトの名無しさん
2010/04/08(木) 19:27:410755デフォルトの名無しさん
2010/04/08(木) 21:21:32中古ではダメなのか
0756デフォルトの名無しさん
2010/04/08(木) 21:51:14それしかなさそうだね。
ただ、実は友達と勉強会やろうかって話をしてて、教科書にするには厳しそうだなと。
0757デフォルトの名無しさん
2010/04/09(金) 17:47:01んだけど、この本難しい方?
ちなみにHaskellの本は初めて読んでます。
0758デフォルトの名無しさん
2010/04/09(金) 18:31:150759デフォルトの名無しさん
2010/04/09(金) 19:11:160760デフォルトの名無しさん
2010/04/09(金) 19:37:16そのための準備は必要
0761デフォルトの名無しさん
2010/04/09(金) 21:27:54調べてみたら、論文に載るような難しい概念だということが分かった
それからは、中身は特に考えずにそういうもんだと思い込んで使っている
0763デフォルトの名無しさん
2010/04/09(金) 21:42:02写経=コピー
理解できなくても、考えなくても、文字が読めて書ければ写経できる。
RWH は応用だから対象読者が違う。
0764デフォルトの名無しさん
2010/04/09(金) 21:42:22たぶん、「そういうもんだ」と思い込んでいる、その「そういうもんだ」と理解していることが、理解すべきことの全てだと思う。
Monad クラスは形式的な枠組みを規定しているだけで、それ以上に意味も中身もない。
イルカとサメが似ているようなもん。外見が似ている、それだけ。
0765デフォルトの名無しさん
2010/04/09(金) 21:46:03それも含めて形式的な枠組みに過ぎないという事なのか
0766757
2010/04/09(金) 21:48:30>写経=コピー
>理解できなくても、考えなくても、文字が読めて書ければ写経できる。
写経って言葉を少し間違って使っていたようです スマンコ
>RWH は応用だから対象読者が違う
応用≒実践ってことかな?
それだったら、RWHの方が目的にあってるような気がする・・・
0767Mail: sage
2010/04/09(金) 21:54:49モナドそのものについては圏論の初歩で理解できるよ。
対象、射、(共変)函手、自然変換の4つの概念くらいしか必要ないし。
あと「図式が可換」っていう意味が分かればモナドが弄れる。
けど、どうしてこんなにHaskellで利用されているのかをつかむには不十分みたいなんだよね。
頭で理解するより慣れた方が多分近道。
あと、おそらくHaskellプログラマかつ非数学者のためのpdfがあるけど、案外不評。
ttp://lambda-the-ultimate.org/node/1183
証明に可換図式を使わないとこんなに面倒なのか、って思う。
0768デフォルトの名無しさん
2010/04/09(金) 21:55:56そういうこと。
5章から JSON ライブラリを作ってみたり、
バーコードリーダーを作ってみたりといった実践が始まる。
その中でテクニックを学んでいく。
とりあえず RWH を読んでみて、
説明を端折ってるなって思える部分に出会ったら、
他の文献を当たるなりすれば良いと思う。
0770デフォルトの名無しさん
2010/04/09(金) 22:07:34じゃぁ、言い直そう:
イルカとサメが似ているようなもん。海を泳ぐ、それだけ。
0771デフォルトの名無しさん
2010/04/09(金) 22:14:36その先を目指して理解できると、きっと「より面白い」と感じると思うんだがなぁ
イルカとサメがどーたらこーたらで止まってしまうのが、
ちょっとだけもったいない気がする
0772デフォルトの名無しさん
2010/04/09(金) 22:25:04RWH、と言うかオラ本は全般に説明がくどいね。変な例えとかジョークで厚みが増しトル。読み物的。
それがイイって人も多いのかもしれないが。
ついでに池袋ジュンク覗いてきたけど初版がまだ店頭に並んでた
0773デフォルトの名無しさん
2010/04/09(金) 22:43:510774Mail: sage
2010/04/09(金) 22:44:21まだ読んでないけど、この論文とかが圏論の言葉少なめ、
計算機科学の言葉多めで面白いかもね。
ttp://www.disi.unige.it/person/MoggiE/ftp/lics89.pdf
もったいないかもしれないが、圏論の言葉をhaskellに翻訳すると、
対象 = Haskellのすべての型(IntとかMaybe Stringとか)
射 = Haskellでの関数::a -> b
函手 = newtype,dataで作られる型Tのコンストラクタ::a -> T a
自然変換 = t1 a -> t2 aという関数
Kleisli Triple = 型T, return::a ->T a, =<<:: (a -> Tb) -> T a -> T b
この後、どう面白くなるのかがまだ分からん。
0775デフォルトの名無しさん
2010/04/09(金) 23:13:44>>写経=コピー
>>理解できなくても、考えなくても、文字が読めて書ければ写経できる。
>
>写経って言葉を少し間違って使っていたようです スマンコ
あってるだろ
本物の写経も
考えずにコピーするだけの写経もあれば
意味を考えながらの写経もある
0776デフォルトの名無しさん
2010/04/10(土) 00:35:43Haskellでサーバアプリ作れるくらいのレベルだけど、圏論すぐに理解できますかね?
Haskellが得意な人向けの圏論の入門書とかサイトとかないでしょうか
0777デフォルトの名無しさん
2010/04/10(土) 01:22:380778デフォルトの名無しさん
2010/04/10(土) 03:29:170779デフォルトの名無しさん
2010/04/10(土) 10:43:59サーバアプリと圏論は全く関係ない。
F1 ドライバーだけどチャーハン上手く作れますかね、という質問といっしょ。
Haskell が得意な人向けの圏論の入門書やサイトもおそらく無い。
Haskell が得意であることと圏論が分かることもほとんど無関係だから。
「Conceptual Mathematics : A first introduction to categories」
この本の第2版(赤い本)でも読んで、まずは圏論の雰囲気でも掴むと良い。
各階段の段差が低いから、日本語で書かれた圏論関係の本よりよほど読みやすいと思う。
0780デフォルトの名無しさん
2010/04/10(土) 10:45:09http://www.amazon.co.jp/dp/4627018304
見た感じとしては易しそうな感じだった。読んではない。
0781デフォルトの名無しさん
2010/04/10(土) 10:50:450782デフォルトの名無しさん
2010/04/10(土) 10:59:27http://ci.nii.ac.jp/naid/110003743465
0783デフォルトの名無しさん
2010/04/10(土) 11:09:58理論とは適当に折り合いをつけてプログラムしろぐらいの意味しかないだろ。
0784デフォルトの名無しさん
2010/04/10(土) 12:13:03http://coolee.at.infoseek.co.jp/kenron.html#-1
0785デフォルトの名無しさん
2010/04/10(土) 12:18:28ttp://d.hatena.ne.jp/m-hiyama/20060821/1156120185
0786デフォルトの名無しさん
2010/04/10(土) 12:29:370787デフォルトの名無しさん
2010/04/10(土) 12:34:330788デフォルトの名無しさん
2010/04/10(土) 12:47:300789デフォルトの名無しさん
2010/04/10(土) 12:49:16http://www.amazon.com/Categories-Computer-Science-Cambridge-Texts/dp/0521422264
0790デフォルトの名無しさん
2010/04/10(土) 14:21:14C言語が得意な人向けの線形代数とかの入門書はたくさんあるんだけど
0791デフォルトの名無しさん
2010/04/10(土) 15:10:540792デフォルトの名無しさん
2010/04/10(土) 17:30:07数学を嗜んでいる人なら意識せずに普段から使ってるよ。
0793デフォルトの名無しさん
2010/04/10(土) 17:33:40彼がホワイトボードになにやら図やら式やらを書き始めたのを見て、
あれ?君、圏論をどこで勉強したの?
って聞いたら、圏論?はい?
って答えが返ってきた。
それぐらい世の中に浸透してる。
0794デフォルトの名無しさん
2010/04/10(土) 19:44:210795デフォルトの名無しさん
2010/04/10(土) 19:47:140796デフォルトの名無しさん
2010/04/10(土) 20:10:06なんで?
0797デフォルトの名無しさん
2010/04/10(土) 20:28:51Which language you recommend instead of Haskell?
0798デフォルトの名無しさん
2010/04/10(土) 20:47:23知ったかぶりするには何を押さえておけばいいの?
0799デフォルトの名無しさん
2010/04/10(土) 20:58:45常に詰め込みつづけるために作られた言語なわけだから、
開発が止まらない限り最もモダンな言語の一つなわけだけどw
0800デフォルトの名無しさん
2010/04/10(土) 21:01:000801デフォルトの名無しさん
2010/04/10(土) 21:06:50Try Scala or Clojure. Scala is seemed to be probable, but I like Clojure better.
>>798
Haskell is 20 years old.
If you are an early adopter, go to Go.
If you want something unpopular, say Cat.
0802デフォルトの名無しさん
2010/04/10(土) 21:08:010803デフォルトの名無しさん
2010/04/10(土) 21:09:380804デフォルトの名無しさん
2010/04/10(土) 21:09:43言語のコアは変えられない。できるのは拡張だけ。
まあ意味論が数学に基づいているから一般的なプログラミング言語としては限界だろうけど
0805デフォルトの名無しさん
2010/04/10(土) 21:09:530806デフォルトの名無しさん
2010/04/10(土) 21:11:17限界があるならそこで開発は終わるだろ。
後はメンテだけします、って事になって終了。
0807デフォルトの名無しさん
2010/04/10(土) 21:16:22純関数言語としての根幹は変えられなくても、拡張の余地はある。
もっと手続的なほうが使いやすいかもしれないが、並列化のトレンドを考えれば抽象度が高いほうがいいだろう。
ゆえにHaskellが勝利する。
0808デフォルトの名無しさん
2010/04/10(土) 21:17:26書いたのは俺だが
0809デフォルトの名無しさん
2010/04/10(土) 21:21:40ttp://ja.wikipedia.org/wiki/%E9%96%A2%E6%95%B0%E5%9E%8B%E8%A8%80%E8%AA%9E
0810デフォルトの名無しさん
2010/04/10(土) 21:23:38日常的なことは他の言語を使ってればいい。
0811デフォルトの名無しさん
2010/04/10(土) 21:24:36Haskellはそもそもその始まりが純粋関数型のフラッグシップ。
それまで乱立していた関数型言語の人をみんなHaskellに結集させたんだから当然。
0812デフォルトの名無しさん
2010/04/10(土) 21:31:48Haskellやってるのは数学系の人じゃないんだけどね。
コンピュータサイエンスの人。
0813デフォルトの名無しさん
2010/04/10(土) 21:32:59いや、ここに挙がってる他のは古いか細ってるかみたいだったから、
ほかに新しいのいないのかなと思って。
0814デフォルトの名無しさん
2010/04/10(土) 21:44:06新しいのを作るのが意味ないからね。少なくとも研究目的では。
純粋かつ非正格評価という制約がある限り、先行するHaskellの劣化コピーにしかならない。
みんなHaskellに移ってしまったから、MirandaもCleanもリソースがない。
だからますますHaskellに集まる。
このポジティブフィードバック。
0815デフォルトの名無しさん
2010/04/10(土) 21:50:31たしか、それぞれ独自に研究してた人たちが究極のを作ろうと集結したんだっけ。
この頃の話とか、Haskell に魅了された研究者たちの話って書籍化されてないのかな。
インタビューとか交えたノンフィクションがあれば是非読んでみたい。
0816デフォルトの名無しさん
2010/04/10(土) 21:58:360817デフォルトの名無しさん
2010/04/10(土) 21:59:20Clean
0818デフォルトの名無しさん
2010/04/10(土) 22:00:54正格には、MirandaやCleanから人が移って減ったわけではない。
他の純粋な人たちがみんなでHaskellを作っただけ。
0819デフォルトの名無しさん
2010/04/10(土) 22:02:21レスどうもです。そうでしたか。
今はどうやって関数型の利用を進めるかを考える時期なんでしょうかね
0820デフォルトの名無しさん
2010/04/10(土) 22:10:03計算機理論の体系をフレームに他分野の理論を読み替えて、
具体的解を取得できる形式系を作ればいい。
0821デフォルトの名無しさん
2010/04/10(土) 22:20:54Haskellの型システムに対する拡張の研究はこれからも続くだろう。
ttp://cacm.acm.org/magazines/2010/2/69367-type-theory-comes-of-age/fulltext
0822デフォルトの名無しさん
2010/04/10(土) 22:24:22主観と客観がないまぜになった実学を洗練することができそうだな
0823デフォルトの名無しさん
2010/04/10(土) 22:25:28おめーかよw
おれは>>797だけど、厳密に言うとdoが抜けてるな
ちなみにScalaやClozureはJavaのランタイムに明るくないと
あんまり恩恵受けないってことはないの?
0824デフォルトの名無しさん
2010/04/10(土) 22:42:43確かにプログラミング言語を仕事で使うにはランタイムの知識も必要だといわれている。
しかしGHCも遅延評価のおかげでとても不可解だ。サーバでは使えないだろう。
ところでScalaもClojureも末尾最適化をしないらしい。
再帰ではなくイテレーティブに書かなければいけない。
関数型言語と称するには無理があるんじゃないか。
0825デフォルトの名無しさん
2010/04/10(土) 22:51:420826デフォルトの名無しさん
2010/04/10(土) 22:54:220827デフォルトの名無しさん
2010/04/10(土) 22:54:220828デフォルトの名無しさん
2010/04/10(土) 23:18:03すべての関数をIO型にするしかない?
0829デフォルトの名無しさん
2010/04/10(土) 23:18:250830デフォルトの名無しさん
2010/04/10(土) 23:25:36なぜ Writer を使わない?
そういう意味ではないの?
0831デフォルトの名無しさん
2010/04/11(日) 00:32:55書き方が悪かった。
論点は,「ロギングを素直に挿入すると、関数の型を変えざるを得ないが、もっと良いやり方はないか?」
ということです。
0832デフォルトの名無しさん
2010/04/11(日) 01:58:38unsafeio
0833デフォルトの名無しさん
2010/04/11(日) 02:12:34デバッグのときとかに、関数の評価の様子を知りたいだけなら、traceを入れてghciで実行。
アプリケーションの機能としてログ出力を行いたいのなら、純粋な関数は引数が変わらないかぎりなんど実行しても動作が同じでそのログをとる必要はなく、
実行ごとに引数が変わるのは外部と関係するときだけだから、かならずIOモナドでログをとれるタイミングがあると思うんだけど?
モナド上で行わない限り、出力するタイミングを制御できないわけだし(評価順序をあれこれ考えればできなくもないけど)。
0834デフォルトの名無しさん
2010/04/11(日) 06:18:00最初期の人ではないが、RWHを書いたサリバンへのインタビューがネットで読める。
http://broadcast.oreilly.com/2009/01/the-power-of-haskell.html
0835デフォルトの名無しさん
2010/04/11(日) 06:33:12速い場合もあるし遅い場合もある。
値がサンクとして渡されるので、全体として時間コストも空間コストも予測が難しい。
GHCが遅いのは最適化よりも新規性目的で機能が取り込まれているせいもある。
0836デフォルトの名無しさん
2010/04/11(日) 07:10:570837デフォルトの名無しさん
2010/04/11(日) 12:54:54ありがと
ついでに、自分でも調べたら
「A History of Haskell: Being Lazy With Class」なる論文を見つけた。
http://research.microsoft.com/en-us/um/people/simonpj/papers/history-of-haskell/
面白そうなんで併せて読んでみる。
0838デフォルトの名無しさん
2010/04/11(日) 15:49:53なんだよこれ3パッケージに1つはエラーでビルド失敗するわ
0839デフォルトの名無しさん
2010/04/11(日) 15:55:100840デフォルトの名無しさん
2010/04/11(日) 16:18:280841デフォルトの名無しさん
2010/04/11(日) 16:19:250842デフォルトの名無しさん
2010/04/11(日) 16:31:22おまえら、なんでこんな時間に書き込みできるわけ?
普通の人なら学校や会社があるはずなんだけど
このことを知った親は悲しむぞ?
もっと、現実を見ようぜ。
0843デフォルトの名無しさん
2010/04/11(日) 16:52:190844デフォルトの名無しさん
2010/04/11(日) 17:11:07普通の人ならそんな質問をしないはずなんだけど。
もっと現実を見ようぜ。
0845デフォルトの名無しさん
2010/04/11(日) 17:17:250846デフォルトの名無しさん
2010/04/11(日) 17:20:320847デフォルトの名無しさん
2010/04/11(日) 17:23:55個別にインストールすれば成功するのに
なぜだろう
0848デフォルトの名無しさん
2010/04/11(日) 18:30:130849デフォルトの名無しさん
2010/04/11(日) 18:38:54死ねCabal
0850デフォルトの名無しさん
2010/04/11(日) 18:41:27では Cabal はもう死んだと思って、別の手段を使えばいいのではないか
0851デフォルトの名無しさん
2010/04/11(日) 19:10:390852デフォルトの名無しさん
2010/04/11(日) 19:12:51研究のためのモルモットに過ぎなかったから
0853Mail: sage
2010/04/12(月) 03:23:58エピかつモニックだがアイソではない射がhaskellにあるか否か、とか。
答えは知らんが、圏論とhaskell以外の知識はいらない問題。
あと、圏論だけだけど、モナド<T,η,μ>からKleisli Triple<T,η,*>を導き、
Kleisli Tripleが満たす法則を証明し、
逆にモナド則をKleisli Tripleから導くとか。
0854デフォルトの名無しさん
2010/04/13(火) 12:31:36lispはすでに習得しているレベルの人向けな本はないですか
0855デフォルトの名無しさん
2010/04/13(火) 12:38:15・Haskell: The Craft of Functional Programming
・Algorithms A Functional Programming Approach
・The Haskell School of Expression
辺り
普通のハスケルは読んだこと無いから「くどさ」がよく分からんが、
もしかしたら一番上のもちょっとくどいかも知れん。
もう少し分かるなら、
・the fun of programming
も良い
0856デフォルトの名無しさん
2010/04/13(火) 13:04:34RWHはダメなの?
分かるところは飛ばせばいいんだし
0857デフォルトの名無しさん
2010/04/13(火) 18:12:15http://www.ipsj.or.jp/07editj/promenade/4703.pdf
0858デフォルトの名無しさん
2010/04/13(火) 19:14:11余計なおしゃべりのないそれが一番いいと思うんだけどな
イメージが湧かないというのなら
http://blog.sigfpe.com/2006/08/you-could-have-invented-monads-and.html
0859デフォルトの名無しさん
2010/04/14(水) 06:37:270860デフォルトの名無しさん
2010/04/14(水) 10:15:50図式が可換、っていうのは
「その図中で、ある地点からある地点への経路をどのように取っても
(どういう射の合成を使っても)等しい」という意味なので、
例えば自然変換η:Ix->Tの自然性を示す可換図式は
ηA
IxA ---> TA
f| |Tf
V ηB V
IxB ---> TB
こいつは、以下の式と同じ意味
Ixf○ηB= ηA○Tf (fはA->Bの全ての射,Ixは恒等函手,Tは函手)
ドメイン、コドメインなんて図で考えてれば間違えることは無いので、
積極的に図式を使うといい。
0861デフォルトの名無しさん
2010/04/14(水) 18:08:18心当りがある方がいらっしゃれば教えてください
0862デフォルトの名無しさん
2010/04/14(水) 18:33:48> and an IO-Interface:Approaching a Theory of unsafePerformIO
辺り?
0863デフォルトの名無しさん
2010/04/14(水) 18:35:43> FUNDIO: A Lambda-Calculus With letrec, case, Constructors,
> and an IO-Interface:Approaching a Theory of unsafePerformIO
辺り?
0864デフォルトの名無しさん
2010/04/14(水) 18:36:44> FUNDIO: A Lambda-Calculus With letrec, case, Constructors,
> and an IO-Interface:Approaching a Theory of unsafePerformIO
じゃねえかな。
0865デフォルトの名無しさん
2010/04/14(水) 18:41:270866デフォルトの名無しさん
2010/04/14(水) 18:42:000867デフォルトの名無しさん
2010/04/14(水) 20:42:00左畳み込みでメモリリークが発生しやすくて、右畳み込みだと発生しにくい理由が分からんです
だれか教えてください
0868デフォルトの名無しさん
2010/04/14(水) 22:36:37foldr : (f a1 (f a2 (f a3 i)))
foldl : (f (f (f i a1) a2) a3)
分かりやすくするために、本来はひとつの同じ関数 f に評価順番号を添えて区別してみる。
foldr : (f1 a1 (f2 a2 (f3 a3 i)))
foldl : (f1 (f2 (f3 i a1) a2) a3)
foldr はまず関数 f1 を a1 に適用し、a1 を評価し、
その結果としてカリー化された関数(仮に fa1 とする)を返す。
この時点で、a1 は既に評価されてしまったので、a1 の情報はその評価結果の値のみが残り、
a1 を評価するために必要だったその他の情報はもう不要なので捨てられる。
つまり、メモリから破棄される。
(fa1 (f2 a2 (f3 a3 i)))
次に関数 fa1 を (f2 a2 (f3 a3 i)) に適用し、(f2 a2 (f3 a3 i)) を評価する。
そして関数 f2 を a2 に適用し、a2 を評価し、カリー化された関数 fa2 を返す。
(fa1 (fa2 (f3 a3 i)))
以下繰り返し。
foldl の方は次スレ >>869
0869デフォルトの名無しさん
2010/04/14(水) 22:38:18foldr : (f1 a1 (f2 a2 (f3 a3 i)))
foldl : (f1 (f2 (f3 i a1) a2) a3)
一方 foldl は関数 f1 を第1引数である (f2 (f3 i a1) a2) に適用しようとする。
このとき、第1引数を評価した結果のカリー化された関数がまだ完成していないから、
第2引数である a3 もまだ評価されずにメモリに残ることになる。
では、いつまで残るかというと、評価をシミュレートしてみれば分かるが、
括弧の最も奥の (f3 i a1) が評価され、(f2 その結果 a2) が評価され、
(f1 その結果) が評価された後のカリー化された関数がやっと a3 に適用されるまで残る。
入れ子の次のレベルの深さにある a2 はその一段階前までメモリに残る。
つまり、foldl はリストの後ろの方の要素ほどメモリに長く居続ける。
これがあなたの言うメモリリークというものの正体。
ちなみに、Haskell ではこういう一見分かりにくいメモリ領域の使用を
メモリリークではなくスペースリークと呼ぶ。
私はこう解釈しているが、もし違ってたらごめん。
0870デフォルトの名無しさん
2010/04/14(水) 22:55:24間違ってる
>その結果としてカリー化された関数(仮に fa1 とする)を返す。
>この時点で、a1 は既に評価されてしまったので、a1 の情報はその評価結果の値のみが残り、
fの定義のされ方にもよるけど、普通に二引数関数として定義されているなら(f a1)を評価してもa1は評価されない
仮に評価されたとしても、評価済みの値を持っておく必要があるので結局メモリが要る
>>867
foldrがfoldlに比べて空間効率がいいのは、畳み込みに使う関数が第二引数について非正格なとき(他にもある?)
例えば(++)は第二引数についてほぼ非正格なので、
concat = foldr (++) []
と定義すればO(1)の空間で動く(紙の上で追ってみれば分かると思う)のに対して
concat = foldl (++) []
だと酷いことになる
0871デフォルトの名無しさん
2010/04/14(水) 23:16:49>fの定義のされ方にもよるけど、普通に二引数関数として定義されているなら(f a1)を評価してもa1は評価されない
あ、そうか。
ベータ簡約はされるが(実装的にはポインタの差し替え程度だと思うが)、
評価までは未だされないのか。
やっぱり間違ってたか。
>>867 すまん、無視してくれ。
0872デフォルトの名無しさん
2010/04/15(木) 00:26:45foldr op init [x1:x2:x3]
=> x1 `op` (foldr op init [x2:x3])
=> x1 `op` (x2 `op` (foldr op init [x3]))
=> x1 `op` (x2 `op` (x3 `op` (foldr op init [])))
=> x1 `op` (x2 `op` (x3 `op` init))
foldl op init [x1:x2:x3]
=> foldl op (init `op` x1) [x2:x3]
=> foldl op ((init `op` x1) `op` x2) [x3]
=> foldl op (((init `op` x1) `op` x2) `op` x3) []
=> ((((init `op` x1) `op` x2) `op` x3)
一部だけしか必要ない場合(headとかtake 2とか)は空間効率も違ってくる。
>>870の言う通り、opの第二引数が非正格なとき(第二引数を評価しなくても値が返せる場合のことでしょ?)で
なおかつ第二引数が必要なかった場合はfoldrは左端のx1を返すだけで後の計算はしないしメモリにも残さない。
foldlの場合は第一要素を求める場合、最終行まで展開したあと、
ここから更に全部を計算していく必要があってメモリは要るわ最終的にいらないところまで計算するわで効率が悪い。
0873デフォルトの名無しさん
2010/04/15(木) 00:28:40t05l.hs: act n = foldl (+) 0 [1..n]
t05r.hs: act n = foldr (+) 0 [1..n]
t05l.hs, t05r.hs:
main = do
n' <- getArgs
let n = read (n' !!0)
putStrLn (show (act n))
>ghc -O2 --make {t05r.hs | t05l.hs} -prof -auto-all -caf-all -fforce-recomp
>t05l 5000000
12500002500000
>t05r +RTS -K100M -RTS 5000000
Stack space overflow: current size 100000000 bytes.
Use `+RTS -Ksize -RTS' to increase it.
>t05r +RTS -K800M -RTS 5000000
12500002500000
が得られた。
何かで、foldl のヒープの使用が、 foldr ではスタックの使用に変わったようなもの。。。
というようなことを聞いた不確かな記憶があるのですが、
サンクとはどのような情報をどのような形で保持しているのでしょうか?
0874デフォルトの名無しさん
2010/04/15(木) 00:51:18thunkってのは>>872にあるような、計算途中の式のこと。
x1 `op` (x2 `op` (x3 `op` init))みたいなの。
メモリ上にどう構成されているかは知らんが、遅延評価だとサンクが大きくなりがち。
0875870
2010/04/15(木) 08:59:34>>872
全部を評価する場合でも、結果を順番に読み捨てていくなら空間効率も変わるよ
たとえば、
print $ foldr (++) [] $ map (flip replicate ()) [0..n]
は全体としてO(1)の空間で動くけど、foldrをfoldlにするとO(n)になる
0876デフォルトの名無しさん
2010/04/15(木) 18:21:090877デフォルトの名無しさん
2010/04/15(木) 18:28:44foldl (+) 0 [1..10000000]とfoldr (+) 0 [1..10000000]をPreludeで走らせてタスクマネージャ見たけど、
大きな違いないね。
>>867
分かりません
0878デフォルトの名無しさん
2010/04/15(木) 19:46:53http://atnd.org/events/3820
0879デフォルトの名無しさん
2010/04/15(木) 21:49:35名古屋で似たようなミーティングはないですか?
東京まで行く時間がありません
0880デフォルトの名無しさん
2010/04/15(木) 22:03:42ビデオを撮ってストリーミングか、後で公開してくれるのなら
金払ってでも見るんだがなぁ
0881デフォルトの名無しさん
2010/04/15(木) 22:35:18その前に達人の書いたHaskellのコードを読んでみたい。
ってオレにおすすめのサイト教えて。よろ
0882デフォルトの名無しさん
2010/04/15(木) 22:41:52達人たちはこう考えるのか、という本だと思う
0883881
2010/04/15(木) 22:48:20http://www.amazon.co.jp/Programming-Cornerstones-Computing-Jeremy-Gibbons/dp/0333992857/ref=sr_1_1?ie=UTF8&s=english-books&qid=1271339095&sr=1-1
これ?
ってか、書籍代節約するために読書用のモニタ増やしたので、出来ればサイトで・・・
英語読めます
0884デフォルトの名無しさん
2010/04/15(木) 22:49:380885デフォルトの名無しさん
2010/04/15(木) 23:40:51名古屋であるとしたら OCaml Meeting かなあ
0886デフォルトの名無しさん
2010/04/16(金) 10:05:400887デフォルトの名無しさん
2010/04/16(金) 21:31:150888デフォルトの名無しさん
2010/04/17(土) 12:50:070889デフォルトの名無しさん
2010/04/17(土) 15:23:470890デフォルトの名無しさん
2010/04/17(土) 18:59:19分かった様な気がしたり、また分からなくなったりを繰り替えしております(笑)
0891デフォルトの名無しさん
2010/04/17(土) 19:24:26いやそれ以前にdiagram, universal construction, limitあたりもあやしい
0892デフォルトの名無しさん
2010/04/17(土) 20:21:30haskell的には、例えば「Int->String型のすべての単相関数」あるいは「型が同じ単相関数をすべて同一視して考えると…」っていうように考えればよいの?
0893デフォルトの名無しさん
2010/04/18(日) 01:25:20commutative diagramが分かればnatural transformが分かる。後は知らない。
>>892
単相関数なる単語は初めて聞くけど、同じ型の射を集めたものをhom集合と呼んでいるだけでしょ?
Haskellの型を圏の対象とし、Haskellの関数を射としてみればhom(Int,String)は
Int->Stringの関数全てをさす。
0894デフォルトの名無しさん
2010/04/18(日) 11:04:05報告っつっても、アジェンダの通りだったけど。
Simonさんの話はビューティフルコードの通り。STM は IORef みたいなことが
できるけど、アトミックな実行が保証されるからレースが起きないよとか、
ミサイル発射(という例が好きなんだなw)みたいな IO は型のおかげで
STM の中には入れられないよ、とか。
話のマクラに、Haskellって普及したよね、委員会による設計の言語
(一般には失敗するとされている)だけど、とかそんな話題もあった。
http://langpop.com/ のグラフをいくつか挙げたり。(LtUのグラフとか)
山本さんの話はmew.orgに使ってるHaskell製httpdについて。
性能の話が主だった。C10Kにも耐えるようにprefork使ったとかselect遅いとか。
山下さんの話は「擬データ」の紹介で、Pseudoというデータコンストラクタ(かな?)とか
:-> という演算子(Haskellの文法的にはコンストラクタだけど、多分コンストラクタじゃ
ないと思う)で、擬データから値を取り出す...のかな。ちょっと理解しきれなかった。
当日のプレゼン資料どっかで公開しないのかな?
0895デフォルトの名無しさん
2010/04/18(日) 19:37:52積極的に使おうと思います
0896デフォルトの名無しさん
2010/04/18(日) 20:40:46STMモナドの中に(小細工しなければ)普通のIOを入れられない、ってそんなに有益かなぁ。
STMモナドを入れ子にしてしまう危険を避けられるという点は有益だと思うけど。
0897デフォルトの名無しさん
2010/04/18(日) 21:03:560899デフォルトの名無しさん
2010/04/18(日) 22:08:42http://www.cambridge.org/uk/catalogue/catalogue.asp?isbn=9780521513388
0900デフォルトの名無しさん
2010/04/18(日) 22:45:390901デフォルトの名無しさん
2010/04/18(日) 23:36:01気の早いこって
0902デフォルトの名無しさん
2010/04/19(月) 00:13:390903デフォルトの名無しさん
2010/04/19(月) 03:54:430904デフォルトの名無しさん
2010/04/19(月) 04:44:510905デフォルトの名無しさん
2010/04/19(月) 17:31:26OpenGLのウィンドウを閉じたときに処理が終わるようにってできないの?
Haskell 6.4.2 だと勝手に閉じるんだけど、
Haskell 6.10.4 だとならない。
**
windows 7
Haskell 6.10.4
HOpenGL 2.4.0.1
0906デフォルトの名無しさん
2010/04/19(月) 18:35:140907デフォルトの名無しさん
2010/04/19(月) 21:09:49ttp://mono.kmc.gr.jp/~oxy/w/?Lazy+Evaluation
中身がお互いに参照されてループになってて、GCでお掃除されず永久にメモリに居ることになったりするん?
0908デフォルトの名無しさん
2010/04/19(月) 21:41:32循環参照で困るのはリファレンスカウント GC くらいじゃね?
それもアルゴリズムを工夫することで解消できるし
0909デフォルトの名無しさん
2010/04/19(月) 21:50:33GHCのGCは、コピーGCとマークアンドスウィープGCを併用した世代別GCだと思うから、心配ないのでは?
ttp://hackage.haskell.org/trac/ghc/wiki/GarbageCollectorNotes
ttp://ja.wikipedia.org/wiki/%E4%B8%96%E4%BB%A3%E5%88%A5%E3%82%AC%E3%83%99%E3%83%BC%E3%82%B8%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3
0910デフォルトの名無しさん
2010/04/20(火) 09:36:3760usドルか。レートよりも高いな。
www.cambridge.org/us/catalogue/catalogue.asp?isbn=0521513383
amazon.co.jpだと6319円
www.amazon.co.jp/Pearls-Functional-Algorithm-Design-Richard/dp/0521513383
0911デフォルトの名無しさん
2010/04/21(水) 00:33:13:t map . (*)
> map . (*) :: (Num a) => a -> [a] -> [a]
let f = map . (*)
> f :: Integer -> [Integer] -> [Integer]
束縛させないものも束縛させたものも、ともに型は明示していないのに、
一方はポリモーフィックでもう一方に Integer 型に決まってしまうのは何故でしょうか。
0912デフォルトの名無しさん
2010/04/21(水) 06:02:36なんでやろ
0913デフォルトの名無しさん
2010/04/21(水) 07:04:19http://www.kotha.net/ghcguide_ja/latest/interactive-evaluation.html
0914デフォルトの名無しさん
2010/04/21(水) 07:41:46単相性制限じゃないかなあ。
Prelude> let g x = map . (*) $ x
Prelude> :t g
g :: (Num a) => a -> [a] -> [a]
俺もよく理解していないんだけど。
http://www.sampou.org/haskell/report-revised-j/decls.html#sect4.5.5
0915デフォルトの名無しさん
2010/04/21(水) 09:38:29つ let f = map . (*) in f 1.1 [1,2,3]
0916デフォルトの名無しさん
2010/04/22(木) 18:14:460917デフォルトの名無しさん
2010/04/22(木) 22:19:54ありがとう。
でも、すいません、正直言ってまだ理解できていません。
とくに、型が決定されるのが束縛という操作の時に起こるのがいまいち。
f に束縛したのなら、その f を何か引数に適用する時に、
その引数と併せて推論すればいいのにと思うんですが・・・
ただ、Integer 型に勝手に決まって困るというのは、
単に型シグネチャを明示してやれば解決することなので、
べつに切羽詰まった問題でもないです。
教えていただいたドキュメントをじっくり読んでゆっくり勉強してみます。
>>915
おそらく、let と in を併せてひとつの式と考えられるので、
その場合はひとつの式の中で適切に型推論されるのだと思います。
0918デフォルトの名無しさん
2010/04/22(木) 22:36:03>f に束縛したのなら、その f を何か引数に適用する時に、
>その引数と併せて推論すればいいのにと思うんですが・・・
Haskell98ではまさにそうなってる
単相性制限が適用された変数の型には、そのモジュール内での使われ方だけからでは推論できない場合のみデフォルト化規則が適用される
こういうことができるのは、一つのモジュールの型検査を一度にやることが前提だから
ghciの場合は宣言が入力されるたびにその型を決定するような設計になっている
つまり、使われ方を見ずに型を決めないといけないので、
単相性制限が適用されたら自動的にデフォルト規則も適用されることになる
0919デフォルトの名無しさん
2010/04/22(木) 23:04:03> ghciの場合は宣言が入力されるたびにその型を決定するような設計になっている
そこがポイントで、理屈どうのこうのではなく、
単にそういう戦略を採っているという事なんですね。
(まぁ、いくつかある戦略のうちで
最も開発者の目的にあったものを採用したのでしょうけど)
宣言が入力されるたびにその型を決定する戦略と、
宣言の以降にその宣言されたものを使うまで決定を保留にしておく戦略とで、
インタプリタである GHCi という環境下での
それぞれのメリット、デメリットが気になるところですが、
とりあえずは納得できました。
単相性制限がよく分からないので、これについてはまだ勉強中です。
0920デフォルトの名無しさん
2010/04/22(木) 23:51:11-XNoMonomorphismRestriction
や
{-# LANGUAGE NoMonomorphismRestriction #-}
で無効にできます
0921デフォルトの名無しさん
2010/04/23(金) 00:40:060922デフォルトの名無しさん
2010/04/23(金) 16:01:520923デフォルトの名無しさん
2010/04/23(金) 16:43:170924デフォルトの名無しさん
2010/04/23(金) 17:38:31オレ今RWH2回目読んでるw
でも今回は手を動かしていないので進むスピードが段違いだが・・・
0925デフォルトの名無しさん
2010/04/23(金) 19:39:17Haskell で数独でも解いてろ
エレガントに組もうとすると意外に悩んでいい勉強になる
0926デフォルトの名無しさん
2010/04/24(土) 13:23:09test.o: In function `sFo_info':
(.text+0x14f): undefined reference to `__stginit_regexzmposixzm0zi93zi1_TextziRegexziPosix_'
collect2: ld returned 1 exit status
test.hs の中身はこんな(↓)感じです
import Text.Regex.Posix
main = putStrLn "test"
ubuntu9.10をインストールして Synpatic でHaskellの検索で出てくるパッケージをすべてインストールしました。
なんか間違ってますでしょうか?
0927デフォルトの名無しさん
2010/04/24(土) 13:25:58E: libghc6-pandoc-dev: サブプロセス installed post-installation script はエラー終了ステータス 1 を返しました
0928デフォルトの名無しさん
2010/04/24(土) 16:41:24似たようなことになったことがある
regexじゃなくてhsloggerだったけど
ググっても何も出なくて途方に暮れてたけど
いつの間にかビルドが通ってそのまま
ちなみにghcは6.12.1
0929デフォルトの名無しさん
2010/04/24(土) 17:13:49ghc -package regex-compat test.hs
あるいは、
ghc --make test.hs
0930デフォルトの名無しさん
2010/04/24(土) 17:16:03compatでもリンク通っちゃったが
0931デフォルトの名無しさん
2010/04/24(土) 17:31:39今は、ubuntuのパッケージは全部アンインストールして、GHCの最新版を$HOME以下にインストール+cabal にしている。
でも、gtk2hsがコンパイルできないんだよね… 悩む。
0932デフォルトの名無しさん
2010/04/24(土) 18:47:42ghc-6.12.1でビルドするためのgtk2hs用パッチがあるよ
6.12.2で使えるかは知らないけど
ttp://www.mail-archive.com/[email protected]/msg00484.html
0933デフォルトの名無しさん
2010/04/24(土) 18:50:350934デフォルトの名無しさん
2010/04/24(土) 21:35:46って、home page に書いているから、
もうちょっと経つと、幸せになれるかもしれない。
0935デフォルトの名無しさん
2010/04/24(土) 23:54:48>>932
Darcsレポジトリに入ってるgtk2hsの開発版は既にパッチが当てられている。
私はクリーンなghcでのビルドに成功した。
しかし一般にHaskellのコンパイルは依存パッケージ等の問題で失敗しやすいので、うまくいく保証はない。
0936デフォルトの名無しさん
2010/04/25(日) 05:41:570937デフォルトの名無しさん
2010/04/26(月) 21:39:15ネットで取ってこられるPDFと内容大分違う?
0938デフォルトの名無しさん
2010/04/27(火) 00:56:15ウェブで公開されているドラフトのほうは読んでないけど、章の構成も違ったような気がする
って、見ればわかるか
0939デフォルトの名無しさん
2010/04/27(火) 10:02:53最近,洋書はwww.bookdepository.co.ukで買うことが増えてる
amazon.co.jp, amazon.comよりも安いことが多い
梱包は良くないけどね
0940デフォルトの名無しさん
2010/04/27(火) 14:58:37.co.ukのほう?俺は.comだ。
送料無料だから1冊だけだと安い
複数冊だとamazon.comのほうが安いかもしれない
0941デフォルトの名無しさん
2010/04/27(火) 18:00:15をHaskell(GHC)に移植しているんですが
GHCではソケット毎にforkIO(内部的にはselect()らしい)するのが一般的なんでしょうか?
epollを使うような例もググればあるにはあるんですが・・
優先度はCPU/メモリ負荷>>>スループット、OSはLinuxです。
0942デフォルトの名無しさん
2010/04/28(水) 21:16:05もしかしてHaskellって難しい?
みんな本当にRWHの内容全部理解できてるの? 実はぼんやりなんでそ?
0943デフォルトの名無しさん
2010/04/28(水) 23:17:39Haskellを全部理解するには、離散数学の素養や、進歩しつづけるGHCコンパイラの実装技術に関する知識なども必要だからね。
そこまでわかる人はほとんどいないだろう。
Haskellはみんなで研究開発する言語です
0944デフォルトの名無しさん
2010/04/28(水) 23:20:040945デフォルトの名無しさん
2010/04/28(水) 23:23:24Haskell以外にもやってるが
0946942
2010/04/29(木) 01:03:17THX
ちょっとホッとしたわ。プログラミングとコンピュータの構造については
それほど疎いわけではないと思うのに、たまに読んでる内容が分から
なくなることがあって・・・
気にせず進むことにする
0948デフォルトの名無しさん
2010/04/29(木) 02:02:38さすがにそれは長すぎ
0949デフォルトの名無しさん
2010/04/29(木) 09:21:51でも、なにか作り始めると「動けばいいや」ってなって、全然
言語に詳しくなってない。。
なので、どっちにしても結局理解してない。
0950デフォルトの名無しさん
2010/04/29(木) 10:32:170952デフォルトの名無しさん
2010/04/29(木) 12:56:12RWHは例題が悪すぎる。
Haskell以前に例題が理解できない。
はじめて読む人は、まず例題の解説が必要。何をやろうとしてるのか分からない。
(C言語で解いた場合のプログラムコードが載ってるけど、いきなり見せられるとC屋さんでも首をかしげるレベル)
さらに、文法やイディオムのまとめがないので、後から文法を調べるときにももう一度分かりにくい例題を始めから読まないといけない。
あと、プログラミング論全般の話題をしてるときに、いきなりHaskell固有の文法の解説が入って話が飛ぶのも良くない。
結果、一つの記号や文法の説明が複数の章に散在してしまい、ハンドブックとしても使いにくくなっている。
0953デフォルトの名無しさん
2010/04/29(木) 13:44:32使い方を間違えてないか。ハンドブックは別に用意すればいいw
例題が何とかは特に感じなかったのでパス
0954デフォルトの名無しさん
2010/04/29(木) 14:11:030955デフォルトの名無しさん
2010/04/29(木) 14:13:380956デフォルトの名無しさん
2010/04/29(木) 14:29:05ハンドブックとしてのお薦めは?
0957デフォルトの名無しさん
2010/04/29(木) 15:29:43ネット。チュートリアルとリファレンスと論文を使い分けるのが正しいアプローチ。
0958デフォルトの名無しさん
2010/04/29(木) 15:48:460959デフォルトの名無しさん
2010/04/29(木) 15:51:010960デフォルトの名無しさん
2010/04/29(木) 15:51:35違う
0961デフォルトの名無しさん
2010/04/29(木) 15:52:56持ってるから何が書いてあるか分かる。
ライブラリの解説ぐらいしかみどころがない。
0962デフォルトの名無しさん
2010/04/29(木) 16:18:16リストとか正規表現の関数も一部しか出てこない
0963デフォルトの名無しさん
2010/04/29(木) 17:01:38ライブラリ解説書はライブラリ内の多くの機能を辞書的に解説す事に価値がある。
本書は、その機能をどう使うのか、なぜ使うのかを学べるとともに、
一般的なライブラリ解説書では学べない多くのことも学べる。
たとえば第5章では JSON 用のライブラリを書くことを通じて、
代数データ型で構文木を作り、それをルートから辿りながら
ノードをひとつひとつ処理していく方法を学ぶ。
他にも第9章では、可能な限り IO モナドに頼らずに、
プログラムの振る舞いを指示する表現力豊かな機能を作る問題に対して、
DSL という回答を与えて実演して見せている。
第10章なら、条件分岐の深い入れ子になりがちなデータ解析という処理を
状態遷移と捕らえ、かつ運ぶべき状態情報を隠蔽する方法を提示しており、
また後の章でさらに抽象化している。
このような方法論を学べる「ライブラリ解説書」はまず無い。
他にも例を提示しようか?
0964デフォルトの名無しさん
2010/04/29(木) 17:16:54ネットでお薦めは?
0965デフォルトの名無しさん
2010/04/29(木) 17:29:53方法論、ぴったりの言葉ですね。
Real World Haskell (RWH)はHaskellプログラミングのマイルストーンです。
言語仕様や個別のライブラリについては他のドキュメンテーションをあたるべきです。
RWHはHaskell学習の出発点、ルートノードとして使われるべきリソースです。
0966デフォルトの名無しさん
2010/04/29(木) 17:31:11そもそもJSONのライブラリを作るという例題が解説書として不適切な気が
0967デフォルトの名無しさん
2010/04/29(木) 17:31:58どーして?
0968デフォルトの名無しさん
2010/04/29(木) 18:06:18・JSON形式自体を理解するのにワンステップ必要だから
・Javaの意味の用語(オブジェクト、型、構成子)を知ってると微妙に混乱する
で、なんとか理解した気持ちになってページめくったら、Justで包むとかいう表現が出てきてワケ分かんないって
普通に show を別途実装するとかいう例題でよかったと思うのは俺だけか…
0969デフォルトの名無しさん
2010/04/29(木) 18:14:14簡単な紹介はするが、詳細は自分で調べてというのはごく普通の態度だろう。
>・Javaの意味の用語(オブジェクト、型、構成子)を知ってると微妙に混乱する
Javaは関係ない。そもそもJavaが出てきたのはHaskellの後であり、十分な理論的基盤を構築せずに開発を始めたJavaが悪い
0970デフォルトの名無しさん
2010/04/29(木) 18:19:39十分な理論的基盤を構築せずに開発を始めたJavaのために作られたJSONを例題に使うのは良くないと思う
0971デフォルトの名無しさん
2010/04/29(木) 18:20:140972デフォルトの名無しさん
2010/04/29(木) 18:35:43何をやらんとしてるかは分かったけど、でもまだ ? なところはある。
一応CとHaskellだけで全て賄おうと思ってるんで、先に進みます。
0973デフォルトの名無しさん
2010/04/29(木) 18:37:47Javaのために作られたというのは知らなかった
0974デフォルトの名無しさん
2010/04/29(木) 18:57:13HTTPでデータ転送を行うときには、(Javaの世界の)オブジェクトをString型に変換(シリアライズ)してやりとりしている
(Javaの世界の)オブジェクトをString型に変換する手法のひとつがJSON
という最低限の知識を持ってないと、読むときにひっかかる
他の章でも、「プログラムコードのほとんどは例外処理」とか「ボイラープレートは面倒くさい」とか「ハンドル」とか「シノニム」とか「クロージャ」とか、最低限のリテラシを持ってないとスラスラ読めない
そういう本です
0975デフォルトの名無しさん
2010/04/29(木) 19:01:11JSONぐらいで批判されるとは思わないだろう
0976デフォルトの名無しさん
2010/04/29(木) 19:03:47だからJSONとJavaは関係ない。
0977デフォルトの名無しさん
2010/04/29(木) 19:03:570978デフォルトの名無しさん
2010/04/29(木) 19:06:23synonymも同様。普通の英文法用語。
0979デフォルトの名無しさん
2010/04/29(木) 19:09:47コンピュータ言語とは構文解析するときの仕様である、という立場をとると、JSONもJava由来
0980デフォルトの名無しさん
2010/04/29(木) 19:10:39わけがわからない。何でもJavaで考える頭の悪い子か?
0981デフォルトの名無しさん
2010/04/29(木) 19:11:08Main Entry: boil・er・plate
Pronunciation: \-?pl?t\
Function: noun
Date: 1897
1 : syndicated material supplied especially to weekly newspapers in matrix or plate form
2 a : standardized text b : formulaic or hackneyed language <bureaucratic boilerplate>
3 : tightly packed icy snow
うーん、わからん (´゚ω゚`)
2 かな・・・
0982デフォルトの名無しさん
2010/04/29(木) 19:11:130983デフォルトの名無しさん
2010/04/29(木) 19:12:04○ かわいそう
0984デフォルトの名無しさん
2010/04/29(木) 19:12:23最低限の知識…いや、自分は読んだとき知らなかったけど、5.1を読み、そこで紹介されてる
web頁見るかwikiでもつつくかして、まあこんなもんがあるのか位に思えば済んだ事だけどね
そろそろ次スレ建てましょうか?
0985デフォルトの名無しさん
2010/04/29(木) 19:16:05オブジェクト内のパラメータが増えるとセッター/ゲッターメソッドが増えてメンドいという経験がないと、ボイラープレートが云々の話はムズいと思う。
「type はただのシノニム」という説明もかえってムズい。
0986デフォルトの名無しさん
2010/04/29(木) 19:18:030987デフォルトの名無しさん
2010/04/29(木) 19:18:29???
その前の部分を読んでいれば、Haskellでも抽象度の低いboilerplateな書き方は
読みにくいのがわかるはずだが?
0988デフォルトの名無しさん
2010/04/29(木) 19:19:230989デフォルトの名無しさん
2010/04/29(木) 19:24:48ttp://pc12.2ch.net/test/read.cgi/tech/1272536128/
0990デフォルトの名無しさん
2010/04/29(木) 19:29:47例えば57ページだけど、ボイラープレートでも読みやすいけど。
nicerID (Book id _ _ ) = id
nicerTitle (Book _ title _ ) = title
nicerAuthors (Book _ _ authors) = authors
ここの説明だけ読むと、分かりやすいけどただコードをたくさん書くのがウンザりだから、ボイラープレートコードを避けてるようにしか見えない。
0991デフォルトの名無しさん
2010/04/29(木) 19:32:06誰に対して言ってるんだ?
0992デフォルトの名無しさん
2010/04/29(木) 19:39:30おつおつ
0993デフォルトの名無しさん
2010/04/29(木) 19:40:33JSON という名前がついたシリアライズの方法のひとつを例に取るというだけのこと。
数値や文字列、オブジェクトなどを簡単な文字列でシリアライズする
というくらいの前知識だけで、[5.6 JSON データを印字する] から
構文木をたどって処理する方法を学ぶのに十分だよ。
(最低限の簡単な前知識はその前の節で説明されてるし)。
俺も JSON が何か知らずに読み初めたけど方法論を学べたし、
理解できた後でも未だに JSON なんて実際に一回も使ったことがない。
0994デフォルトの名無しさん
2010/04/29(木) 20:07:35前後にバイトコードの話もあったから、混乱するっちゃ
0995デフォルトの名無しさん
2010/04/29(木) 20:28:03いや、"Real World"って立ち位置で作者は良くまとめてくれていると思うよ。
0996デフォルトの名無しさん
2010/04/29(木) 20:32:140997デフォルトの名無しさん
2010/04/29(木) 20:39:58プログラミングHaskellはふつうと並ぶ立ち位置だよね?
0998デフォルトの名無しさん
2010/04/29(木) 20:47:20いまどきの子は直列化とか言われたら単三電池ですかって答えるぞ
埋め
0999デフォルトの名無しさん
2010/04/29(木) 20:49:54The Haskell School of Expression: Learning Functional Programming through Multimedia
The Haskell Road To Logic, Maths And Programming
洋書で分かりやすいのってどれですか?
1000はあきらめた
1000デフォルトの名無しさん
2010/04/29(木) 20:55:2810011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。