関数型プログラミング言語Haskell Part11
- 1 :デフォルトの名無しさん:2009/09/08(火) 13:03:13
- haskell.org
http://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の仕様により、行頭の半角スペースは表示されません。
コードをインデントしたいときは、代わりに または全角スペースを使うことができます。
- 2 :デフォルトの名無しさん: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
- 3 :デフォルトの名無しさん: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/
- 4 :デフォルトの名無しさん:2009/09/08(火) 13:07:56
- GHC 6.6 の日本語の取り扱い
1. ソース中の文字列 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 のコメントに書いてある)
- 5 :デフォルトの名無しさん:2009/09/08(火) 13:09:24
- ・そのほかの日本語の扱い
Haskell98によると、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(それ以外)
未調査。
- 6 :デフォルトの名無しさん: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)が正しく動作しない。
- 7 :デフォルトの名無しさん: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: : : : : :.\
- 8 :デフォルトの名無しさん:2009/09/08(火) 19:40:24
- >>1乙じゃない。もう建てなくていいスレ
- 9 :デフォルトの名無しさん:2009/09/08(火) 22:10:55
- 乙一
- 10 :デフォルトの名無しさん:2009/09/09(水) 01:00:48
- 実践 Haskell (real world haskell 和訳本)
今月の予定らしいけどオライリーの近刊に出てないねー
- 11 :デフォルトの名無しさん: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 `>>='
- 12 :デフォルトの名無しさん:2009/09/12(土) 21:26:16
- >>10
今月じゃないって聞いてるよ。
近刊に出てきてないのはそのせいじゃないの?
- 13 :デフォルトの名無しさん:2009/09/13(日) 02:35:04
- >>11
標準のモナドは要素の型に制約を掛けられない
逆に言うと、Probabilityは要素の型に制約があるのでMonadになっていない
だからどういう注釈をつけても無理
- 14 :デフォルトの名無しさん:2009/09/13(日) 11:33:53
- >>13
ありがとう
ってことはリフレクションつかって自分で union 関数つくるしかないってことですね
しかし
Prelude Data.Set Data.Typeable> typeOf (empty :: Set Int)
>Set Int
はいいとして
Prelude Data.Set Data.Typeable> typeOf (empty :: (Ord a) => Set a)
>Set ()
これは納得いかねぇ…
- 15 :デフォルトの名無しさん:2009/09/13(日) 14:42:57
- http://www.haskell.org/ghc/docs/latest/html/users_guide/interactive-evaluation.html#extended-default-rules
これだな
プロンプトじゃなくてファイルに書けばこの規則は適用されないから、ちゃんと曖昧エラーになるはず
- 16 :デフォルトの名無しさん:2009/09/15(火) 00:12:55
- デアゴスティーニなんかが
「週間Haskellコンパイラ」
なんて出してくれたら面白いのに
- 17 :デフォルトの名無しさん:2009/09/15(火) 19:32:23
- 付録なんだよ?
- 18 :デフォルトの名無しさん:2009/09/15(火) 19:48:12
- 余り物の福袋
- 19 :デフォルトの名無しさん:2009/09/15(火) 19:57:21
- >>17
んなもんはライブラリの解説がついた小冊子や小さなポスターでいいだろ。
トイレに貼って覚えるんだ。
- 20 :デフォルトの名無しさん:2009/09/15(火) 20:01:21
- >>11
モナド構造わかってないけど、Distributionって超関数の意味?
ということは、Probabilityは確率測度ってこと?
- 21 :デフォルトの名無しさん:2009/09/17(木) 14:35:02
- Haskellでσ-集合体クラスを定義して下さい
- 22 :デフォルトの名無しさん:2009/09/19(土) 13:45:46
- 「The haskell School of Expression」を読んでいて、172 ページで躓きました。
lifting というものの考え方がいまいちよく分かりません。
頭が混乱しています。
このページの例で言えば、lifting の考え方を使って
Picture でできる事を Animation でもできるようにしているんですよね。
では、先の章で定義した containsR 関数や containsS 関数は、
Resion から Shape への、あるいは Shape から Region への lifting ではないのですか。
Region できる contain の演算を Shape でもできるようにする、
あるいはその逆が実現されているような気がするのですが。
- 23 :デフォルトの名無しさん:2009/09/19(土) 13:49:54
- >>10
10月に出るみたいだね
Books: 新刊・近刊情報
http://www.oreilly.co.jp/catalog/soon.html
- 24 :デフォルトの名無しさん:2009/09/19(土) 18:42:38
- Programming in Haskell さ、作者さまのページ見ると
A Japanese version will be published around October 2009.
と、なってるよ。
第二次 haskell 本ブーム?
- 25 :デフォルトの名無しさん:2009/09/20(日) 16:16:00
- 2冊でブームってのも悲しいな。
- 26 :デフォルトの名無しさん:2009/09/20(日) 22:41:47
- 千里の途も一歩から
- 27 :デフォルトの名無しさん:2009/09/21(月) 01:49:59
- あれ、入門書が2冊あるから3冊目では?
あと岩波からもGofer本が出ていたから、それを入れると4冊目か
- 28 :デフォルトの名無しさん:2009/09/21(月) 02:53:26
- 今年の十月に予定されてるのが二冊ってことでしょ。
- 29 :デフォルトの名無しさん:2009/09/21(月) 03:14:22
- あ、そういふことですたか。吊ってきます
- 30 :デフォルトの名無しさん:2009/09/21(月) 03:43:44
- 4冊でブームってのも悲しいな。
- 31 :デフォルトの名無しさん:2009/09/21(月) 12:12:54
- Gofer本って、岩波講座ソフトウェア科学 4 のこと?
- 32 :デフォルトの名無しさん:2009/09/21(月) 15:38:48
- 型 A に対して可能な演算と同類の演算を型 B に対してもできるようにする、
という事が既に Lifting になっているのでしょうか。
型 A に対して可能な演算と型 B に対して可能な同類の演算の名前が違っていても、
それは Lifting には変わりなく、ただ同じ名前の演算が定義されていた方が
より洗練された Lifting だということなのでしょうか。
- 33 :デフォルトの名無しさん:2009/09/22(火) 09:08:38
- lift,liftってよく聞くけど、なんかあるの?
普通出会わないだろ。liftMぐらいじゃね?
なんなのliftって?
- 34 :デフォルトの名無しさん:2009/09/22(火) 09:11:41
- 処理系の設計に足をつっこむと
しょっぱなで出くわすのがlambda lifting
- 35 :デフォルトの名無しさん:2009/09/22(火) 10:04:11
- lambda liftなんてあるのか。
でもいまの話ってtype lift(型持ち上げ)の話だろ。
- 36 :デフォルトの名無しさん:2009/09/22(火) 10:10:02
- >>32
Payton JonesのImplementation of Functional Programming Languages
がどこかにpdfであったはず
13章を読むといいよ
- 37 :デフォルトの名無しさん:2009/09/22(火) 10:13:04
- >>32じゃなくて>>35だった
- 38 :デフォルトの名無しさん:2009/09/22(火) 11:23:12
- >>35
私が質問しているのは恐らく type lift の事だと思います。
もし type lift がどういうものか知っているのでしたら、
是非教えて頂きたいです。
172 ページを付近を飛ばしてとりあえず先に読み進んでみましたが、
やはり意味が分からず、内容が頭に入ってきません。
はっきりさせたいです。
- 39 :デフォルトの名無しさん:2009/09/22(火) 23:39:45
- なんかすげー面白そうだな
- 40 :デフォルトの名無しさん:2009/09/23(水) 06:08:41
- Liftingというコンセプトを理解したければ、
俺が知りたいのはtype liftingだ、lambda liftingなんて関係ない、
なんて言ってないで、関係あるものはさっさと読んだほうがいいぜ?
PJの説明はそう悪くないし。
- 41 :デフォルトの名無しさん:2009/09/23(水) 07:33:17
- >>38
あんまり参考にならないだろうけど、型持ち上げはゲーデル(もしくはPM)にはじまる。
不完全性定理の証明に出てくる。
定義としては、
ある論理式aと別の論理式bがあるとして、
bがaの型持ち上げであるとは、bの全ての型のタイプ数を同じ数だけ
増加させると、bがaになることを指す。
というもの。PMがベースなのでそのままは適用できないけど、liftMを
使ってほぼ同じだと思われることは一応出来る。
a -> b => [a] -> [b]
みたいなの。
実は、自分もおなじことずっと調べていて、情報が欲しい。
そっちでなんか分かったら教えてくれると嬉しいかも。>>36も読んでみる。
- 42 :41:2009/09/23(水) 07:44:25
- >a -> b => [a] -> [b]
じゃなかった。
a -> b -> (a,b) => [a] -> [b] -> [(a,b)]
だった。
タプルを作る関数を型持ち上げ=>直積を作る関数。
p x y = (x,y)
directProduct :: [a] -> [b] -> [(a,b)]
directProduct = liftM2 p
- 43 :デフォルトの名無しさん:2009/09/23(水) 11:55:56
- >>40
ちょっと待って、飛躍しないで欲しい。
lambda liftingなんて関係ないなんて一言も言ってないし思ってもない。
そもそも、type lift と lambda lifting の違いすら今は全く分からない。
ただ、>>35 の言い方から、lambda lift は今回の話には繋がらないのか、
と推測しただけです(あの言い方ならそう推測してもおかしくないと思うが)。
で、私も「Implementation of Functional Programming Languages」を落としたので、
読んでみます。
- 44 :デフォルトの名無しさん:2009/09/23(水) 12:57:40
- 実際、全然関係ないぞ
- 45 :デフォルトの名無しさん:2009/09/23(水) 20:51:05
- >>44
そうなんですか。
でも、やっぱりよく分かんないので、
とりあえず紹介された文献を読んでます。
まだ2章5節なんですけど、これはおもしろいですね。
ここまででもすごく勉強になります。
以前「Lambda-Calculus and Combinators an Introduction」を読んでいて、
p34 の不動点定理のところで意味が分からず挫折していたのですが、
ようやく意味が分かり、思わぬ収穫です。
13章にはほど遠いので、
lifting の意味はまだ全く分かんないですけど。
おもしろい文献の紹介、ありがとうございます。
- 46 :デフォルトの名無しさん:2009/09/24(木) 10:00:51
- 10年前にmonadと出会って以来、何千回と挫折してきた俺がついに悟った!
これは
単なる
イディオムだ
- 47 :デフォルトの名無しさん:2009/09/24(木) 10:43:42
- 最中どう?どうもなか?最中どう?どうもなか?最中どう?どうもなか?最中ど
う?どうもなか?最中どう?どうもなか?最中どう?どうもなか?最中どう?ど
うもなか?最中どう?どうもなか?もなかどう?どうもなか?もなかどう?どう
もなか?もなかどう?どうもなか?もなかどう?どうもなか?もなかどう?どう
もなか?もなかどう?どうもなか?もなかどう?どうもなか?もなどどう?どう
もなど?もなかどう?どうもなか?もなかどう?どうもなか?もなかどう?どう
もなか?もなかどう?どうもなか?もなかどう?どうもなか?もなかどう?どう
もなか?もなかどう?どうもなか?最中どう?どうもなか?最中どう?どうもな
か?最中どう?どうもなか?最中どう?どうもなか?最中どう?どうもなか?最
中どう?どうもなか?最中どう?どうもなか?最中どう?どうもなか?最中どう?
- 48 :デフォルトの名無しさん:2009/09/24(木) 14:13:51
- WINDOWS VISTA 環境に以下を参考にghcを導入した。
http://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
- 49 :デフォルトの名無しさん:2009/09/24(木) 16:19:33
- >>32
元の構造は保たないと。
ファンクタなんで。
- 50 :デフォルトの名無しさん:2009/09/24(木) 18:50:01
- 函手じゃなくて自然変換じゃないか。
一意に決定しないと使い物にならない。
- 51 :デフォルトの名無しさん:2009/09/24(木) 19:34:22
- 函手って見ると
ハルヒの射手座の日を思いだす
理由はよくわからない
- 52 :デフォルトの名無しさん:2009/09/24(木) 23:04:26
- slashdotのコメント欄はわかってないヤツが多いな。
http://slashdot.jp/developers/09/09/24/039226.shtml
こういう連中がいる会社は最悪だろうな。まさに老害。
- 53 :デフォルトの名無しさん:2009/09/24(木) 23:21:28
- どういう連中か目に浮かぶようだ
- 54 :デフォルトの名無しさん:2009/09/24(木) 23:30:38
- Agdaって今世界でもっとも難しい言語の1つだよね?
極めれば即仙人になれる難しさだよね?
俺写像定義するだけで投げたレベルだからあれだけど
- 55 :デフォルトの名無しさん:2009/09/24(木) 23:33:40
- ほんとか!ちょっとAgda勉強しにいってくる。
- 56 :デフォルトの名無しさん:2009/09/24(木) 23:48:37
- 魔法使い卒業検定には使えますか?
- 57 :デフォルトの名無しさん:2009/09/24(木) 23:49:59
- 卒業なんてない。
死ぬまで学徒。
- 58 :デフォルトの名無しさん:2009/09/26(土) 11:46:48
- real world agda が出てから勉強する!
- 59 :デフォルトの名無しさん:2009/09/26(土) 12:49:36
- >>54
別に難しくないじゃん。
数学系ならさほど障害は無いと思う。
- 60 :デフォルトの名無しさん:2009/09/26(土) 13:00:42
- >>54
Coqよりだいぶマシ
- 61 :デフォルトの名無しさん:2009/09/26(土) 22:47:02
- darcsからbzrに乗り換えるか悩む
- 62 :デフォルトの名無しさん:2009/09/26(土) 22:55:22
- darcsって正直Haskell製以外にメリットなくない?不安定でたまにプロセスが止まったり、パフォーマンスもあんまよくないし。
git/bzrメインに乗りかえたらすごい快適になった。Haskell製ってことで期待しすぎたのかもしれないが、
正直最近はdarcsなリポジトリみるとウンザリする。
- 63 :デフォルトの名無しさん:2009/09/27(日) 00:51:45
- darcs 2.0.2だと実行ファイル単品で動いてたからインストールとか楽だったんだけど、
それ以降の奴ってdllが増えててやだなぁと思って使ってない。
git/bzr使おうかなぁとか思ったりもするけどmsysやらなんやら周辺のファイルの多さが気に入らない。
- 64 :デフォルトの名無しさん:2009/09/29(火) 17:11:53
- All About Monadsの原文のページが
例のおねーちゃんに乗っ取られてる
sampou.orgにあるから別にいいんだけど
なかのひとがどうしているのか気になる
- 65 :デフォルトの名無しさん:2009/09/30(水) 21:37:25
- GHC-6.12.1からSystem.IOが内部エンコーディング<->ローカルエンコーディングと
改行コードの自動変換をするらしい。
ttp://ghcmutterings.wordpress.com/2009/09/30/heads-up-what-you-need-to-know-about-unicode-io-in-ghc-6-12-1/
- 66 :デフォルトの名無しさん:2009/10/04(日) 00:50:12
- Haskell のカーネルって基本的にLispと同じだよね?
ガベージコレクタがあって
8ビットCPUの時代Lispのインタープリタは4kbyteほどしかなかった気がする
Haskellのフロントはhaskellのカーネルに食わせるために単純な演算塊に展開してやると
で、Haskellの基本的部分はかなりコンパクトに実装できるのかな?と思った。
- 67 :デフォルトの名無しさん:2009/10/04(日) 07:28:42
- >>66
> Haskell のカーネルって基本的にLispと同じだよね?
違う
- 68 :デフォルトの名無しさん:2009/10/04(日) 14:35:49
- チューリング完(ry
- 69 :デフォルトの名無しさん:2009/10/04(日) 18:57:28
- http://haskell.g.hatena.ne.jp/taninsw/の
qsort[]=[]
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]すると消えるけど
- 70 :デフォルトの名無しさん:2009/10/04(日) 19:14:47
- >>69
「改変したらどうなるか?」ってのが問いで、「値が消える」が答え
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]という例で考えてみよ
- 71 :デフォルトの名無しさん:2009/10/04(日) 19:15:16
- 晒しているのか、まじ質問なのか、判断できん。
前者なら死ね。
後者ならどんだけ自分に自信がないんだ。君はできる子だよ。
- 72 :デフォルトの名無しさん:2009/10/04(日) 19:17:46
- >>67
どう違うのか簡潔な説明が欲しいけど
”違う”の一言で終わりそうな感じなのであきらめます。
- 73 :デフォルトの名無しさん:2009/10/04(日) 19:21:27
- Lisp系の場合はほんのわずかな特殊なものを除いて、
インタープリタ込みの構造になってる。
そして動的型付け。
- 74 :デフォルトの名無しさん:2009/10/04(日) 20:44:23
- いや、元Lisperなんでスレ違いだがおもわず。
それSchemeじゃない?Lispだと大抵コンパイラ込みで、宣言型型付けだろ。
- 75 :デフォルトの名無しさん:2009/10/04(日) 21:23:36
- 実装による。
しかし、コンパイラでもマクロ展開を考えたら実質的にはインタプリタみたいなものは入ってなきゃだめだろう。
(CommonLisp でも Scheme でも。)
型については CommonLisp では型宣言できるけど、最適化のヒントでしかない。
型に応じて言語が何かしてくれるということはぜんぜん無い。
まぁ、「Lisp系」ってのは幅が広いので、ひとまとめで語るのが無茶だよ。
- 76 :デフォルトの名無しさん:2009/10/04(日) 22:21:30
- > 型に応じて言語が何かしてくれるということはぜんぜん無い。
型が宣言できるなら実装がなにかしてくれるかもしれないのでは?
- 77 :76:2009/10/04(日) 22:22:55
- しまった、Haskellスレか。関数型言語スレかとおもった。ごめん無視して。
- 78 :デフォルトの名無しさん:2009/10/05(月) 00:46:11
- 言葉足らずですまないです。
Haskellをインタープリタだけ実装した場合lispに似てるのかな思ったので
言語仕様上は短精度、倍精度実数とか文字列とかあるけど
中身はリストさえclassとして実装している面白そうな物だなとか
a (n+1) = n で
a 1 を実行すると 0
a 2 を実行すると 1
a 0 を実行するとエラーになって思わず仰け反ったり、油断ならね〜
GHCのガベージコレクタは優秀とか言われているけどどうやっているのか興味が沸いたり
プログラムが関数の定義塊なのに、c系統のつもりで読んでパニック起こしたり
快感と言うかグッ来るものがある
- 79 :デフォルトの名無しさん:2009/10/05(月) 00:50:57
- やっぱりなにが言いたいのかよく分からない
- 80 :デフォルトの名無しさん:2009/10/05(月) 01:04:25
- >>78
Yhcのソースでも読んで見りゃいいんじゃない?
http://www.haskell.org/haskellwiki/Yhc
- 81 :デフォルトの名無しさん:2009/10/05(月) 06:18:40
- >>74
Haskellとの比較だから、コンパイラあるのは違う点に入らない。
実行時に型宣言ないlambda式生成できるので、
動的型付け必須で、データをunboxing出来ない。
- 82 :デフォルトの名無しさん:2009/10/05(月) 08:43:13
- Implementing lazy functional languages on stock hardware: the Spineless Tagless G-machine でも読んだら?
- 83 :デフォルトの名無しさん:2009/10/05(月) 09:34:34
- 実際は Lisp でも型宣言したら静的型付けと同じように、
その型に応じた演算がされるから SBCL とか結構速い
- 84 :デフォルトの名無しさん:2009/10/05(月) 19:18:36
- >>83 >>82を読め
- 85 :デフォルトの名無しさん:2009/10/05(月) 21:44:42
- >>82
ps落としてきたんだけど、gvでエラーになっちゃう
- 86 :デフォルトの名無しさん:2009/10/05(月) 21:55:43
- >>85
GhostScript を使って読むとか ps2pdf ってコマンドが同梱されているから pdf に変換するとかすればいいと思うよ
- 87 :デフォルトの名無しさん:2009/10/05(月) 22:22:05
- >>86
d
- 88 :デフォルトの名無しさん:2009/10/05(月) 22:51:24
- >>84
え、何で俺?
- 89 :デフォルトの名無しさん:2009/10/06(火) 08:34:16
- Lispの型宣言と違い、Haskellの型宣言は、Haskellで書かれたコード全てに
強く強制されるから、コンパイラは、型的に正しいコードしか存在しないことを
仮定してコード生成ができる。
- 90 :デフォルトの名無しさん:2009/10/06(火) 12:32:51
- 構造化プログラミングのAlgol
オブジェクト指向プログラミングのSmalltalk
そして関数型プログラミングのHaskell
10年後くらいにはこんな感じの認識になってるんじゃないかと思う
- 91 :デフォルトの名無しさん:2009/10/06(火) 12:33:48
- そしてC++のポジションにはScalaが座っていると
- 92 :デフォルトの名無しさん:2009/10/06(火) 13:08:14
- C++のポジション → みんなから罵詈雑言を浴びせられ続ける……ってこと?
- 93 :デフォルトの名無しさん:2009/10/06(火) 13:38:26
- >>89
Lispは逆のアプローチじゃなかったかなあ
最適化に必要な型や仮定をプログラマが与える
コードが適切な振る舞いをすることは、型システムでなくてプログラマが保証する
- 94 :デフォルトの名無しさん:2009/10/06(火) 19:48:53
- オライリージャパン早くしろよ
- 95 :デフォルトの名無しさん:2009/10/06(火) 20:19:23
- RWH待ち遠しいな
- 96 :デフォルトの名無しさん:2009/10/06(火) 21:02:30
- kazuさんのブログ面白いよね
- 97 :デフォルトの名無しさん:2009/10/07(水) 00:39:22
- cabal-installってユーザ単位の環境の作成管理がデフォだったっけ?
前は普通に/usr/local以下を管理してくれたと思ったが
- 98 :デフォルトの名無しさん:2009/10/07(水) 16:26:46
- userとglobalでprefixが$HOMEと/usr/localでなんちゃら
- 99 :デフォルトの名無しさん:2009/10/07(水) 19:47:44
- ttp://shootout.alioth.debian.org/
なんか前よりhaskellのランクが落ちてるような。他が良くなったのか。
- 100 :デフォルトの名無しさん:2009/10/08(木) 08:17:56
- Haskellの.NET実装ってある?
IronHaskellとかH#みたいな。
- 101 :デフォルトの名無しさん:2009/10/08(木) 09:32:21
- Haskell.NETってのが…計画倒れ?
http://php.cin.ufpe.br/~haskell/haskelldotnet/
- 102 :デフォルトの名無しさん:2009/10/09(金) 12:10:57
- F#「椅子はひとつよ♡」
- 103 :デフォルトの名無しさん:2009/10/09(金) 16:00:31
- F#はHaskellじゃないし
正格なんだっけ?
- 104 :デフォルトの名無しさん:2009/10/09(金) 20:56:47
- Programming in Haskellの翻訳はいつ出ますか?
- 105 :デフォルトの名無しさん:2009/10/09(金) 21:46:22
- どこからでるんだろね
- 106 :デフォルトの名無しさん:2009/10/10(土) 16:41:29
- http://shootout.alioth.debian.org/u32/shapes.php
Ocamlに圧倒的に負けてるね。とくに簡潔さで。
Haskellの記述力が弱いのか?
- 107 :デフォルトの名無しさん:2009/10/10(土) 17:39:03
- http://shootout.alioth.debian.org/u32/benchmark.php?test=all&lang=ghc&lang2=ocaml
によると、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のコード動いてねえ!
- 108 :デフォルトの名無しさん:2009/10/10(土) 18:06:07
- >>106
人が何に対して、何を基準にして簡潔さを感じるか、の違いだと思う。
私が感じる簡潔さはあのグラフでは表現されない。
私には Haskell は Ocaml に対して簡潔さにおいて圧倒的に負けてるとは思えない。
- 109 :デフォルトの名無しさん:2009/10/10(土) 18:23:59
- くやしいのうwwwwwwwくやしいのうwwwwwwwww
- 110 :デフォルトの名無しさん:2009/10/10(土) 20:10:15
- >>107
ワロタw
オライリージャパンの近刊情報にRealWorldHaskellがあるけど
組み込みLinux〜とかとちがって発売日不明だし、十月は無理くさいね
ttp://www.oreilly.co.jp/catalog/soon.html
- 111 :デフォルトの名無しさん:2009/10/10(土) 20:55:55
- 関数言語系の日本語の本は誤字脱字とかミスがひどいのが多いから
きっとRWHもそれで必死に校正してるんだろうな
- 112 :デフォルトの名無しさん:2009/10/10(土) 22:19:30
- >>107
> Fatal error: exception Failure("Buffer.add: cannot grow buffer")
バッファオーバーフローみたいなもの?
N=500,000(オリジナルの1/10)では動くらしい
Ocamlはメモリマネジメントがあまりうまくないのかな
- 113 :デフォルトの名無しさん:2009/10/11(日) 14:14:21
- 質問なのですが、型変換ってどうやったらいいのでしょうか?
Word8 -> Word みたいなことをやりたいのですが
- 114 :デフォルトの名無しさん:2009/10/11(日) 14:42:59
- fromIntegral :: (Integral a, Num b) => a -> b
fromIntegral = fromInteger . toInteger
でいいんじゃないか。
- 115 :デフォルトの名無しさん:2009/10/11(日) 18:16:36
- >>114
それでいけました
質問にお答え頂きありがとうございました
- 116 :デフォルトの名無しさん:2009/10/11(日) 18:32:19
- >>89
何かレベルの低い話っぽかったから見てなかったわ…
>型的に正しいコードしか存在しないことを
>仮定してコード生成ができる。
Lisp でも (declaim (optimize (safety 0) ... )) とかすれば、
型的に正しいコードしか存在しないことを仮定してコード
生成が出来るんだぜ。
- 117 :デフォルトの名無しさん:2009/10/11(日) 18:36:27
- それって正しい型宣言をするのはプログラマの責任で、型チェックはあっても処理系依存じゃん。
ミスがあったら実行時にエラーになっちゃう。Haskellのように安全かつ完全な型検査はできるわけじゃない。
そもそもスレ違い。
- 118 :デフォルトの名無しさん:2009/10/11(日) 18:46:21
- そりゃ、違う言語なんだから違う部分を探せば幾らでもあるさ。
そんなことを言って何が面白いのか知らんが。
- 119 :デフォルトの名無しさん:2009/10/12(月) 16:22:01
- >>118
いや、おまえは型検査がまるでわかっていない。
- 120 :デフォルトの名無しさん:2009/10/12(月) 16:28:14
- そうやって妄想するのは良いけど勝手に決めつけるなよ。
自分だけが知った気になってる奴が一番面倒くさいんだよな。
- 121 :デフォルトの名無しさん:2009/10/12(月) 16:48:35
- そもそも俺はこれ↓が間違いだと言ってるだけなんだがなあ。
>>81
>実行時に型宣言ないlambda式生成できるので、
>動的型付け必須で、データをunboxing出来ない。
Haskell のスレだが、Lisp について間違った認識をしている
人が居たから訂正したまでだよ。
- 122 :デフォルトの名無しさん:2009/10/12(月) 16:55:52
- >>121
言い訳はそれで終わりか?
学部の授業受けなおしたらどうだ?
- 123 :デフォルトの名無しさん:2009/10/12(月) 16:59:25
- どちらが正しいか俺にはわからんが、
>>121と>>122なら>>121の方に分があるように見える。
>>122のように無意味な誹謗を始めたら負けだ。
- 124 :デフォルトの名無しさん:2009/10/12(月) 16:59:34
- そういう煽り切ったら勝ちみたいなのは下らないから止めた方が良いと思うぜ。
>>121に異論が無いなら終わりだよ。
- 125 :デフォルトの名無しさん:2009/10/12(月) 17:00:24
- あ、スマソ。>>124は>>122向けです。
- 126 :デフォルトの名無しさん:2009/10/12(月) 17:51:20
- 型安全に関する理解が浅いのを
話題を煽り論争にスリ替えようとしているのが
あまりにもミエミエで笑った!
- 127 :デフォルトの名無しさん:2009/10/12(月) 18:16:07
- そもそも、最適化した Lisp の型に関する安全性を主張している訳じゃないことを
理解できてないだけでしょう。
単に煽りたいだけなのはミエミエだけどなあ。煽ればレスが貰えるみたいな、
レス乞食は面倒くさいから勘弁ね。ずっと笑ってなよ。
- 128 :デフォルトの名無しさん:2009/10/12(月) 18:25:03
- λ < スレ違いはもうやめて
- 129 :デフォルトの名無しさん:2009/10/12(月) 19:28:37
- オライリージャパン早くしろよ!
- 130 :デフォルトの名無しさん:2009/10/12(月) 19:34:44
- 6.12.1-rc1キター
- 131 :デフォルトの名無しさん:2009/10/14(水) 22:18:00
- realWorld、24日発売みたいですね。
で、Tシャツって4k以上だから、もう一冊買わないとダメなんですかね。
やるなー、オライリー
- 132 :デフォルトの名無しさん:2009/10/14(水) 22:38:31
- 宣伝はやめください
- 133 :デフォルトの名無しさん:2009/10/15(木) 04:48:08
- >>131
ktkr
- 134 :デフォルトの名無しさん:2009/10/15(木) 17:07:10
- ハスケル始まったな
- 135 :デフォルトの名無しさん:2009/10/17(土) 20:28:04
- しかしなんでWindows7の発売直後にぶつけるんだ?
金なくなってるから買えないよ
- 136 :デフォルトの名無しさん:2009/10/17(土) 20:29:52
- Windows7 と Haskell で Windows7 を取っちゃう人なの?
- 137 :デフォルトの名無しさん:2009/10/17(土) 23:21:07
- 普通の人はそうでしょ?w
- 138 :デフォルトの名無しさん:2009/10/17(土) 23:55:29
- 普通の人はそうかもしれないが、このスレ住人が?って意味だろ
- 139 :デフォルトの名無しさん:2009/10/18(日) 00:20:41
- 俺はどっちも買うよ
- 140 :デフォルトの名無しさん:2009/10/18(日) 01:29:51
- つーか、ド素人以外で、まだWindows7入手してない奴なんているの?
- 141 :デフォルトの名無しさん:2009/10/18(日) 01:40:18
- 何このスルー検定w
- 142 :デフォルトの名無しさん:2009/10/18(日) 05:52:48
- windowsでHaskellなんて…
- 143 :デフォルトの名無しさん:2009/10/18(日) 10:22:18
- HaskellはLINUXでやるのが一番かっこいいんだぞ
- 144 :デフォルトの名無しさん:2009/10/18(日) 12:00:20
- (キリッ
- 145 :デフォルトの名無しさん:2009/10/18(日) 12:46:46
- は?Linux? 遊びじゃねーんだよ
- 146 :デフォルトの名無しさん:2009/10/18(日) 14:33:42
- 本気の人キター!
- 147 :デフォルトの名無しさん:2009/10/18(日) 14:34:05
- そう、HaskellやるならやっぱりWindows7だよね。
Vista、XPは糞。Haskellとの親和性が最高なのはWindows7。
どこがいいって?そんなのやってみりゃすぐ分かるだろこれだらド素人は。。。。
- 148 :デフォルトの名無しさん:2009/10/18(日) 14:35:30
- つうかWindows 7自体大部分がHaskellで書かれてるからまあ当然だが。
- 149 :デフォルトの名無しさん:2009/10/18(日) 14:59:29
- そもそも、MSの社員食堂のメニューがHaskellで書かれてたくらいだし。
むしろVista、XPがHaskell的に糞だった事が異常だったわけで。
- 150 :デフォルトの名無しさん:2009/10/18(日) 16:01:11
- Windows 7ってこれ?
http://programatica.cs.pdx.edu/House/
- 151 :デフォルトの名無しさん:2009/10/18(日) 16:13:11
- >>148
ないだろw
- 152 :デフォルトの名無しさん:2009/10/18(日) 16:48:35
- Vista はC#でほとんどが書かれてたみたいだね
- 153 :デフォルトの名無しさん:2009/10/18(日) 18:10:10
- そんなくだらないネタ会話しか話題がないのか。
- 154 :デフォルトの名無しさん:2009/10/19(月) 18:18:53
- ソース出せよ!
- 155 :デフォルトの名無しさん:2009/10/19(月) 18:21:39
- >>153
少なくとも>>150はネタじゃなかったりする。漏れも開いてみて驚いた。
- 156 :デフォルトの名無しさん:2009/10/20(火) 19:40:16
- realwoldhaskellはやくもきたー
ざっとみると、ghc6.10.1で動作確認してあるみたい?
- 157 :デフォルトの名無しさん:2009/10/20(火) 19:42:14
- 6.10.4て書いてあった…
- 158 :デフォルトの名無しさん:2009/10/20(火) 21:52:20
- え?もうジュンク堂にあるの?
- 159 :156:2009/10/20(火) 22:37:41
- 公式で通販しました
原著よりも一回り小さいので文字も小さいw 電車で読みやすそうだからいいけど
- 160 :デフォルトの名無しさん:2009/10/20(火) 23:32:35
- 今日もseqを挟む作業だお……のAA下さい!
- 161 :デフォルトの名無しさん:2009/10/21(水) 23:41:05
- なんで $ は infixr なのに <$> は infixl なの
- 162 :デフォルトの名無しさん:2009/10/23(金) 18:33:00
- $ は数学の記法に合わせてあるんじゃないか。f(g(h(x))) -> f $ g $ h $ x
だから右結合。
<$> は部分適用みたいな使い方をよくするから、
左結合のほうが便利なのでは。
f <$> fx <*> fy <*> fz
で、<$>や<*>が右結合だと意味がおかしい。
あーなんか論理的じゃないな。
- 163 :デフォルトの名無しさん:2009/10/24(土) 14:04:28
- 最近Coqなどの証明系が流行ってると聞きました。これはポストHaskellと言うべき言語なんでしょうか。
それとも、別種の、実用言語ではなくて理論を突き詰めるためのものなんでしょうか。
アホな質問ですみません、Coqのサイトを少し見たのですがさっぱり分からなかったので。
よろしくお願いします。
- 164 :デフォルトの名無しさん:2009/10/24(土) 14:32:02
- Haskell の型システムはそういった証明系ほど厳密ではない。
Haskell は証明系の理論をベースにしてはいるけど、用途としては汎用。
Coq は定理証明のために特化されているから立場が違うよ。
- 165 :デフォルトの名無しさん:2009/10/24(土) 14:37:15
- Coqは実用言語じゃないし、
実用言語しか興味のない人には何の関わりもない証明系。
- 166 :デフォルトの名無しさん:2009/10/24(土) 14:42:43
- 証明支援系でもCoqはマイナーな存在w
- 167 :デフォルトの名無しさん:2009/10/24(土) 16:26:46
- なるほど。Coqを学ぶとHaskellの型システムの理解が深まる感じですか。
- 168 :デフォルトの名無しさん:2009/10/24(土) 16:48:01
- >>167
ないないw
- 169 :デフォルトの名無しさん:2009/10/24(土) 17:03:38
- ここで言われている「証明」ってBirdのHaskell教科書に出てくるようなのですか?
- 170 :デフォルトの名無しさん:2009/10/24(土) 17:12:59
- >>169
ここ行け
コンピューターによる定理の自動証明
http://science6.2ch.net/test/read.cgi/math/1126017312/
- 171 :デフォルトの名無しさん:2009/10/24(土) 19:04:57
- ちゃんと買いましたか?おまいら
- 172 :デフォルトの名無しさん:2009/10/24(土) 19:11:34
- web公開版を印刷しました(^^;
カラーレーザープリンタ便利です
- 173 :デフォルトの名無しさん:2009/10/24(土) 19:19:57
- >>163
CoqやAgdaなどの証明支援器はHaskellやOCamlなどと連携する機能があるから、むしろ一緒に使うのが実用的だね。
大部分はHaskellで作って、一部の関数だけ証明器で開発し、信頼性をよりよくするという使い方だね。
Agdaは日本の研究機関(AIST)が開発しているから、官公庁系の業務で将来的に積極的に使われるかも。
今はAgdaは不安定すぎてだめだね。もう少し枯れる必要があるね。
- 174 :デフォルトの名無しさん:2009/10/24(土) 20:41:47
- 一部だけに使ってもたいした信頼性が得られるとは思いにくいな。
全体の整合性があるかどうかが信頼性の根拠なんじゃないの?
- 175 :163 :2009/10/24(土) 21:54:30
- コメントありがとうございました。なるほど、証明に特化してるんですね。
いや、次世代は「バグが無いことが証明されたコード」が可能になるのかと
勘違いしてました。少し安心です。
- 176 :デフォルトの名無しさん:2009/10/24(土) 23:06:53
- 証明を通過できるだけの厳密な制約を記述してたら使えるコードが出来るまでどれだけかかるかわかったもんじゃねーよ。
- 177 :デフォルトの名無しさん:2009/10/25(日) 01:52:45
- 完璧なプログラムを書け絶対だぞ。なんて縛りがあるなら、lisp+マクロが最強っぽいね
知識の集積と普及に問題がありそうだけど。
入門書買って読んだ、目からうろがこぽろぽろ
- 178 :デフォルトの名無しさん:2009/10/25(日) 10:37:37
- 正しいプログラムを書こうというのなら
動的型のLISPより静的型のHaskellだろJK。
- 179 :デフォルトの名無しさん:2009/10/28(水) 10:03:28
- Real World Haskell の日本語訳の正誤表って出てる?
もう充分な品質かな? 次の刷まで待った方がいいかな?
- 180 :デフォルトの名無しさん:2009/10/28(水) 17:01:47
- >>177
Lisp は運用と開発の境界を曖昧にした。
運用の中で問題があればすぐに改善できるのがウリ。
だから使い続けていくうちに品質が向上していくという性質がある。
現実の問題ってのは最初から完全な制約が与えられるものではないし、
制約が変更されることもあるし、プログラマがミスをすることもある
という前提から出発している。
逆に言えば運用開始前にはバグがあって当然ということでもある。
つまり、「完璧」だとか「正しい」とは何かという問題なんだ。
完璧な制約を書けないなら、制約を完全に満たす出力があっても無意味だし、
全体の型整合が完全ってだけで完璧なプログラムなわけじゃないという点では
Haskell が常に最良じゃないのは確かにそうなんだけど…
最強を論じるのはナンセンスだ。
ある条件に対してよりマッチするかどうかってものがあるだけ。
- 181 :デフォルトの名無しさん:2009/10/28(水) 22:41:52
- ちょw 豆蔵ww
> 関数脳のつくり方 Second Season 〜モナドで悟りをひらく〜
ttp://itpro.nikkeibp.co.jp/article/COLUMN/20091023/339329/?ST=develop
- 182 :デフォルトの名無しさん:2009/10/28(水) 22:52:52
- >>179
現時点での正誤表、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ライブラリから外される可能性があります
- 183 :179:2009/10/29(木) 08:18:01
- >>182
売れ行きはどんな感じだろ。
次の刷はすぐに出そう?
- 184 :デフォルトの名無しさん:2009/10/29(木) 16:34:52
- 子飼様が書評されておられます
http://blog.livedoor.jp/dankogai/archives/51314062.html
- 185 :デフォルトの名無しさん:2009/10/29(木) 23:11:28
- >>184
dankogaiはhate対象
- 186 :デフォルトの名無しさん:2009/10/30(金) 21:07:33
- 11月なんだね
プログラミングHaskell
http://www.amazon.co.jp/dp/4274067815/
- 187 :デフォルトの名無しさん:2009/10/30(金) 22:08:11
- >>186
これって、入門者が主なターゲット?
- 188 :デフォルトの名無しさん:2009/10/31(土) 00:15:49
- 違うよ。
- 189 :デフォルトの名無しさん:2009/10/31(土) 07:23:40
- >>188
え、違わないでしょ。むしろプログラミング入門者向けって書かれてたと記憶してる。
- 190 :デフォルトの名無しさん:2009/10/31(土) 10:31:47
- たとえば、haskell.org などで自分で必要な情報を仕入れ、
整理し、(自分用に)まとめられる力がある人にとっては、
もう目新しいトピックや目から鱗的なトピックは無いですか?
- 191 :デフォルトの名無しさん:2009/10/31(土) 11:04:27
- 4章まで読んだ。foldrのところで早くも挫折しそう…。
- 192 :デフォルトの名無しさん:2009/10/31(土) 11:10:47
- >>190
全部が全部知っていること・理解していることってことはなかろう。
ひとつやふたつは何か新しい発見もあるだろうさ。
- 193 :デフォルトの名無しさん:2009/11/01(日) 22:59:31
- hackageにつなげなくなって幾星霜。
wxHaskellをビルドしようとしてようやく気づいたけど、もしかしてこの頃からずっと?
- 194 :デフォルトの名無しさん:2009/11/01(日) 23:22:40
- Real World Haskell の日本語訳って、誤字大杉じゃない?
まだ、217p までしか読んでないけど、明らかに誤字だと分かるものでも7個見つけた。
(流し読みしたところもあるから、見逃してるのもあるかも)
700p 近くある翻訳本なら、これが普通なの?
まぁ、意味が正反対になったり、理解に苦しむレベルの誤字ではないから、
今のところいいけど。
- 195 :デフォルトの名無しさん:2009/11/02(月) 00:58:53
- 1ページあたりの文字数多いし、むしろ優秀な方
- 196 :デフォルトの名無しさん:2009/11/02(月) 01:12:46
- >>194
出版社に言え。誤字に訳本とか関係ないから。
- 197 :デフォルトの名無しさん:2009/11/02(月) 07:27:08
- >>196
はい、全部読み切って、誤字をリストアップしたら
まとめて出版社の方に報告するつもりです。
内容はやはり素晴らしいですね。
まだ1/3も読んでませんが、ここまてでもかなり勉強になります。
JSONのプリティプリンティングの辺りからは、
小さいけど実用的なアプリを一から完成まで作り上げていく工程を
まるまる学べますね。
- 198 :デフォルトの名無しさん:2009/11/07(土) 01:54:20
- http://homepage1.nifty.com/kurubushi/card52640.html
ライプニッツの時代は原子論がまだ確立していなかった。
物の根源が原子であるということに確証がなかった。
だが、錬金術師としては最小単位があると記号的にも便利だよね。
- 199 :デフォルトの名無しさん:2009/11/07(土) 02:07:35
- 存在する化学的対象物を表す最小単位が原子。では、
存在する数学的対象物を表す最小単位は?
- 200 :デフォルトの名無しさん:2009/11/07(土) 02:11:11
- くだらないからやめろ。
- 201 :デフォルトの名無しさん:2009/11/07(土) 02:16:55
- 最小単位は量子じゃないの
- 202 :デフォルトの名無しさん:2009/11/07(土) 04:53:52
- クォークより最小のものってあるの?
- 203 :デフォルトの名無しさん:2009/11/07(土) 05:55:43
- 還元主義の一方だけではだめでちゃんと統合しないと
分解して小さなもので置き換えるだけではなく、むしろ還元とは小さなもので置き換えたときのそれぞれの関係について論じられるべき
関係が明らかになれば無駄に分解していく必要も無い
ってことでモナドの勝利
- 204 :デフォルトの名無しさん:2009/11/07(土) 06:05:56
- ちょっとスレがひっそりしてくると通俗書で仕入れた単語で自問自答を始めるプログラムって停止しないよな
- 205 :デフォルトの名無しさん:2009/11/07(土) 06:35:10
- しかしお前等朝早いな
- 206 :デフォルトの名無しさん:2009/11/07(土) 11:10:58
- >>202
あるよ
- 207 :デフォルトの名無しさん:2009/11/07(土) 12:28:02
- >>206
何?
- 208 :デフォルトの名無しさん:2009/11/07(土) 12:41:53
- >>207
粒子という概念で物質を考えると粒子は無限に小さくなる。
- 209 :デフォルトの名無しさん:2009/11/07(土) 13:03:29
- ?
- 210 :デフォルトの名無しさん:2009/11/07(土) 13:08:29
- クォークはモナドでできているんだぜ?
- 211 :デフォルトの名無しさん:2009/11/07(土) 15:22:15
- ghc で hackage のシステムを使ってあるライブラリをインストールする時、
依存関係のために先にインストールしておかなければならないものを
自動的に全てインストールする仕組みは無いでしょうか。
今は、ライブラリAを runhaskell Setup configure した時、
ライブラリB(の ver x.x.x)を先にインストールしておけと言われたら、
ライブラリAのインストール作業を一時中断し、
ライブラリBをダウンロードしてインストールしてから
先ほどのライブラリAのインストール作業を再開してます。
この先にライブラリBをダウンロードしてインストールする
という再帰的な作業を全自動で行ってほしいのですが、何か方法は無いですか。
- 212 :デフォルトの名無しさん:2009/11/07(土) 15:47:10
- >>211
cabal-install
- 213 :デフォルトの名無しさん:2009/11/07(土) 17:22:13
- >>212
すごい、素晴らしい。
めちゃくちゃ楽になった。
ありがと。
- 214 :デフォルトの名無しさん:2009/11/10(火) 07:43:42
- 先ず無限に続く素数列
primes::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]
- 215 :デフォルトの名無しさん:2009/11/10(火) 07:46:08
- 2から1000個の素数列を作る事を考えると
take 1000 primes
が簡単です
[2,3,…,7907,7919]
この処理に,自分の環境で33秒を要しました
別の実現方法として,
take 1000 $ filter isPrime [2..]
もすぐ思いつきます。
ここで悩ましいのは,isPrimeはrpfで実装されており,
rpfはprimesで実装されている所です。
つまりisPrimeはprimesを使って実装されているのです。
にも関わらず,後者の方法で要した時間は
6.79秒なのです
なんでですか?
- 216 :デフォルトの名無しさん:2009/11/10(火) 10:07:17
- >>214-215
後者はたしかにprimesを使いますが
使うのは(takeWhile (<=upb) primes)だけですよね
これは(take 1000 primes)よりずっと短い
- 217 :デフォルトの名無しさん:2009/11/10(火) 13:55:46
- ああそうか
primesは新しい数にぶつかる度にこれまでに
判明した素数で割れやしないかとテストするが
本来テストする数の二乗根までしかテストしなくて良いのだから
無駄な事をしていると
isPrime版ではこの事を考慮しているというわけですね
ではprimes自体最適化する必要があるわけですね
- 218 :デフォルトの名無しさん:2009/11/10(火) 19:17:45
- >>197
RWHの誤りなどを報告するページができたもよう
http://www.sampou.org/cgi-bin/haskell.cgi?Books%3aRWH%3aBugReport
全部読み切ってからと言わずすぐに報告する方がいいぞ。
- 219 :デフォルトの名無しさん:2009/11/10(火) 20:12:53
- >>218
今いくつか追加しといた
- 220 :デフォルトの名無しさん:2009/11/11(水) 01:27:06
- Writerモナドのtellは、ログを「追加する」と書いてありますが、
これは、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に渡すと呼ばれる処理がどこに書かれているのか、
ヒントだけでもいただけないでしょうか。
- 221 :デフォルトの名無しさん:2009/11/11(水) 13:44:01
- >>220
>mappendを呼び出していると考えていいのでしょうか?
それで合ってる
そのソースは「Writer的モナド」のクラスを定義してるだけで、実装はこっち
http://www.haskell.org/ghc/docs/latest/html/libraries/mtl/src/Control-Monad-Writer-Lazy.html
厳密にはtellじゃなくて(>>=)がmappendを呼んでる
- 222 :220:2009/11/11(水) 15:13:12
- >>221
最後に「Lazy」と「Strict」が付くリンクが、
それぞれ非正格と正格の場合の実装なんですね。
ついでにドキュメントの見方も理解できました。
ありがとうございました。
- 223 :デフォルトの名無しさん:2009/11/11(水) 15:48:55
- 明日俺もリアルワールドハスケル買うよ
ぐふふ バイトして金が用意できる
- 224 :デフォルトの名無しさん:2009/11/12(木) 01:41:20
- >>223
RWHを買ったら覚えたHaskellで稼げば
その金をまたHaskellにつぎこめる
ぐふふふふ
- 225 :デフォルトの名無しさん:2009/11/14(土) 21:10:17
- Typeclassopediaについて現在チャットやってる。
http://d.hatena.ne.jp/kazu-yamamoto/20091113/1258075565
- 226 :デフォルトの名無しさん:2009/11/14(土) 22:30:49
- Haskell'はいつ出ますか?
- 227 :デフォルトの名無しさん:2009/11/17(火) 09:12:51
- 参加しますか?
関数型プログラミングにどっぷり浸れる特別イベント「Haskellナイト」、今週末に開催
http://codezine.jp/article/detail/4615
- 228 :デフォルトの名無しさん:2009/11/18(水) 05:09:15
- Cで書かれたHaskellの1000行程度の小さい処理系ってないのか
無いなら作る魂発揮できれば良いんだけど
- 229 :デフォルトの名無しさん:2009/11/18(水) 07:57:41
- schemeでも2000行程は掛かるから、
演算子が色々あるhaskellはその十数倍は見積もらないと。
haskellの最小コア命令セットってどうなるんだろ?
schemeだとapply evalに、if set! define lambda beginだったか。(マクロもあるけど)
- 230 :デフォルトの名無しさん:2009/11/18(水) 08:34:14
- >>228
Haskellの教育向け実装処理系であるGoferはいかが?
ソースの合計行数(wc -l *.[chy])は、27110行だった。
作者によるユーザガイドと実装に関する論文も公開されている(ただし英語)。
- 231 :デフォルトの名無しさん:2009/11/18(水) 12:17:32
- >>228
作れるの?
- 232 :デフォルトの名無しさん:2009/11/18(水) 13:45:05
- I wish I were a bird.
- 233 :デフォルトの名無しさん:2009/11/18(水) 15:15:17
- Sure, you aren't a bird.
- 234 :デフォルトの名無しさん:2009/11/18(水) 15:18:05
- You had better to perspect realism.
- 235 :デフォルトの名無しさん:2009/11/18(水) 16:38:15
- いっそhaskell--とか言うサブセットでも定義して実装するとか
なんか色々なものがclassで実装出来そうな気がする
つまり標準的な仕様から除外出来そうな。互換性には目を瞑るって事で
- 236 :デフォルトの名無しさん:2009/11/18(水) 17:42:21
- >>235
良く分からんけどがんばれ
- 237 :デフォルトの名無しさん:2009/11/20(金) 22:56:55
- 皆さん、仕事でHaskell使ってます?
事例があれば知りたい……
- 238 :デフォルトの名無しさん:2009/11/20(金) 23:10:14
- Windows で Gtk2Hs 0.10.1 のインストーラーを起動させましたが、
次の様に書かれたダイアログが表示されました。
----------------------
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 のサーチパスを自分で修正できるならそのままインストールしていいよ、
と言われていると思いますが、どこの設定をどのように変えればいいのでしょうか。
- 239 :デフォルトの名無しさん:2009/11/20(金) 23:54:53
- >>237
仕事で使ってるけど何か?
ちなみに俺の仕事は大学の卒論を書くこと。
- 240 :デフォルトの名無しさん:2009/11/21(土) 00:33:34
- Haskellを使う人は他の言語もよく使えるだろうと思って
このご時勢でもパスさせてきたけど
落としたほうがよさそうな気がしてきた。
- 241 :デフォルトの名無しさん:2009/11/21(土) 00:45:31
- と社会人経験0のニートが申しております
- 242 :デフォルトの名無しさん:2009/11/21(土) 10:50:19
- HaskellはLispのマクロみたいなものはありますか?
- 243 :デフォルトの名無しさん:2009/11/21(土) 18:26:01
- >>238
そのgtk2hsのバイナリはghc 6.10.3でコンパイルされてるとかじゃね?
- 244 :デフォルトの名無しさん:2009/11/21(土) 18:36:45
- 文字コードの変換ってどうするんですか?
今は\from to-> readProcess "iconv" ["-f", from, "-t", to]
みたいなもの使って無理矢理やってますが、これはどうかと思うんで
- 245 :デフォルトの名無しさん:2009/11/21(土) 19:21:12
- ttp://hackage.haskell.org/cgi-bin/hackage-scripts/package/iconv
- 246 :デフォルトの名無しさん:2009/11/21(土) 21:07:06
- なるほど、ありがとうございました
- 247 :デフォルトの名無しさん:2009/11/21(土) 22:15:53
- ふつうのHaskell
プログラミングHaskell
Real World Haskell
どれ買うのがいい?
- 248 :デフォルトの名無しさん:2009/11/21(土) 22:54:29
- >>247
どれも買え。
- 249 :デフォルトの名無しさん:2009/11/21(土) 23:15:18
- Real Worldだけでいい
- 250 :デフォルトの名無しさん:2009/11/22(日) 00:14:33
- プログラミングHaskellとRWHは翻訳を買うべき
原本より安い
RWHは原本の間違いが50箇所以上修正されている
- 251 :デフォルトの名無しさん:2009/11/22(日) 00:32:00
- RWHはウェブで読め
- 252 :デフォルトの名無しさん:2009/11/22(日) 00:33:23
- >>250
代わりに日本語の間違いが同じくらいあるけどね。
- 253 :デフォルトの名無しさん:2009/11/22(日) 00:43:44
- >>252
つttp://www.sampou.org/cgi-bin/haskell.cgi?Books%3aRWH%3aBugReport
これから買う俺のために報告しておいてくれ
「ふつうの」本の作者なんて、報告しても梨の礫だし、サポートページも放置プレイなんだぜ
- 254 :デフォルトの名無しさん:2009/11/22(日) 01:11:15
- >>253
とりあえず俺が今まで気づいたところは報告済み
- 255 :デフォルトの名無しさん:2009/11/22(日) 09:36:56
- >>253
重版かかるのはいつごろになりそうなんだろうな
修正された版を買おうと待ってるんだけど
- 256 :デフォルトの名無しさん: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: : : : : :.\
- 257 :デフォルトの名無しさん:2009/11/22(日) 15:05:18
- >>243
なるほどと思って、MinGW + MSYS 入れてコンパイルしてみようとしたが、
色々やっても make で失敗する原因が掴めん。
(GHC のバージョンをひとつ下げれば良いだけの話だが、なんか気持ち悪い)
vmplayer + ubuntu 上でコンパイルしたら、すんなりできた。
せっかくのアドバイスにすまんが、
とりあえず諦めてこっちでプログラムすることにした。
- 258 :デフォルトの名無しさん:2009/11/22(日) 23:47:13
- >>255
正誤表は表紙の裏に貼っておいて
修正箇所にはマーカーで線を引いておくといい
版が上がるのを待っていると購買意欲が薄れてゆく
本は勢いで買うものだ
ネットでリアルタイムに正誤表が入手できるようになったのは
多大な進歩だと思うけど、紙とシリコンに情報が分散する点が不便だ
表紙の裏に貼るくらいの大きさでプリンタブルなフォーマットを
用意してくれるとすごい助かる
wikiやblogのプラグインでそういうのないかな
- 259 :デフォルトの名無しさん:2009/11/26(木) 11:04:36
- >>255
Gauche本なんかはすぐに第二刷が出たよね。
ところで、「刷」ってのは内容に変更なしで追加で刷った場合に使うもんだと
思ってたけど、Gauche本では結構修正されてたよね。
誤植訂正は変更の内には入らないのかね。
- 260 :デフォルトの名無しさん:2009/11/26(木) 13:52:31
- んな細けぇこたぁいいんだよ。
- 261 :デフォルトの名無しさん:2009/11/26(木) 14:21:55
- 授業でHaskellの課題が出た
難しい…
- 262 :デフォルトの名無しさん:2009/11/26(木) 14:30:34
- はじける、んだ!
- 263 :デフォルトの名無しさん:2009/11/26(木) 15:38:48
- >>259
> ところで、「刷」ってのは内容に変更なしで追加で刷った場合に使うもんだと
いや。改訂版、増補版などの場合に第2版とかになる。誤植の修正程度では
刷数が上がるだけ。
- 264 :デフォルトの名無しさん:2009/11/26(木) 16:06:41
- 昔は、版を作り直す必要がある修正か、版はそのままでできる修正か、で
区別されたわけだけど、電子化でそういう区別はなくなっちゃったけどな。
- 265 :デフォルトの名無しさん:2009/11/28(土) 10:06:40
- おそらく定番の質問だとおもいますがよろしくお願いいたします。
do {
putStr "input >";
s <- getLine;
}
というような場合,コンパイルすると書いた順に実行されません。
インタプリタで実行したり改行の入るprint やputStrなどを使うと
ちゃんとできるようです。
書いた順に実行させるにはどうしたらいいのでしょうか。
- 266 :デフォルトの名無しさん:2009/11/28(土) 11:03:36
- do {
putStrLn "input >";
s <- getLine;
}
- 267 :デフォルトの名無しさん:2009/11/28(土) 11:07:30
- 「prompt だから、改行したくなかったのか。」って気付いたからこっちで
do {
putStr "input >";
hFlush stdout;
s <- getLine;
}
- 268 :デフォルトの名無しさん:2009/11/28(土) 11:08:22
- >>265
バッファリングされてるからフラッシュする
import IO
main = do{
putStr "input >";
hFlush stdout;
s <- getLine;
putStrLn s;
}
- 269 :268:2009/11/28(土) 11:09:08
- かぶった…orz
- 270 :デフォルトの名無しさん:2009/11/28(土) 11:12:54
- 簡単な問題だと食いつきいいな、お前ら。
- 271 :267:2009/11/28(土) 11:14:34
- >>268
いや、俺、import 書き忘れたから、
君の勝ちだ。
- 272 :265:2009/11/28(土) 11:23:23
- できました。ありがとうございました。
- 273 :デフォルトの名無しさん:2009/11/28(土) 11:40:37
- 簡単な問題の対義語は難しい問題じゃなな
難解な問題
- 274 :デフォルトの名無しさん:2009/11/28(土) 19:29:14
- るみちゃんとふたりっきりで忘年会したいお
- 275 :デフォルトの名無しさん:2009/11/28(土) 19:30:47
- 天王洲あいる
- 276 :デフォルトの名無しさん:2009/11/29(日) 14:13:51
- 留美yかわいいよ留美y
- 277 :デフォルトの名無しさん:2009/11/30(月) 10:17:15
- Haskellで書ける幸せ。
- 278 :デフォルトの名無しさん:2009/11/30(月) 15:57:47
- liftIOってコードの見た目がすごく汚くなるね
もうちょいマシな仕組みはなかったんだろうか
- 279 :デフォルトの名無しさん:2009/11/30(月) 19:08:06
- Haskellはきれいだけど
たまにliftだらけになって見た目汚くなっちゃうよねwwwwwww
- 280 :デフォルトの名無しさん:2009/11/30(月) 19:20:05
- >>279
関数分けろよ。
関数的スパゲッティまずい
- 281 :デフォルトの名無しさん:2009/12/01(火) 00:24:31
- ((,) a)がfunctorのインスタンスの時の
fmapの定義はどのようなものなのでしょうか?
- 282 :デフォルトの名無しさん:2009/12/01(火) 03:56:04
- X -> (A×) X
↓ ↓
f fmap f
↓ ↓
Y → (A×) Y
だからControl.Arrow.Arrow.secondかな
- 283 :デフォルトの名無しさん:2009/12/01(火) 07:44:54
- "the fun of programming" の exercise の解答(解答例)はどこかにありませんか
- 284 :デフォルトの名無しさん:2009/12/04(金) 09:26:02
- 下の問題のProblem G、私には難しすぎます
Haskell大好きな人助けてください
http://icpc.baylor.edu/past/icpc98/Finals/Report/Problems/Problems98.pdf
- 285 :デフォルトの名無しさん:2009/12/05(土) 02:42:59
- 難しい問題だから面白い。特にhaskellの場合は
- 286 :デフォルトの名無しさん:2009/12/05(土) 02:52:52
- みんなGUIアプリとか作るときliftがちょっと多くなっちゃったりしません?
みなさんどうしてます?
- 287 :デフォルトの名無しさん:2009/12/05(土) 10:53:45
- 1 / 100
と計算すると
1.0e-2
と表示されてしまうんですが、これを
0.01
と表示したい場合、どうするのでしょうか
- 288 :デフォルトの名無しさん:2009/12/05(土) 11:38:53
- hugsを使う。
- 289 :デフォルトの名無しさん:2009/12/05(土) 11:44:11
- import Text.Printf
printf "%2f" $ 1/100
- 290 :デフォルトの名無しさん:2009/12/05(土) 11:47:43
- >>286
ReaderT,StateTなんかを使うグローバル変数的なものはunsafePerformIO (newIORef hoge)で代用
MaybeT,ErrorTは Monad m => m (Maybe a) -> (a -> m (Maybe b)) -> m (Maybe b)等の
バインド関数を用意してIOモナドの中でやる
IOのほうが少ない場合は変換子のほうが綺麗に書けるけど
GUIだとどうしてもね…
- 291 :デフォルトの名無しさん:2009/12/05(土) 11:59:51
- >>289
thx
- 292 :sage:2009/12/05(土) 12:35:04
- ttp://itpro.nikkeibp.co.jp/article/COLUMN/20091023/339329/?ST=develop&P=9
> (1) Scalaでのモナドは,「map,flatMap,filter,unitコンストラクタ」を実装し,モナド則を満たしたクラスのことです。
Scalaのモナドってfilterが必要なの?どういうこと? Scalaはクソ仕様ってこと?
それとも単に豆蔵がアホってこと?
- 293 :デフォルトの名無しさん:2009/12/05(土) 14:01:07
- "the fun of programming" の正誤表(errata)はどこかにありませんか。
Exercise 1.5 の問題がどうしても誤植に思えてしまいます。
- 294 :デフォルトの名無しさん:2009/12/08(火) 21:13:13
- Real World Haskell 第2刷が来るか?
ttp://hop.timedia.co.jp/show/book/Real%20World%20Haskell
- 295 :デフォルトの名無しさん:2009/12/08(火) 23:58:53
- もうちょっとか。
第3刷まで待とうかな。
- 296 :デフォルトの名無しさん:2009/12/09(水) 11:23:33
- 刷りじゃ改訂されないんだよね?
版を重ねないと駄目だよね
- 297 :デフォルトの名無しさん:2009/12/09(水) 12:17:14
- >>296
増刷時に訂正が入ることもある。翔泳社のサイトでは自社出版物に関して
そういう情報を公開している。オライリーがどういう基準なのかは知らん
が、昔に買った sed & awk の本だと訂正されていたこともあった。
- 298 :デフォルトの名無しさん:2009/12/09(水) 13:21:30
- >>297
2刷の締切までに発見済みの誤りは訂正されるはず。
- 299 :デフォルトの名無しさん:2009/12/09(水) 17:09:25
- >>298
うん、その通り「はず」だよ。いつも保証は無い。なので、第3刷までは待っている。
それまでの間に品切(=絶版)になったら、そのとき考える。
- 300 :デフォルトの名無しさん:2009/12/09(水) 18:34:23
- その間にちょっとでも英語の勉強しなよ
- 301 :デフォルトの名無しさん:2009/12/09(水) 21:28:50
- >>294のリンク先に、第2刷で修正される内容が明記されているんだが。
- 302 :デフォルトの名無しさん:2009/12/10(木) 07:58:39
- >>299
三版でも直ってる「保証」はない。
- 303 :デフォルトの名無しさん:2009/12/10(木) 10:04:49
- 不毛なスレだ
- 304 :デフォルトの名無しさん:2009/12/10(木) 11:25:03
- >>302
無いヨ。勝手に期待してるだけ。そもそも出る保証すら無いんだから。
しかし原著のサンプルコードのミスに気がつかなかったケースもある
みたいだけど、翻訳時に検証ってしてないんかね?
>>303
ゴメンね。
- 305 :デフォルトの名無しさん:2009/12/11(金) 19:13:54
- haskellからはす☆ける、もしくははすける!に名前を変えれば人気急上昇だと思うんだ
- 306 :デフォルトの名無しさん:2009/12/11(金) 23:23:21
- 人気急上昇した暁には
もれなく人力によるFAQのDDOS攻撃が付いてきます
- 307 :デフォルトの名無しさん:2009/12/12(土) 08:33:34
- VIPからき☆すた、でスレが埋まるとかな。
- 308 :デフォルトの名無しさん:2009/12/13(日) 04:43:40
- 今晩は HIMA3 開催だす。
http://d.hatena.ne.jp/nobsun/20091211/1260541003
- 309 :デフォルトの名無しさん:2009/12/13(日) 19:04:58
- はじまた
- 310 :デフォルトの名無しさん:2009/12/13(日) 19:24:36
- わぁい
- 311 :デフォルトの名無しさん:2009/12/14(月) 20:53:52
- Haskellでリストの先頭に要素を追加していくのは速いけど末尾に追加していくと遅いとかって話あるじゃん?
どんな言語を受理するアルゴリズムでも手続き型言語とHaskellで
同じオーダーの使用メモリと速度で書けるって証明はあるのん?
- 312 :デフォルトの名無しさん:2009/12/14(月) 22:07:12
- >>311
リストを使うアルゴリズムと、リストを使わないけど同じアルゴリズムを仮定して
両者は同じではないので矛盾するということを証明すれば?
- 313 :311:2009/12/14(月) 22:23:28
- え、俺に証明しろと?w
相当難しいと思うんだが。
でもHaskellにとってそこを保障しとくのは大事だろうから
偉い人がもう証明してくれてるかな〜とおもってた。
- 314 :デフォルトの名無しさん:2009/12/14(月) 23:29:28
- GHC 6.12.1リリース
http://haskell.org/ghc/docs/6.12.1/html/users_guide/release-6-12-1.html
- 315 :デフォルトの名無しさん:2009/12/14(月) 23:54:49
- >>311-313 の会話が何を言いたいんだかさっぱりわからん。
「どんな言語を受理するアルゴリズムでも」ってどういう意味だよ?
おまえら本当に自分が書いてることの意味わかってて会話してんの?
- 316 :311:2009/12/15(火) 00:09:47
- そんなに特殊な言葉ではないとおもうんだが。
計算理論では割と一般的な言葉では?
- 317 :デフォルトの名無しさん:2009/12/15(火) 00:18:32
- haskellはリストだけなの?
OCamlみたく配列やmutableコレクションをサポートしてると、
そっちに逃げることも多いな。
- 318 :デフォルトの名無しさん:2009/12/15(火) 00:21:55
- >>317
好きなのをどうぞ
ttp://hackage.haskell.org/packages/archive/pkg-list.html#cat:data
- 319 :デフォルトの名無しさん:2009/12/15(火) 00:27:04
- http://www.google.co.jp/search?&q="どんな言語を受理するアルゴリズムでも"
とりあえずgoogle先生では引っかからなかった
- 320 :デフォルトの名無しさん:2009/12/15(火) 00:52:21
- まあそんなことよりも重要なのは「同じ」ってどういう意味だ?ってことだな。
同じアルゴリズムを異なる言語で書くと、それらは何をもって同じだというのか。
- 321 :311:2009/12/15(火) 01:04:18
- >>320
なんとなく話がかみ合ってないが。
この場合の言語てのはHaskellとかJavaとかのプログラム言語のことじゃないよ。
大雑把に言うと解きたい問題のこと。
計算理論だとそういう言い方したりする。
- 322 :デフォルトの名無しさん:2009/12/15(火) 01:06:55
- >>317
配列もあればタプルもあるしハッシュもある。
ろくに調べもせずそういうこと言わない。
- 323 :デフォルトの名無しさん:2009/12/15(火) 01:16:43
- 異なる言語を「同じ」ベンチマークで比較するとか、よくある問題だな
- 324 :デフォルトの名無しさん:2009/12/15(火) 09:13:21
- 「言語を受理する」ときたら、それを受けるのは「オートマトン」じゃないかな。
まぁアルゴリズムでも意味は通るが。
- 325 :デフォルトの名無しさん:2009/12/15(火) 12:06:47
- 手続き型言語と比較ってのは、要するに定数時間で読み書きできる配列のある言語と比較ってことだろ?
なら答えは「Haskellにも定数時間で読み書きできる配列があるから同じ」
詳しくはIOArrayあたりを調べればいい
- 326 :デフォルトの名無しさん:2009/12/15(火) 15:14:39
- >>314
dynamic loadingってあるけど
これで糞長いLinking..から開放されるってこと?
- 327 :311:2009/12/15(火) 22:15:05
- >>325
けっきょくモナドなん?
つかモナドってよくわかってないんだけども。
Haskellは副作用がないから純粋でいいんだ〜ってよくきくよね?
でも副作用を使うためにモナドが用意されてて、
モナドは使わないに越したことはないんだけども、
モナドを使ってもHaskellは純粋なままなんだ〜とか。
さっぱりわからんw。
- 328 :ちんこ ◆GbXlaaQNk. :2009/12/15(火) 22:27:15
- "."と">>="の違いは何?
"+++"は一体何のために作られたのか?
説明よろ。
- 329 :デフォルトの名無しさん:2009/12/15(火) 22:35:29
- >>325
311じゃないんだが、横から質問させてください。
たとえば整数の二次元配列の1要素に書き込む処理を考えると、
手続き型言語であれば、機械語のレベルで数ステップから十数ステップ程度の
オーバーヘッドで実行できる。1要素の読み出しと大差は無いし、処理時間も定数的です。
で、HaskellのIOArrayへの書き込み処理というのも、「1要素の読み出しと大差の無い時間で
実行できる」ものなのでしょうか?もしYesなら「手続き型言語と同じ」と言えるでしょう。
でも個人的には、おそらくIOArrayの実装とは、書き込んだ状態変化を差分として保持し、
それをハッシュで管理することでオーバヘッドを最小限に押さえているのだと想像しています。
だとすれば、とても読み出し処理と同じオーバヘッドで実行できるはずはありません。
それともHaskellのIOArrayは、素人の想像を超えた(魔法のような)ロジックで
実装されているのでしょうか?それがモナド・マジックとやらなのかなぁ.....。
- 330 :デフォルトの名無しさん:2009/12/15(火) 22:38:22
- なんだなんだ、最近Haskellはやってんの?
俺が昔書いたHaskellのライブラリ、今日のダウンロード数0だよ。乙ですw
- 331 :デフォルトの名無しさん:2009/12/15(火) 23:33:00
- >>328
何見て勉強してるんだ?
いくつかネットで読めるチュートリアルを最初から読めば
そんな質問はしないはずだが
- 332 :デフォルトの名無しさん:2009/12/16(水) 01:44:17
- ちんこだけは構わないでください
- 333 :デフォルトの名無しさん:2009/12/16(水) 15:37:38
- >>327
Haskellでは「いかにも関数的」な書き方もできるし、IOモナドを使えば手続き的にも書ける
関数的に綺麗に書ける場合はそれに越したことはないが、
IOモナドを使って手続き的に書いた場合でも参照透明性は損われない、ってだけのこと
>>329
実装は読んでないけど、IOArrayの実体はポインタの配列で、
IOArrayへの書き込みは(ポインタの)破壊的代入で実装されてるはず
GC関係でもうちょっと追加の作業をやってるかもしれんが、
少くとも差分を管理するような複雑なことはやってない
IOモナドを使えば順序立った入出力ができるんだから、
メモリを外部の装置と思えば入出力と同じ要領で破壊的書き換えができる
どこにも魔法はないよ
- 334 :329:2009/12/18(金) 03:19:55
- >>333
遅くなりましたが、レスありがとうございました。
「メモリを外部の装置と思えば」という比喩で理解できました。
Haskellからすれば添字でアクセス可能な外部データベースに見えるわけですね。
というか、IO-という接頭辞でそれに気付けなかった自分がおバカでした。
- 335 :デフォルトの名無しさん:2009/12/21(月) 15:31:35
- どんなにがんばってもO(n*log(n))のソートが書けないプログラミング言語とか嫌だよね
- 336 :デフォルトの名無しさん:2009/12/21(月) 16:05:27
- STモナドでがんばればできるんじゃないか?
- 337 :デフォルトの名無しさん:2009/12/21(月) 16:32:49
- モナドまんせ〜というのは分かるけど、遅延処理っていらなくない?
- 338 :デフォルトの名無しさん:2009/12/21(月) 16:33:30
- 遅延評価*
- 339 :デフォルトの名無しさん:2009/12/21(月) 16:34:22
- >>337
ん、どうして?
遅延評価があるから無限リストができるのに。
- 340 :デフォルトの名無しさん:2009/12/21(月) 18:09:43
- ところで、無限リストをIOに変換したいときってどうするの?
[a] -> IO a
- 341 :デフォルトの名無しさん:2009/12/21(月) 18:16:35
- >>340
たとえば
hoge :: [a] -> IO a
hoge = return . head
- 342 :デフォルトの名無しさん:2009/12/21(月) 18:39:55
- >>341
できれば、無限リストを、と言ってるのを無視しないで・・・
それだと有限でも無限でも関係ないから
- 343 :デフォルトの名無しさん:2009/12/21(月) 19:32:19
- 無視しないでとか関係ないから、じゃなくて、中身が次々と取れるようなものが
ほしいということでしょ?
- 344 :デフォルトの名無しさん:2009/12/21(月) 19:40:58
- リストが有限か無限かを知る方法ってなんかうまいやり方あったっけ?
- 345 :デフォルトの名無しさん:2009/12/21(月) 19:42:32
- >>344
それは証明できないことだと思うよ。
- 346 :デフォルトの名無しさん:2009/12/21(月) 19:47:35
- リストが有限か無限かで区別できたらおかしいw
- 347 :デフォルトの名無しさん:2009/12/21(月) 20:04:27
- >>344
手続き型言語的には、ループになってるリストを検出するとか。
Haskellだと関数呼び出しが単純な何もしない無限ループになってると処理系で検出するよね...
と思ったらghciだとダメだったorz
- 348 :344:2009/12/21(月) 20:05:17
- >>345-347
だよなwww
- 349 :デフォルトの名無しさん:2009/12/21(月) 20:06:04
- >>340
こういうの?
有限リストを渡すと突然死ぬ
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
- 350 :340:2009/12/21(月) 20:33:27
- >>349
内容は理解してないけど動作確認した。ありがとう。
型は [a] -> IO (IO a) にしないとだめなの?
- 351 :デフォルトの名無しさん:2009/12/21(月) 20:43:58
- >>350
do
g1 <- listToGenerator [1..]
g2 <- listToGenerator [1..]
としたら、g1とg2は相互に独立した、系列の違うジェネレータにならないと困るだろ?
つまり、listToGeneratorは呼ばれるたびに別のものを返さないといけないので、
普通の関数じゃなくてIO動作としてしか定義できない
- 352 :340:2009/12/21(月) 22:38:02
- >>351
それは分かったけど、
IO aを返すにしても、IO (IO a)を返すにしても、IOであることには変わりない。
型を見る限りでは「Generatorを返す関数」である可能性はぜんぜん否定できてない。
型レベルでは
「普通の関数が、呼ばれるたびに別のものを返す」可能性を否定できないの?
- 353 :デフォルトの名無しさん:2009/12/21(月) 23:37:44
- 何を言いたいんだかわかんない。
Generatorって何、普通の関数って何?
- 354 :デフォルトの名無しさん:2009/12/21(月) 23:46:45
- ジェネレータを返す関数は、呼ばれるたびに、
相互に独立した、系列の違うジェネレータを返さないといけない。
IOはジェネレータである。
ゆえに、IOを返す関数は、呼ばれるたびに、別のものを返す。
- 355 :デフォルトの名無しさん: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型の値が結果として得られるけど、この結果は毎回異なる可能性がある)
- 356 :デフォルトの名無しさん:2009/12/22(火) 00:49:03
- >>355
b = Generator aとすると
IO (Generator a)
= IO b
= Generator b
- 357 :デフォルトの名無しさん:2009/12/22(火) 09:29:29
- [a] -> Generator a は困ると>>351は言ってるのに
[a] -> Generator b を作って何とも思わないの?
- 358 :デフォルトの名無しさん:2009/12/22(火) 17:43:53
- >>356
それはその通りだけど、何が言いたい?
- 359 :デフォルトの名無しさん:2009/12/22(火) 18:20:17
- >>358
・ジェネレータを返す関数(≠アクション)が存在する
・その関数は参照透明にならないかもしれない
・ちゃんと参照透明になっているかどうか、型推論では推論できない
- 360 :デフォルトの名無しさん:2009/12/22(火) 18:51:59
- >・ジェネレータを返す関数(≠アクション)が存在する
うん
listToGeneratorの結果のGenerator (Generator T)は毎回異なる必要がないので、関数でおk
>・その関数は参照透明にならないかもしれない
Haskellの関数は基本的に全部参照透明だよ。もちろんlistToGeneratorも参照透明
参照透明じゃない関数はunsafePerformIOを直接間接に使うくらいしか書く方法がないし、滅多に書かない
特に理由がなければ関数は参照透明だと仮定して議論しても問題ないと思う
>>355でもほとんど同じことを言ってるけど、listToGenerator :: [a] -> IO (IO a)は同じ[a]を与えられたら常に同じIO (IO a)を返す
>・ちゃんと参照透明になっているかどうか、型推論では推論できない
「型推論では推論できない」ってのは、「型を見ただけでは判定できない」って意味?
それなら上で答えたとおり、特に理由がなければ参照透明とみなす
ついでに言うと、「型推論」ってのは、明示的に型が書かれていない式や変数の型を計算することね
- 361 :デフォルトの名無しさん:2009/12/22(火) 19:07:11
- >>360
>特に理由がなければ関数は参照透明だと仮定
ジェネレータがからむと参照透明じゃなくなる場合があるって言ってるのに
なんで「特に理由がない」ってことにするわけ?
それと「仮定」ってあいまいな言い方をするのも、どうかと思う
- 362 :デフォルトの名無しさん:2009/12/22(火) 19:08:05
- ところで最近のHaskell界隈で一番話題になってることって何?おしえて
- 363 :デフォルトの名無しさん:2009/12/22(火) 19:13:06
- >>361
>ジェネレータがからむと参照透明じゃなくなる場合があるって言ってるのに
俺はそんなこと言ってない。もしそういう場合があると主張するなら根拠を示してくれ
>それと「仮定」ってあいまいな言い方をするのも、どうかと思う
それはすまん。「とりあえず正しいと信じる」って意味で使った
- 364 :デフォルトの名無しさん:2009/12/23(水) 17:22:50
- クリスマスはHaskellで遊んでたら気付いたら過ぎ去ってた
みたいにしたい
- 365 :デフォルトの名無しさん:2009/12/23(水) 22:17:05
- クリスマスは彼女と一緒にHaskellで遊ぶんだが、何か注意点ある?
- 366 :デフォルトの名無しさん:2009/12/23(水) 22:19:13
- >>365
スレ違い
女性に質問!マジレスしてくれ part579
http://hideyoshi.2ch.net/test/read.cgi/lovesaloon/1261474477/
- 367 :デフォルトの名無しさん:2009/12/23(水) 22:35:40
- Haskell Platformとghcは何が違うの?
- 368 :デフォルトの名無しさん:2009/12/24(木) 00:02:05
- >>365
遅延評価するにしても結局は必要になるんだぞ?
- 369 :デフォルトの名無しさん:2009/12/24(木) 01:10:32
- 普通は23日にイチャついて、24日はセックスだけして、
25日は家族と何事も無かったかのようにクリスマスパーティだろ。
- 370 :デフォルトの名無しさん:2009/12/24(木) 15:51:16
- 彼女も居る事にして取り敢えず遅延評価ですねわかります
- 371 :デフォルトの名無しさん:2009/12/24(木) 16:01:45
- 賞味期限
16…予約はじまる
22…予約最盛期
23…我慢できない
24…最盛期
25…ロスタイム
26…半額
27…更に半額
28…返品
29…廃棄処分
30…廃棄処分逃れてもカビ
____
/_ノ ヽ、_\
ミ ミ ミ o゚((●)) ((●))゚o ミ ミ ミ クリスマスケーキのことだお
/⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\ /⌒)⌒)⌒) 自分の年齢当てはめてんじゃねぇおww
| / / / |r┬-| | (⌒)/ / / // バ
| :::::::::::(⌒) | | | / ゝ :::::::::::/ ン
| ノ | | | \ / ) / バ
ヽ / `ー'´ ヽ / / ン
| | l||l 从人 l||l l||l 从人 l||l
ヽ -一''''''"~~``'ー--、 -一'''''''ー-、
ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))
- 372 :デフォルトの名無しさん:2009/12/24(木) 17:16:05
- >>367
Haskell Platform = GHC + ライブラリパッケージ
- 373 :デフォルトの名無しさん:2009/12/24(木) 18:29:32
- >>372
ライブラリパッケージだけじゃなく、
Cabal とか便利なツールも最初からいくつか入ってるよ。
- 374 :372:2009/12/24(木) 18:57:58
- >>373
そうだな。正確には
- 375 :デフォルトの名無しさん:2009/12/24(木) 19:32:16
- Haskell PlatformはwindowsとかOSX用のは便利かもしれないけどLinux向けのには何かメリットあるの?
インストールするにはGHCやCabalが必要となっているし。
- 376 :デフォルトの名無しさん:2009/12/24(木) 19:42:02
- >>375
外出中にネットを利用できないときに、基本的なライブラリが既にインストールされているとコードのコンパイルに失敗しない場合がある。
- 377 :デフォルトの名無しさん:2009/12/24(木) 20:24:53
- >>370
それで本当に必要になったときに現れるのでしょうか?
- 378 :デフォルトの名無しさん:2009/12/24(木) 20:28:49
- >>377
遅延できるのは彼女の作り方にパラメータを入れて計算する作業だ
彼女の作り方が定義されていなければ必要な時に答えを出すことはできない
遅延評価は魔法ではない
- 379 :デフォルトの名無しさん:2009/12/24(木) 20:51:31
- 仮に必要ないことが判明したら、捨ててもノーコストで済みますか?
勝手に投機計算が始まっても困るのですが?
- 380 :デフォルトの名無しさん:2009/12/24(木) 21:27:16
- >>379
きみの処理系はどのように実装されているんだ?
- 381 :デフォルトの名無しさん:2009/12/24(木) 22:37:58
- Haskell Platformに先だってghcの最新版がリリースされた時は
どうすれば良いのですか?
黙殺してPlatformの更新を待てば良いのですか?
それともghcだけすげ替える事が可能なのですか?
- 382 :デフォルトの名無しさん:2009/12/24(木) 23:08:38
- ghc-6.12.1で-dynamicを試してみた
当たり前だが実行ファイルサイズは激減した
非標準パッケージはdyn.hiを同梱していないものが現状では多いので
今後に期待
- 383 :デフォルトの名無しさん:2009/12/24(木) 23:18:37
- >>381
Platform使ってるの?あれって普及用だろ。インサイダーは個別にインストールが原則
- 384 :デフォルトの名無しさん:2009/12/25(金) 00:09:13
- 良く分からないけど分かりました
- 385 :デフォルトの名無しさん:2009/12/26(土) 00:07:02
- http://www.sampou.org/cgi-bin/w3ml.cgi/haskell-jp/msg/480
>今回のリリースから GHC は開発者向けのリリースになり、一般ユーザー向けのリリース
>は Haskell Platform で行われるよう変更されたので気をつけてください。
要するに自分でどうにか出来る奴だけが自己責任で使えってことだな。
- 386 :デフォルトの名無しさん:2009/12/26(土) 21:17:43
- haskell を script 的に使うのは、起動が遅くて実用的じゃないと思っていたけど、
6.12で日本語文字列を試す為に、文字数を数える簡単なプログラムを
#!/usr/bin/runhaskell を使って書いてみたら、速くなっているように感じた。
計ってみたら、
0.8s (6.10.4) -> 0.4s (6.12.1) と半減してたよ。
- 387 :デフォルトの名無しさん:2009/12/27(日) 13:26:44
- C言語で、あるデータ構造を持つデータのバイト列を、
そのデータ構造をあらわす構造体にコピーするのは簡単ですが、
Haskellではバイト列が与えられたとき、Haskell内部のデータ構造として扱うにはどうすればいいですか?
- 388 :デフォルトの名無しさん:2009/12/27(日) 17:32:11
- >>387
データ型を定義して、ByteStringを入力とする関数を定義するしかないんじゃない?
強い型付けだから暗黙キャストは無理
- 389 :a36 ◆K0BqlCB3.k :2009/12/27(日) 19:48:51
- >>387
SerTH
- 390 :デフォルトの名無しさん:2009/12/27(日) 20:08:20
- >>389
アクセスできませんが
- 391 :デフォルトの名無しさん:2009/12/27(日) 20:50:19
- Haskell から COM にアクセスしてみたく、
Cabal で 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 をフルインストールしているのですが、ありませんでした。
(インデックス作成機能を切った状態で、
エクスプローラでストレージ内に検索をかけて探しました)
このファイルはどこからかダウンロードしてくるのでしょうか。
- 392 :デフォルトの名無しさん:2009/12/27(日) 20:59:47
- com-1.2.3の中にあるでしょ?
- 393 :デフォルトの名無しさん:2009/12/27(日) 21:32:02
- 今、http://hackage.haskell.org/cgi-bin/hackage-scripts/package/com から
com-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 は見てくれないのでしょうか。
- 394 :デフォルトの名無しさん:2009/12/27(日) 22:05:09
- ライブラリは gcc が使うやつじゃないといけないのかと思い、
extra-lib-dirs に指定するパスを下記のものに変えてみましたが、
結果は同じでした。
C:\Program Files\Haskell Platform\2009.2.0.2\gcc-lib
- 395 :デフォルトの名無しさん:2009/12/27(日) 23:30:35
- そのエラーはメッセージ通りじゃないケースが多いよ(↓参照)
http://article.gmane.org/gmane.comp.lang.haskell.cafe/68204
cabal のオプションに -v3 とかつけると原因が分かると思う
- 396 :デフォルトの名無しさん:2009/12/28(月) 01:05:02
- >>392,395 アドバイスありがとうございました。
おかげさまで原因がわかり、ネット上の情報も参考にして、
無事インストールできました。
"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つ目の修正が何となく気持ち悪いですが、とりあえずインストールはできました。
これから実際に使ってみます。
- 397 :デフォルトの名無しさん:2009/12/29(火) 20:51:14
- FFI について質問です。
C言語で次のような定義の関数があるとします。
int mkData (int** ppData)
これは引数でポインタのポインタを取り、内部でメモリ領域をいくらか確保し、
その先頭アドレスを *ppData に入れてます。
そして、エラーコードを戻り値で示します。
このような関数を haskell から使いたい場合、
foreign import 宣言はどのように書いたらいいのでしょうか。
つまり、引数に値を入れて返してくるタイプの関数の呼び方です。
- 398 :デフォルトの名無しさん:2009/12/29(火) 23:13:52
- >>397
import Foreign.Ptr
import Foreign.C.Types
foreign import ccall "mkData" mkData :: Ptr (Ptr CInt) -> IO CInt
- 399 :デフォルトの名無しさん:2009/12/30(水) 00:59:36
- >>398
ありがとうございます。
コンパイルは通りました。
ただ、実行時にアクセス違反らしきエラーが出ます。
こちらの問題はもう少し自分で考えてみます。
- 400 :デフォルトの名無しさん:2009/12/30(水) 03:24:56
- >>398 のようにして定義した mkData 関数を呼ぶ方法なんですが、
haskell 側でたとえば a = nullPtr :: Ptr CInt として a を定義し、
「これのポインタ」を mkData 関数に渡す必要があるのですよね。
この a のポインタはどのように得るのでしょうか。
もしかして全く見当外れでしょうか。
- 401 :デフォルトの名無しさん:2009/12/30(水) 14:19:53
- mkDataの戻り値が>=0の場合はデータの個数と仮定するとこんな感じで良いんじゃないかと思う。
import 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) }
- 402 :デフォルトの名無しさん:2009/12/30(水) 16:29:52
- >>401
ありがとうございました。
おかげさまで、mkData の引数を使って値を得ることができました。
ついでに確認なんですが、
C言語の方で malloc を使ってメモリ領域を確保しているのなら、
プロセス終了時に自動的に全て解放してくれると思います。
しかし、たとえば同じような方法で COM のインスタンスを得ている場合は、
最後の return . Just の前で COM を Release しておかないと、
参照カウンタがいつまでたっても減らずにメモリリークしますよね?
- 403 :デフォルトの名無しさん:2009/12/30(水) 16:33:35
- どうしてそう思ったの?
- 404 :デフォルトの名無しさん:2009/12/30(水) 16:43:59
- >>403
あ、peek か peekArray の結果も一緒にタプルなんかでまとめて返せば、
後でいつでも解放はできますね。
Haskell のプログラムが終了する前に Release しておかないとダメですよね、
という確認です。
> どうしてそう思ったの?
いろんなプロセスで共有している COM は、
参照カウンタがゼロにならない限り、解放されない作りになっていると
学んだ記憶があるからです。
- 405 :デフォルトの名無しさん: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 が現れていないのも不思議です。
併せて教えていただけないでしょうか。
- 406 :デフォルトの名無しさん:2010/01/01(金) 20:02:18
- >>405
おっと、間違えました。
System.IO.Encoding.print :: (Data.Encoding.Base.Encoding e, Show a, ?enc::e) => a -> IO ()
です。
- 407 :デフォルトの名無しさん:2010/01/01(金) 20:43:00
- >>405,406
分かりました。
Implisit Parameter(暗黙パラメータ)なんですね。
使い方も理解できました。
一人で騒いですいませんでした。
- 408 :デフォルトの名無しさん:2010/01/01(金) 20:44:23
- >>407
うぁぁ、Implicit Parameter でした。
ほんとすいません
- 409 :デフォルトの名無しさん:2010/01/01(金) 22:28:40
- MacOS(10.6.2)にhaskell-platform-2009.2.0.2-i386.dmgをインストール
しようとしているのですが、GHC-6.10.4-i386.pkgのインストール中、
「インストールの種類」までいったところで右下の「インストール」ボタン
がグレーになってて押せず途方に暮れています。どうすればいいのでしょう?
- 410 :デフォルトの名無しさん:2010/01/03(日) 13:58:32
- Foreign.Marshal.Utils.with によるメモリ領域確保&ポインタ取得ですが、
次のように複数個のメモリ領域を続けて確保したい場合、
もっと入れ子を減らして短縮できる書き方は無いでしょうか。
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
複数個同時に確保できる関数を自作するしか無いでしょうか。
- 411 :デフォルトの名無しさん:2010/01/03(日) 16:05:34
- >>410
($)を使うといいよ。それにdoも必要ない
with (1::Int) $ \pi ->
with (2.0::Double) $ \pd ->
with ...
- 412 :デフォルトの名無しさん:2010/01/03(日) 17:23:49
- >>410
↓を参考にして((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
- 413 :デフォルトの名無しさん:2010/01/03(日) 17:28:53
- >>411
すいません、自分のプログラムをコピペしないで、
あたまで急いで考えたスニペットを深く考えずにそのまま載せてしまいました。
実際のプログラムでは ($) を使って、かつ do も無いです。
with の入れ子を減らすのに使えそうな関数を
標準ライブラリ内で色々探してみましたが無さそうです。
仕方なく自作しました。
with2 d1 d2 f = with d1 $ \pd1 ->
with d2 $ \pd2 ->
f pd1 pd2
withN は withN-1 を使って作りました。
- 414 :デフォルトの名無しさん:2010/01/03(日) 17:31:00
- >>412
リロードし忘れました。
とりあえず自前ので問題は解決しましたが、
おもしろそうなので調べてみます。
- 415 :デフォルトの名無しさん:2010/01/04(月) 15:51:57
- [Real World Haskell] の日本語版で質問があります。
125 ページに、text、double、string の各関数は
Prettify モジュールに書くと言っています。
また、早めのコンパイルのために、とりあえず型と何もしない内容を書いた
スタブ(PrettyStub)モジュールを作るとも言っています。
にもかかわらず、次のページで早くも string 関数が
「PrettyJSON モジュール」に実装されています。
後の方のページをざっと見てみますと、text 関数や double 関数らは
ちゃんと Prettify モジュールで定義されているようです。
これは誤字の類なんでしょうか。
それとも何らかの意図があってそうしているのでしょうか。
誤字なら報告しておきたいのですが。
- 416 :デフォルトの名無しさん:2010/01/05(火) 13:16:53
- [Haskell Platform 2009.2.0.2] をインストールしているのですが、
index ページの Search: 欄に "const" を入れて [Search] ボタンを押しても、
"No results found, displaying all" と表示されます。
しかし、同じページでブラウザのページ内検索機能を使って
同じ文字列を検索すると、ちゃんとヒットします。
こういうものですか? それともインストール失敗?
- 417 :デフォルトの名無しさん:2010/01/05(火) 22:40:59
- >>415
原文確認してみたら
ttp://book.realworldhaskell.org/read/writing-a-library-working-with-json-data.html
- 418 :デフォルトの名無しさん:2010/01/05(火) 23:54:53
- >>417
原文とコメントを読んでみましたが、
Kevin の「何で string が PrettyJSON.hs にあるんだよ」的なコメントと、
gmaths の「俺もそう思う」的なコメントしか得られないんですけど・・・
結局、間違いなのか意図があるのか、分からないです。
なにか見落としてますでしょうか。
- 419 :デフォルトの名無しさん:2010/01/06(水) 00:26:12
- >>409
ちょうど同じところで引っかかってた。
たぶんXcodeが入ってないか、正しくインストールできてない。
自分の場合は一応入ってたんだけど、AppleのDeveleper Centerから
最新のXcodeを落としてきて入れ直したら先に進めたよ。
- 420 :デフォルトの名無しさん:2010/01/07(木) 05:47:04
- haskellは身を助ける (^∇^゚*. ギャハハ
- 421 :デフォルトの名無しさん:2010/01/07(木) 06:33:46
- >>420
むしろlispじゃないか?簡単に実装できるし。
- 422 :デフォルトの名無しさん:2010/01/07(木) 21:05:18
- >>419
それでした。Xcodeでかいので昨夜はダウンロードしかけて寝ちゃいましたが
今試してばっちりインストールできました。しょうがないのでvmware上の
ubuntsuで遊んでたんですが、メモリ2Gしかないとやっぱりきびしいので、
ネイティブで動くのは助かります。
- 423 :デフォルトの名無しさん:2010/01/08(金) 13:28:46
- 思ったことが直ぐ書けるのっていいよな
思ったことを直ぐ作れるかどうかはライブラリによるけど
- 424 :デフォルトの名無しさん:2010/01/08(金) 20:05:50
- 自分のブログに書いたら?
- 425 :デフォルトの名無しさん:2010/01/09(土) 17:39:02
- >>424
念のため言っておくが、>>423は私ではないし、私はブログを持っていない
- 426 :デフォルトの名無しさん:2010/01/10(日) 13:59:11
- お前は誰だよwww
- 427 :デフォルトの名無しさん:2010/01/10(日) 21:21:36
- 俺は俺だよ
- 428 :デフォルトの名無しさん:2010/01/10(日) 23:59:37
- 俺は一体誰なんだ
- 429 :デフォルトの名無しさん:2010/01/11(月) 01:14:24
- System.Directory
safeGetDirectoryContents path
| doseDirectoryExist path = getDirectoryContents path
| otherwise = return []
上のような関数作りたいのですけど、
existDirectory pathがIO Boolでどうしようもできん。
どう書いたらいいの?
- 430 :デフォルトの名無しさん:2010/01/11(月) 01:37:12
- へっぽこな俺が、試しに書いてみよう。
safeGetDirectoryContents path = do b <- doesDirectoryExist path
if b
then getDirectoryContents path
else return []
safeGetDirectoryContents path = catch (getDirectoryContents path) (const (return []))
- 431 :デフォルトの名無しさん:2010/01/11(月) 05:35:48
- safeGetDirectoryContents path = do
exist <- doesDirectoryExist path
ifM exist (liftM Just $ getDirectoryContents path) (return Nothing)
ifM True a _ = a
ifM False _ b = b
- 432 :デフォルトの名無しさん:2010/01/11(月) 15:51:47
- >> 430
>> 431
thanks!
なぜかガードにこだわってたのが敗因だわ。
- 433 :デフォルトの名無しさん:2010/01/11(月) 23:58:54
- [Real World Haskell 日本語] で分からないところがあります。
p.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 で実行を試していますが、どうやって?
- 434 :デフォルトの名無しさん:2010/01/15(金) 01:06:21
- haskellやOcamelの系統で
lispのstalinに相当する
処理速度が早いコンパイラはありませんか?
- 435 :デフォルトの名無しさん:2010/01/15(金) 01:26:57
- >>434
http://mlton.org/
- 436 :デフォルトの名無しさん:2010/01/15(金) 10:26:34
- Haskellなら、
生成されるコードの性能なら普及率とかまで考えたら今のとこGHC。
だいぶ前に論文ではもっと高性能だという話だったGRINってのがあって、
それを使ったコンパイラUHCというのがちょっと前のハカソンでリリースに
なってるようだ。
- 437 :デフォルトの名無しさん:2010/01/15(金) 11:48:27
- GHCという言語もあるんだがなぁ
名前変えろよボケ
GlasgowやめたんならGlasgow Haskell Compilerなんて名前は変えればいいのに。
- 438 :デフォルトの名無しさん:2010/01/15(金) 11:57:32
- 死んだ言語のことなんて一々気にしてられない
- 439 :デフォルトの名無しさん:2010/01/15(金) 13:09:16
- >>438
カチンとくる書き込みするなぁ。並列処理の記述に関しては
HaskellはGHCの足元にも及ばないよ。
- 440 :デフォルトの名無しさん:2010/01/15(金) 14:07:09
- 他言語のことなんてどうでもいいがね。
まずボクシングが思い浮かぶ俺もどうかと思うけどw
- 441 :デフォルトの名無しさん:2010/01/15(金) 14:19:00
- 論理言語スレとかならともかく、このスレで言っても意味ないこと言わんでくれ。
- 442 :デフォルトの名無しさん:2010/01/15(金) 18:46:07
- >>440
プロレスだろ。ノアの至宝だ
- 443 :デフォルトの名無しさん:2010/01/16(土) 01:45:30
- そもそもHaskellって並列処理を必ず明示的に記述する言語ではないしな
関数型言語であって、直列とか並列とかは言語レベルの問題ではない
- 444 :デフォルトの名無しさん:2010/01/16(土) 11:40:53
- 「死んだ」に対する反論が「並列処理の記述」なんだから
察してやれよ
- 445 :デフォルトの名無しさん:2010/01/16(土) 12:12:58
- 言語に関して死んだとかそういうもの言いをする奴もロクな奴じゃないけどな
- 446 :デフォルトの名無しさん:2010/01/16(土) 12:27:01
- ケント大学大学院在籍中の俺に何か質問は?
- 447 :デフォルトの名無しさん:2010/01/16(土) 12:33:43
- >>446
では質問するが、>>433 についてはどう思う?
君の見解が聞きたい。
他の者らは私の質問にちっとも相手してくれないんだ。
- 448 :デフォルトの名無しさん:2010/01/16(土) 13:39:27
- GHC
提供: フリー百科事典『ウィキペディア(Wikipedia)』
GHC
ガーナの通貨単位セディをあらわす通貨コード(ISO 4217)
グローバル・オナード・クラウン - 日本のプロレス団体プロレスリング・ノアの管理する選手権
グローバル・ハードコア・クラウン - 同団体の秋山準がタイトル管理委員長を務めるハードコア王座
Guarded Horn Clauses - 並行論理型プログラミング言語
ガード付きホーン節 (Guarded Horn Clause)
Glasgow Haskell Compiler - プログラミング言語Haskellの主要なコンパイラ
このページは曖昧さ回避のためのページです。
一つの言葉や名前が二つ以上の意味や物に用いられている場合の水先案内のために、
異なる用法を一覧にしてあります。お探しの用語に一番近い記事を選んで下さい。
このページへリンクしているページを見つけたら、リンクを適切な項目に張り替えて下さい。
カテゴリ: 曖昧さ回避
- 449 :デフォルトの名無しさん:2010/01/16(土) 13:40:36
- GHC
From 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
- 450 :デフォルトの名無しさん:2010/01/16(土) 13:57:28
- 地縛霊でもいるのか
- 451 :デフォルトの名無しさん:2010/01/16(土) 16:15:31
- おっぱいがはじけるhaskell ごろがいいね。
- 452 :デフォルトの名無しさん:2010/01/16(土) 22:27:42
- [Real World Haskell 日本語] の P.378 - P.379 に
Supply モナドを乱数の発生源として利用する方法が書かれていますが、
このように 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 モナドの利用方法を例示するために無理矢理そうしたとしか思えないのですが、
ちゃんとした意義はあるのでしょうか。
- 453 :デフォルトの名無しさん:2010/01/16(土) 22:37:28
- >>452
IOを使わないためでしょう。確か本にはそう書かれていたはずです。
あやふやな私の記憶なので間違っていたらごめんなさい。
- 454 :デフォルトの名無しさん:2010/01/16(土) 23:27:54
- >>453
改めて前のページを読み返してみたところ、
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を使わないためというのは理由にならないような気がします。
- 455 :デフォルトの名無しさん:2010/01/16(土) 23:44:41
- >>454
Supplyを使うのは実装の隠蔽です。Supply型を使うことで、イテレータ的なインタフェースで乱数を取得できます。
後で型クラスを使った例が出てきます。
- 456 :デフォルトの名無しさん:2010/01/17(日) 22:32:17
- timeパッケージがバージョンによって中身変わりまくりで
もうにっちもさっちもブルドッグ状態
- 457 :デフォルトの名無しさん:2010/01/17(日) 22:56:58
- 違う、にっちもさっちも「どうにも」ブルドッグだ(語呂は悪いがな)
最後に「ワォ!」をつけるとなお良い
- 458 :デフォルトの名無しさん:2010/01/17(日) 22:57:18
- Cabal結構エラるよな。
- 459 :デフォルトの名無しさん:2010/01/17(日) 23:01:11
- <`∀´>
- 460 :デフォルトの名無しさん:2010/01/18(月) 02:41:53
- >>最後に「ワォ!」をつけるとなお良い
ますだおかだの岡田かと思った。
- 461 :デフォルトの名無しさん:2010/01/20(水) 10:42:13
- mac ではすける
にはどうしたらいいですかごはん
xcode と emacs 以外でシンタックスカラーで
コード読みたいです
- 462 :デフォルトの名無しさん:2010/01/20(水) 13:04:55
- gnuのkompiler korekusyonは使えないの?
- 463 :デフォルトの名無しさん:2010/01/21(木) 15:32:24
- なぜ中途半端に英語?
- 464 :デフォルトの名無しさん:2010/01/23(土) 19:50:01
- GHC で -threaded オプション付きでコンパイルしたが、
RTSオプションで -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
- 465 :デフォルトの名無しさん:2010/01/23(土) 20:05:56
- >>464
環境を一つ書き忘れました。
OS : Windows 7 HomePremium
- 466 :デフォルトの名無しさん:2010/01/23(土) 23:53:02
- unix環境で出直してこい
- 467 :デフォルトの名無しさん:2010/01/23(土) 23:56:00
- >>466
そりゃ答えになってないでしょ。
俺も同じ問題にぶち当たったから真相が知りたい。
- 468 :デフォルトの名無しさん:2010/01/24(日) 00:01:39
- >>464
試してないけど、GHCは6.12.1で並列性能がずいぶん向上したと言ってる
最新版でも-N2で遅くなるなら、GHCの開発者に報告したら喜ばれると思う
- 469 :デフォルトの名無しさん:2010/01/24(日) 00:20:56
- >>464
http://book.realworldhaskell.org/read/concurrent-and-multicore-programming.html#id675076
- 470 :デフォルトの名無しさん:2010/01/24(日) 06:21:46
- Real World Haskell 日本語版 P.115に
> (1+2):(3+4):[]という値を考えましょう。seqをこの式に適用すると、
> サンク(1+2)は評価されます。最初の(:)構成子に到達したところで止まりますので、
> 2つ目のサンクには影響を与えません。
とありますが、(:)構成子の中に(1+2)と(3+4):[]があるわけで、サンク(1+2)は評価されないはずですよね。
let x = undefined:[] in x `seq` 2
としてもエラーにならないし。
- 471 :デフォルトの名無しさん:2010/01/24(日) 09:12:11
- >>464
同じコードを同バージョンGHCでFedora12でやってみたけど、同じ状況ですね。
並列プログラミングと銘打ちながら、「並列化のための…多くの機能がまだ実装されていません」と言うw
- 472 :デフォルトの名無しさん:2010/01/24(日) 14:16:27
- >>469
興味深い記事を紹介してくれたのはありがたいのだが、
その意図が全く分からない。
記事を読めばその理由が分かるのか、
それとも記事の通りにすれば -N2 の方が速くなるのか。
その記事の parSort2 関数を使い、閾値を色々変えて実験してみたが、
どれも -N1 より -N2 の方が圧倒的に遅かった。
記事には、デュアルコアでは 25% スピードアップすると書かれているが、
どうやったらそうなるのか知りたい。
ちなみに、>>469 の環境ではどうだったのかも教えてくれないだろうか。
- 473 :デフォルトの名無しさん:2010/01/24(日) 16:45:31
- >>472
>>469 のページは、このスレで何度か話がか出ている「Real World Haskell」の英語版なんで、
英語が苦手なら日本語版の書籍に頼ればいいと思う。
なんとなくだが、>>464 は、[0..10000]のようなソート済みのリストをソートしようとしている気がする。
>>469 にある SortMain.hs を計測に使えば、-N1 より -N2 の方が圧倒的に遅いなんてことはないと思う。
少なくとも、こちらで試した感じでは、"parSort2 2"で要素数700000のリストのソートが -N1 と -N2 で同程度の時間だった。
- 474 :デフォルトの名無しさん:2010/01/24(日) 20:00:35
- >>473
いや、>>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 で同程度の時間だった。
同程度ではまずいのではないか?
- 475 :デフォルトの名無しさん:2010/01/24(日) 21:38:59
- >>474
> 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なので、バージョンが違うせいだと思い放置した。
上の結果のようなあからさまな差はない、ということだけ伝えたかった。
- 476 :デフォルトの名無しさん:2010/01/25(月) 20:38:21
- >>475
以下が parSort2 2 を3つのパターンで実験してみた結果だ。
パターン番号 : 指定オプション : 処理時間
1 : -g1 -N1 : 1.0s
2 : -g1 -N2 : 20.0s
3 : -g2 -N2 : 20.0s
-N2 においては、-g1 でも -g2 でも処理時間的にはほとんど違いはなかった。
十数回程度の繰り返したが、結果は変わらず。
次レスに、-S オプションをつけて出力された統計データの一部の概略を示す。
- 477 :デフォルトの名無しさん:2010/01/25(月) 20:40:59
- >>475,476
下記が -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 の仕組みをよく理解していなく、ここから有益な情報を得ることができないのだが、
処理時間が大幅にかかる原因と思われるものは何か分かるだろうか。
- 478 :デフォルトの名無しさん:2010/01/25(月) 21:59:46
- >>476
そんなもんわからん。
> 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 のページからとってきたものを
そのまま使用しているだろうか。
- 479 :デフォルトの名無しさん:2010/01/25(月) 23:57:54
- >>478
> そんなもんわからん。
何か気に障ることを言ってしまっただろうか。
であれば、すまん。
もっとすまないのは、最初は素直にコピペしてきたのだが、
関数名をわかりやすくするために変更している時に、
触ってはいけない部分まで変えてしまっていた。
もう一度コピペし直してきたら、貴殿のように -N1 と -N2 で「似たような」結果になった。
お騒がせして本当に申し訳ない。
ただ、やはり -N2 の方が遅い。
例えば parSort2 2 で、リスト数 300000 で実行すると、
-N1 で 1.51s、-N2 で 1.57s、-g1 -N2 で 1.82s。
parSort2 n の n を増やせば増やすほど -N1 と -N2 の差が開く。
逆転したことが一度もない。
もう少し落ち着いて、自分で調べてみる。
つきあってくれてありがとう、申し訳なかった。
- 480 :デフォルトの名無しさん:2010/01/26(火) 01:31:52
- >>479
まず、前提として、>>464 が遅い理由は、>>469 を読めば理解できると思っている。
parSort2 が遅いことが理解を妨げていると思ってここまで付き合ってきたが、
それが解消しても理解が進んでないと思われることが悔しい。
>>468 によると、GHC 6.12.1 で並列性能が上がったらしいが、
それを逆に考えると、それ以前のバージョンは並列性能がそれほど期待できないということになる。
そのようなバージョンで高速化できないことに拘泥するのは無意味だと気づいて欲しい。
これ以上スレを汚すのは申し訳ないので、ここで消える。
スレを私物化する形になってしまい、申し訳なかった。
- 481 :デフォルトの名無しさん:2010/01/26(火) 19:31:53
- >>480
> そのようなバージョンで高速化できない ことに拘泥するのは無意味だと気づいて 欲しい
他にも興味深いトピックがあったから日本語版を買ってみたが、
翻訳者はバージョン6.10.4で動作を検証してるそうじゃないか。
であれば、このバージョンでの25%の速度向上も確認してるはず。
数%しか向上しないのなら環境の違いで納得できるが、
-N2の方が遅いというのは、やはり何処かに問題があると考える方が自然ではないか。
- 482 :デフォルトの名無しさん:2010/01/28(木) 13:42:40
- zipとunzipをパターンマッチを使って自分で定義したいんだが、
上手くいかない。良かったら教えてください。
- 483 :デフォルトの名無しさん:2010/01/28(木) 15:27:34
- >>482
アホすぎ。死ね
- 484 :デフォルトの名無しさん:2010/01/28(木) 16:25:38
- Introduction To Functional Programming Using Haskellの4.4を読むといいよ
- 485 :デフォルトの名無しさん:2010/01/28(木) 19:47:00
- >>484
ヒントを与えるのやめろよ
自立しないだろ
- 486 :デフォルトの名無しさん:2010/01/28(木) 21:36:43
- 自立するしない以下のレベルではないだろうか
- 487 :デフォルトの名無しさん:2010/01/29(金) 02:17:36
- プログラマって鬱病が多いんだね。仕事がハードで心に余裕がないからか。
ネタにマジレスは注意信号です、気軽にお近くの(ry
- 488 :デフォルトの名無しさん:2010/01/29(金) 09:01:25
- そもそも本業のプログラマがここにいるの?
- 489 :デフォルトの名無しさん:2010/01/29(金) 15:20:38
- platform マダー?
- 490 :デフォルトの名無しさん:2010/01/29(金) 16:03:36
- >>483
すみません、
zip,unzipのプログラムを書こうとするとなぜアホということになるのですか?
- 491 :デフォルトの名無しさん:2010/01/29(金) 18:14:50
- 不覚にもワラタ
- 492 :デフォルトの名無しさん:2010/01/29(金) 18:14:55
- >>489
なに、近々バージョンアップする予定なの?
- 493 :デフォルトの名無しさん:2010/01/29(金) 18:18:05
- >>490
うまくいかないのがアホ。
- 494 :デフォルトの名無しさん:2010/01/29(金) 18:28:27
- >>493
Haskellってやはり凄いんですね。zipやunzipの関数を書くのは
結構難しい課題だと思い込んでいました。
- 495 :デフォルトの名無しさん:2010/01/29(金) 19:19:15
- zipくれって書き込むと捕まるんだっけ?
- 496 :デフォルトの名無しさん:2010/01/29(金) 19:37:07
- >>494
それは Haskell というより関数型言語に慣れてないだけだと思うよ
- 497 :デフォルトの名無しさん:2010/01/29(金) 19:51:21
- >>494
そういう(zip、unzip自作の基になる)基礎知識は
ここで中途半端に得るより、本を一冊買ってじっくり学んだ方がいい。
「Haskell: The Craft of Functional Programming」を薦める。
- 498 :デフォルトの名無しさん:2010/01/29(金) 19:59:56
- func x = (x,x)になる関数funcを関数合成だけでやる事ってできないよね?
idとかを組み合わせて。
途中に名前を使う関数(\x -> (x,x))等を使用するのは無しで。
- 499 :デフォルトの名無しさん:2010/01/29(金) 20:15:52
- >>498
少々汚いやり方だがこんなのはどうだ?
まあPreludeの関数がパターンマッチングを使っているから美学的な意味しかないが
import Control.Arrow (first ,second)
makeTuple = second head . first head . splitAt 1 . repeat
main = print . makeTuple $ "You can do it!"
- 500 :デフォルトの名無しさん:2010/01/29(金) 20:36:00
- >>499
なるほど目から鱗だわありがと。
first f = \(x,y) -> (f x, y)
だからsplitAtしちゃえばいけるな。
- 501 :デフォルトの名無しさん:2010/01/29(金) 21:15:54
- id &&& idじゃ駄目かにゃ?
- 502 :デフォルトの名無しさん:2010/01/29(金) 21:23:39
- >>501
そのほうがいいな
- 503 :デフォルトの名無しさん:2010/01/29(金) 21:28:05
- >>501
ありがと。
Arrow人気すぎワロタ
- 504 :デフォルトの名無しさん:2010/01/29(金) 21:37:05
- そんな事もあろう
- 505 :デフォルトの名無しさん:2010/01/30(土) 09:30:37
- タプルを作るにはarrowしかないんだもの
- 506 :デフォルトの名無しさん:2010/01/31(日) 05:08:57
- >>461
同じくmac portsのghcが壊れてて入らない
darcs使いたいだけなのになんでこんなに苦労するんだろう
- 507 :デフォルトの名無しさん:2010/01/31(日) 08:22:36
- >>490
私もHaskell勉強中だが触発されてzip関数書いて見たら
普通に出来たけど?
パターンを網羅してないのかも
ソースコードは自立してもらう為非公開が良いのかな
次はunzipに挑戦だ!
- 508 :デフォルトの名無しさん:2010/01/31(日) 13:08:33
- 507ですがunzip出来ました
myunzip [] = ([],[])
myunzip ((x,y):ns) = ((x:(fst (myunzip ns))), (y:(snd (myunzip ns))))
最初 fst snd使ってなくて型が違うと怒られた
もっとこうするとスマートに再帰で書けるとか有ったら教えてください
- 509 :デフォルトの名無しさん:2010/01/31(日) 13:23:03
- http://www.haskell.org/ghc/docs/latest/html/libraries/base-4.2.0.0/src/GHC-List.html#unzip
- 510 :デフォルトの名無しさん:2010/01/31(日) 14:29:39
- myunzip ((x,y):ns) = let (xs,ys) = myunzip ns in (x:xs,y:ys)
どうどす?
- 511 :デフォルトの名無しさん:2010/01/31(日) 15:11:52
- foldr (uncurry (***).((:)***(:))) ([],[])
- 512 :デフォルトの名無しさん:2010/01/31(日) 15:37:57
- >>509,510,511
勉強になりました
ありがとう御座いました!!
とくに510は再帰と言うのにも拘ってスマートに書かれてて感動です
511もまだ知らない演算子(***)が使われてて勉強になりました
- 513 :デフォルトの名無しさん:2010/01/31(日) 20:19:42
- >>506
http://www.haskell.org/ghc/download_ghc_6_12_1.html#macosxintel
今は、バイナリをインストールするか
ソースコードからビルドするしかないんじゃないかな
- 514 :デフォルトの名無しさん:2010/01/31(日) 20:40:40
- まだportでghcインスコできないのか
- 515 :デフォルトの名無しさん:2010/01/31(日) 20:43:55
- >>511をよく見ると、unzipがAAに見えてくる…
- 516 :デフォルトの名無しさん:2010/01/31(日) 21:24:25
- 2つの同じ要素数のリスト (Num a) => [a] を、
片方を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)
もっと洗練された方法はあるでしょうか。
たとえば (++) 演算子は左辺のリストの要素数が大きいと不利なので、
これを改善できるとか。
- 517 :デフォルトの名無しさん:2010/01/31(日) 21:36:57
- すいません、age てました。
- 518 :デフォルトの名無しさん:2010/01/31(日) 22:21:45
- zipWith使ってる時点で既に線形時間だから気にすることないような気が
- 519 :デフォルトの名無しさん:2010/01/31(日) 22:24:37
- パスカルの三角形か?
その定義でも遅延評価のおかげで非効率にならないと思う。
- 520 :デフォルトの名無しさん:2010/01/31(日) 23:03:48
- >>518,519
あ、なるほど。
zipWith 関数でリストの分解->再構築が行われる時、
(as ++ [0]) の「先頭から順に」要素を取ってくるから、
++ 演算子によるリストの分解->再構築は処理されませんね。
盲点でした。
ありがとうございました。
- 521 :デフォルトの名無しさん:2010/01/31(日) 23:47:31
- >>516
zipWithと(++)はどちらもfoldrで書ける関数だから
最適化がかかって一つの再帰関数の置き換えられると期待。
そのままで大丈夫だと思う。
遅延評価のおかげではなく、最適化のおかげで非効率にならない。
見た目通りに処理されるなら
(as ++ [0]) の先頭要素を取ってくるときに
毎回 (x:xs ++ [0]) -> x:(xs ++ [0]) というパターンマッチが入るから、
結局リストの分解・再構築の分の処理はされちゃうよ。
- 522 :デフォルトの名無しさん:2010/02/01(月) 00:23:30
- 効率といったのは、先に(xs ++ [0])を評価して
次にzipWithを評価するというような、二度手間のリスト走査には
ならないという意味だったんだ。
GHCではzipWithはbuildを使うようになっているから、最適化も
されるんだろう。
- 523 :519:2010/02/01(月) 00:24:36
- あ、522は私です。
- 524 :デフォルトの名無しさん:2010/02/04(木) 19:58:58
- Real World Haskell ってそろそろ第2刷出た?
- 525 :デフォルトの名無しさん:2010/02/04(木) 22:27:50
- 「ふつうの Haskell プログラミング」について質問です。
次の cat プログラムの例が載っているのですが、
main = do cs <- getContents
putStr cs
これを実行すると、標準入力への入力が出力されるのですが、
これが何度も繰り返される仕組みがよくわかりません。
% ./cat
aaa # 入力
aaa # 出力、入力待ち
bbb # 入力
bbb # 出力、入力待ち
...
本には遅延評価って説明がありましたが、
ループが無いのに何度も入力/出力されるのが不思議です。
なぜこうなるんでしょう?
- 526 :デフォルトの名無しさん:2010/02/04(木) 22:36:12
- >>525
本の説明で理解できないなら、それ以上にわかりやすく説明するのは難しいな。
データフロー言語的な考え方が出来れば疑問に感じることはないと思うんだが…
- 527 :デフォルトの名無しさん:2010/02/04(木) 23:11:55
- >>525
>ループが無いのに何度も入力/出力されるのが不思議です。
ループはputStrの実装の中にある
getContentsアクションは標準入力の内容を一切読まずに、未評価の文字列を返す
putStrは、その文字列の中身を先頭から調べて、順番に表示していく
文字列の中身を調べる(つまり評価する)ときに初めて、標準入力からの読み込みが必要に応じて発生する
論理的にはユーザが一文字入力するたびにputStrが一文字出力するような動作と考えてもいい
実際はOSの行バッファが間に入るから、一行入力するたびに一行出力、になってる
あと、getContentsみたいな遅延IOはHaskellの振る舞いとしてはかなり例外的なものだから、
初心者ならあまり気にしないで先に進んでいいと思うs
- 528 :デフォルトの名無しさん:2010/02/05(金) 15:03:14
- >>525
cs は遅延評価されるから、
getContents - プロミスだけ渡すお
↓
putStr - プロミス評価するよー
↓
getContents - まだ入力ないから評価できないお
↓
getContents - 入力あったから、あった分だけ評価するお
↓
putStr - 評価きたから表示したよ。でも、まだ続きが評価できないよー
↓
getContents - まだ入力ないから(r
↓
getContents - 入力あったから(r
↓
putStr - 評価きたから(r まだ続きが(r
↓
・
・
・
無限ループ
- 529 :デフォルトの名無しさん:2010/02/06(土) 12:17:21
- ファイルとかはEOFが有るのでgetContentsで与えられるのは有限のリスト
一方、標準入力は事実上の無限リスト
putStrは続きの要素が表示できるようになったら表示してるだけ
- 530 :デフォルトの名無しさん: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回再構築している。
データ構造によってはもっと差が開く場合もありうる。
当然前者の方が効率はいいだろうが、演算の数が多く、
もっと良いデータ表現方法があればデータ構造を変えたい場合もあるので、
後者の堅牢性もほしい。
前者の効率性を重視しながら後者の堅牢性に近づける方法、あるいは
後者の堅牢性を重視しながら前者の効率性に近づける方法はないだろうか。
もしかしたら、データ構造に依るところが大きく、
一般的に解決する方法はないのだろうか。
- 531 :デフォルトの名無しさん:2010/02/06(土) 16:11:01
- その場合、コンパイラが最適化はしてくれないんだろうか
- 532 :デフォルトの名無しさん: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)
で十分だよね。
- 533 :デフォルトの名無しさん:2010/02/06(土) 16:39:00
- >>532
> 単純すぎて、どう堅牢性が上がっているのかも分からないし、
それは申し訳ない。
後者は、抽象データ構造にしてモジュールを分ければ、
プログラムの堅牢性が高まる。
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 の前者のように抽象の壁を設けないと、
データ構造の表現を変えた場合に、
そのデータ構造上の全ての演算の定義を変えなければならない。
- 534 :デフォルトの名無しさん:2010/02/06(土) 17:04:31
- で、私も >>531 や >>532 のように
>> 530 の後者でも最適化でほぼ同等の効率性を維持できると期待したいが、
「最適化で同じコードが出力された事を確かめる術」はあるのだろうか。
今はコンパイラとして GHC を使っているので
GHC のドキュメントをいろいろ眺めている最中なのだが、
この辺りの最適化の仕組みがあるのかどうかもまだ分からない状態だ。
- 535 :デフォルトの名無しさん:2010/02/06(土) 19:47:04
- とりあえず走らせて比較してみては
- 536 :デフォルトの名無しさん:2010/02/06(土) 20:30:41
- >>535
やっぱり、結局はそうなるのか。
いや、ダメってわけじゃないし、当然実際に測って比較はする。
誠にごもっともなんだが・・・
何というか、もっと理詰めで論理的に推論したいなぁと思う。
こういう最適化の仕組みがあって、今回この部分にこのような適用できるから、
このように最適化されることが期待できる、みたいな。
- 537 :デフォルトの名無しさん:2010/02/06(土) 20:34:06
- >>536
GHCのソースでも読むしかないんじゃね?
- 538 :デフォルトの名無しさん:2010/02/06(土) 20:38:50
- 抽象データ型のコストは、そりゃ当然あるだろうが
どのように実装しているかの議論は軽く本一冊にはなるしね
- 539 :デフォルトの名無しさん:2010/02/06(土) 20:42:27
- >>530の例のように静的に決まるものはかなり期待していいんじゃなかろうか
関数型に限った話じゃないけど
- 540 :デフォルトの名無しさん:2010/02/06(土) 20:47:08
- GHC って C に変換して出力する機能とかってなかったっけ?
人が読むのはつらいかもしれんが、小規模なものならなんとかなるだろ。
- 541 :デフォルトの名無しさん:2010/02/06(土) 21:00:57
- Core言語というものがありましてね
- 542 :デフォルトの名無しさん:2010/02/06(土) 21:04:37
- 私も >>534 で最適化に期待したいと言ってしまったので悪いが、
なんだか話がちょっと飛躍しそうなんで戻す。
そもそもの質問はどのように最適化されるかではなくて、
>>530 の最後の方の文をくりかえすと、
> 前者の効率性を重視しながら後者の堅牢性に近づける方法、あるいは
> 後者の堅牢性を重視しながら前者の効率性に近づける方法はないだろうか。
なんだが、答えは「無い ==> 最適化を期待しろ」 という理解でいいんだろうか。
この答えがまだ得られていない。
この理解が正しいと確定してから、GHC のソースを読むなり、
C 言語に変換するなりして最適化の仕組みを調べる作業に入りたい。
やはり、安易に最適化に期待するよりは、
プログラムで何とかするよう努力したほうがいいような気がする。
- 543 :デフォルトの名無しさん:2010/02/06(土) 21:07:10
- 抽象データ型は、それを構成している型の関係に矛盾がないかコンパイル時に静的に調べられる、
というのがたぶん530の言いたい「堅牢化」であって、実現によって効率に差があることとは別の話だろう。
で、その点で>>530は「堅牢化」の利点がない。
- 544 :デフォルトの名無しさん:2010/02/06(土) 21:11:23
- たとえばaddなら、全然種類の違うものを足してないかチェックするとかw
足し算に期待する制約を表現すべきであって、それだとほんとに壁を作っただけになってないか?
- 545 :デフォルトの名無しさん:2010/02/06(土) 21:28:31
- >>542
本質的に同じフローであれば同じになる。 少なくともそれを目指しているはず。
小手先のテクニックで変形しても処理系のフロー解析を邪魔するだけになるのがオチだよ。
オーダーが変わらない範囲での変形はあまり意味がない。
自分の脳味噌が処理系以上の解析能力がある自信があるかい?
- 546 :デフォルトの名無しさん:2010/02/06(土) 21:49:34
- >>543
違う。
プログラムの局所的な変化が他の広い部分に影響を及ぼさないとき、
私はそれを「堅牢性が高い」状態と言う、と >>533 で伝えたつもり。
あなたと同じ事を言っているのであれば申し訳ない。
私の理解力がまだ足りないせいだ。
- 547 :デフォルトの名無しさん:2010/02/06(土) 21:50:58
- Hugs 使ってみようと思ったら、もうずっと更新されてないんだね…
- 548 :デフォルトの名無しさん:2010/02/06(土) 21:52:28
- >>545
> 本質的に同じフローであれば同じになる
この場合の「フロー」とは何だろうか、詳しく訊きたい。
私が示した例の場合に限れば、同じフローだということだろうか。
- 549 :デフォルトの名無しさん:2010/02/06(土) 22:01:18
- >>544
言っている意味がよく分からないし、笑われている意味はもっと分からない。
壁を作っただけになってないかと言うが、
壁を作ることそのものに意味があるのではないだろうか。
(もちろん、その壁で仕切った高レベル側の関数を使わないと意味が無いが)
私が示した「例」に限ったとしても、
もしベクトルを配列で表現することに変えたとしたらどうなるか。
抽象の壁を設けないと、add に代表される「そのデータ構造上の関数」は、
データ構造の構造に依存しているため、「全て」書き直しになる。
- 550 :デフォルトの名無しさん:2010/02/06(土) 22:46:18
- >>530
newtype 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の定義を変える。
- 551 :550:2010/02/06(土) 23:01:17
- もう少し複雑なデータ構造の場合:
・(>>550のように)タプルやリストなどの単純なデータ構造に変換する関数を定義し、アプリケーション側ではそちらを使う
・例えばfmap, fold, traverseなどや、データの(論理的な)構造に合わせてデータを走査する高階関数を定義し、(ry
・Zipperを定義し、(ry
- 552 :デフォルトの名無しさん:2010/02/06(土) 23:14:43
- >>550,551
getX や getY などのようにデータ構築に使う材料をひとつずつ得るのではなく、
タプルやリストなどの形で「一度に全部」得ることで余計なパターンマッチを防ぐ
ということだと理解したが、合ってる?
うまくいきそうな気がするので検討してみる。
- 553 :デフォルトの名無しさん:2010/02/06(土) 23:25:48
- テンバヤン mp 過ぎるwwww
して完璧で太郎!!!
位置かこちらへ向こう岸だろ。
いいかげんカンペ見たらええのに。
- 554 :デフォルトの名無しさん:2010/02/07(日) 04:46:31
- そしてまた一つ車輪の再発明
- 555 :デフォルトの名無しさん:2010/02/07(日) 05:11:50
- すでにある用語の曖昧な再定義をしちゃうあたりからして勉強不足ってことよ
- 556 :デフォルトの名無しさん:2010/02/07(日) 10:22:32
- >>540
コンパイルオプションで、C経由でコンパイルを指定すればできるけど、
相当小さなソースからでも、普通は読めたもんじゃないシロモノが出てくるよ。
- 557 :デフォルトの名無しさん:2010/02/07(日) 12:32:43
- >>530 の抽象の壁を設けない方法 [1] と設けた方法 [2]、
>>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言語なるものを出力して調べるしかないんだろうか。
- 558 :デフォルトの名無しさん:2010/02/07(日) 15:44:21
- データの抽象化ってSICPの2章にあるAbstraction Barriersのことでしょ?
ttp://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
- 559 :デフォルトの名無しさん:2010/02/07(日) 16:17:44
- data-accessor使えよ
- 560 :デフォルトの名無しさん:2010/02/07(日) 16:31:38
- >>558
それのこと。
なるほど、メモリの使用率は考慮してなかった。
これから解析してみる。
が、その前に実験に使ったソースをさらす。
"Real World Haskell" に載ってた処理時間を測るプログラムをほぼそのまま流用した。
http://book.realworldhaskell.org/read/concurrent-and-multicore-programming.html#id675679
モジュールは2次元ベクトル型とその演算を定義する Vec.hs と、
処理時間を計るメインの Test.hs に分けた。
文字数を減らすために型宣言やコマンドライン引数のエラーチェックは省いた。
行間も詰めたので見にくいが、コピペすればそのまま動くはず。
以下、ソースを載せるために立て続けにレスするがご諒承願う。
- 561 :デフォルトの名無しさん:2010/02/07(日) 16:32:45
- module Vec where
newtype 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
- 562 :デフォルトの名無しさん:2010/02/07(日) 16:34:30
- module Main where
import 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
-- 続く
- 563 :デフォルトの名無しさん:2010/02/07(日) 16:35:20
- -- 続き
main = 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."
- 564 :デフォルトの名無しさん:2010/02/07(日) 16:35:36
- うぜぇからhpaste使ってくれ
http://hpaste.org/
- 565 :デフォルトの名無しさん:2010/02/07(日) 16:36:43
- Test.hs の 10 行目から 12 行目の Vec2_1、newVec2_1、add1 を
それぞれ _2 や _3 に変えて実験する。
コンパイルは以下の通り。
ghc --make -O2 Test.hs
-- 以上
- 566 :デフォルトの名無しさん:2010/02/07(日) 17:52:49
- 本当に迷惑だな
- 567 :デフォルトの名無しさん:2010/02/07(日) 18:50:21
- >>564
すまない、そんな便利なものがあるとは知らなかった。
次回から利用させてもらう。
>>558
実行時に RTS オプションで -S を与えてメモリ状況を見てみたが、
1.5倍以上の時間差が開くほどの違いがあるとは私には分からなかった。
[1] は [2] や [3] の状況をそのまま時間軸に拡大したような感じだ。
GC の稼働率は [1]=90%、[2],[3]=83% で、[1] が他に比べて若干高いなとは感じるが、
時間差の原因となるような違いには思えないんだが。
ちなみに、最適化オプションを省くと [1] が最も速くなる(他の1/2)。
単純に、生成したコードの効率の違いではないかと思ってる。
ただ、迷惑そうなので、しばらくレスは控えることにする。
- 568 :デフォルトの名無しさん:2010/02/10(水) 00:32:06
- HDBC-postgresqlが最新のghcでビルドできないお
(。^ω^゜)オロローン
Windows2000 SP4
HDBC-2.2.2はインストールできたのに
- 569 :デフォルトの名無しさん:2010/02/10(水) 03:41:38
- これかな?
ttp://software.complete.org/software/issues/show/164
ghc 6.10.4 のときにHDBC-sqlite3がビルドできなかったけど、
これでできるようになった。
- 570 :デフォルトの名無しさん:2010/02/10(水) 10:13:19
- timeいい加減にしろ
163 KB
[ 2ちゃんねる 3億PV/日をささえる レンタルサーバー \877/2TB/100Mbps]
取りに行ったけどなかった。次は一時間後に取りに行くです。新着レスの表示
掲示板に戻る
全部
前100
次100
最新50
read.cgi ver 05.0.7.8 2008/11/13 アクチョン仮面 ★
FOX ★ DSO(Dynamic Shared Object)