5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

関数型プログラミング言語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いい加減にしろ

571 :デフォルトの名無しさん:2010/02/10(水) 22:14:11
hmatrix ライブラリを "cabal install hmatrix" でインストールしようとしたら、
次のエラーが出た。

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" で調べると、このバージョンは既にインストールされている。

これはどういうことなの?

572 :デフォルトの名無しさん:2010/02/11(木) 00:00:26
shが見つからないって言ってるの
windows上でやるならmingwとか入れる必要がある

573 :デフォルトの名無しさん:2010/02/11(木) 05:50:36
既出だったらごめんよ

Haskell: 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/

574 :デフォルトの名無しさん:2010/02/11(木) 09:30:27
今年か! と思ったら来年じゃねぇかwww

575 :573:2010/02/11(木) 10:10:56
>>574
俺も今年だと思って貼った
吊ってくる

576 :デフォルトの名無しさん:2010/02/11(木) 12:38:59
>>572
試しに 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 自体を一度再インストールした方がいい?
それだと今までインストールしたライブラリも再インストールしなきゃならないから、
正直ちょっとしんどいが。

577 :デフォルトの名無しさん:2010/02/11(木) 13:50:39
言われたこと試せや

578 :デフォルトの名無しさん:2010/02/11(木) 14:35:11
>>577
mingw と msys 入れて、msys のコンソール上で同じ事を試したけど、
全く同じエラーだった。

579 :デフォルトの名無しさん:2010/02/11(木) 15:55:24
newtypeはコストゼロだよ

580 :デフォルトの名無しさん:2010/02/11(木) 22:15:55
>>578
どっちのパッケージで試したんだよ
同じエラーってどこの部分のことを言ってるんだよ
言葉足らずにもほどがある

581 :デフォルトの名無しさん:2010/02/11(木) 23:13:15
>>580
mingw と 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 のせいでインストールできない。

582 :デフォルトの名無しさん:2010/02/11(木) 23:55:52
cabel が sh を見付けられないのかもしれない。
sh があるパスを環境変数 path に追加してみたら?

583 :デフォルトの名無しさん:2010/02/12(金) 00:26:00
>>582
sh というのは msys にある sh だよね。
(C ドライブ内を検索したら、そこにしか無かった)

Windows の環境変数の PATH に追加して同じ事を試してみたけど、
変わりなかった(同じメッセージのエラーが出ていろんなパッケージがインストールできない)。

しかし、>>576 でも言ったけど、
ついこの前まで cabal でインストールできていたライブラリが
昨日から old-time-1.0.0.2 のせいでインストールできなくなったから、
sh が原因とも思えないんだけど。
気を悪くしたらごめん。

今日はもう寝て、仕事が終わってからまた調べてみるけど、
それで駄目だったら、アドバイスくれた人たちには申し訳ないけど、
諦めて再インストールします。

584 :デフォルトの名無しさん:2010/02/12(金) 01:27:35
$ ghc-pkg unregister old-time-1.0.0.2 --force

585 :デフォルトの名無しさん:2010/02/12(金) 01:32:43
一応書いておくが皆が突っ込んでるのは
>sh: runGenProcess: does not exist (No such file or directory)
ここの部分な

586 :デフォルトの名無しさん:2010/02/12(金) 07:19:16
>>585
これって
sh が「runGenProcess がねぇよ」って言ってるの?
それとも sh の runGenProcess が「〜はねぇよ」って言ってるの?
(〜の部分に何が入るかは読み取れない)

どっちにしても、ないのは sh じゃない何か別なもののように見えるんだけど

587 :デフォルトの名無しさん:2010/02/12(金) 14:14:27
runGenProcessが「shがねぇよ」って言ってる
readFileあたりに存在しないファイルを開かせて、例外を掴まえて表示してみれば分かる

588 :デフォルトの名無しさん:2010/02/12(金) 14:21:44
只の揚げ足だが、
> runGenProcessが「shがねぇよ」って言ってる
runGenProcess を実行しようとしてるのは sh じゃねえの?


589 :デフォルトの名無しさん:2010/02/12(金) 15:21:03
>>586
"shが無い"でないのはそうなのだが、MSYS+MinGWをちゃんとインストールすれば回避できる。
shだけにパスが通ってるんじゃねえの?

runGenProcessがどうのって出るのはここいら(createProcess,runGenProcess_)のせいだと思う
http://www.haskell.org/ghc/dist/stable/docs/libraries/process/src/System-Process.html





590 :デフォルトの名無しさん:2010/02/12(金) 15:41:36
>>588
違うよ
runGenProcessがshを実行しようとして、見つからなかったというエラー

591 :デフォルトの名無しさん:2010/02/12(金) 15:44:54
shとrunGenPrecessが逆ならわかりやすいのに。

592 :デフォルトの名無しさん:2010/02/12(金) 15:45:24
sh「runGenProcess「does not exist (No such file or directory)」」

593 :デフォルトの名無しさん:2010/02/12(金) 15:51:09
http://darcs.haskell.org/libraries/base/GHC/IO/Exception.hs
これのShow IOExceptionのところを見れば分かるけど、最初の部分(この例だとsh)は対象のファイル名で、
エラーの発生場所(runGenProcess)はその次にくる

594 :デフォルトの名無しさん:2010/02/12(金) 20:48:30
>>589
自分ではちゃんとインストールしたつもりなんだけど・・・

最初に "MinGW-5.1.6.exe" をインストールした。
ダイアログで "Select components to install:" と訊いてくるので、
デフォルトのまま [Next ボタン] を押してインストール。

次に "MSYS-1.0.11.exe" インストールした。
インストール後に、MinGW があるか、
あるならそのパスを訊いてきたから入力した。

そして最後に >>582 の指摘を参考に、
Windows の環境変数 "path" に "C:\msys\1.0\bin" を追加した。

これでも駄目だったんだけど、何か足りない作業がある?

595 :デフォルトの名無しさん:2010/02/13(土) 13:17:13
あかん、ネットで情報探したり、
MinGW + MSYS を再インストールしてみたりしたけど、駄目だった。
もう限界。

アドバイスしてくれた方々には良い結果を出せなくて申し訳ないけど、
GHC を再インストールするわ。

板汚しただけになってすまなかった。

596 :デフォルトの名無しさん:2010/02/13(土) 14:07:20
VirtualBoxとかVMWare上でLinuxがそこそこ快適に動くなら
その上で使う方が遥かに楽だからな

597 :デフォルトの名無しさん:2010/02/13(土) 14:44:57
>>596
だよな
俺はエミュレータ上でほとんどの開発をしている。コードをバージョン管理していれば同期できる

598 :デフォルトの名無しさん:2010/02/13(土) 22:59:24
Arrow表記について調べているのですが、
Ross 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 を使って表現するには、どう書くのでしょうか。

599 :598:2010/02/13(土) 23:00:50
すいません、例の let は無視してください。

600 :デフォルトの名無しさん:2010/02/14(日) 11:28:31
{-# LANGUAGE Arrows #-}
af1 :: 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

こんなんか?

601 :デフォルトの名無しさん:2010/02/14(日) 13:32:25
>>600
なるほど、再帰的に呼ぶ必要がある式のみを rec でマーキングすれば十分なんですね。

ありがとうございました。

602 :デフォルトの名無しさん:2010/02/14(日) 13:35:11
こういうキモイarrow loopを使ったコードの解説をする記事をいくつか教えてください
どこかでcircular programmingとか言うキーワードを見た気もしますがそれも含めて

603 :デフォルトの名無しさん:2010/02/14(日) 21:40:56
[WxHaskell/Quick start] のページ
http://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

604 :デフォルトの名無しさん:2010/02/20(土) 11:29:23
haskellでOS全体のキー入力を取得したんだけどどうしたらいい?
gtkhsやqthaskellとかを見たんだけど、それらしきものが見つかりません。

605 :デフォルトの名無しさん:2010/02/20(土) 12:07:23
>>604
HaskellではなくOSの勉強をしたほうがいい

606 :デフォルトの名無しさん:2010/02/20(土) 18:35:36
なんでみんなghc最新版使ってないの?

607 :デフォルトの名無しさん:2010/02/20(土) 18:37:13
えっ
みんな最新版じゃないの?

608 :デフォルトの名無しさん:2010/02/20(土) 20:37:03
質問みてたら結構6.12じゃない人がいる
気のせいか

609 :デフォルトの名無しさん:2010/02/20(土) 21:20:42
Haskell Platform に含まれてるのが 6.10.4 だからだろ。
Haskell.org でも Platform の方を薦めてるし。

610 :デフォルトの名無しさん:2010/02/20(土) 23:59:58
Merge Request: LLVM Code Generator for GHC
ttp://www.haskell.org/pipermail/cvs-ghc/2010-February/052606.html
反応は・・・

早めに追加出来れば、llvmがバージョンアップする時も
エラー箇所の報告も上がるだろうし、パッチの問題も減るからマージしたいんだろうな。

ただ、メンテナー確保しつづけれるのか?

611 :デフォルトの名無しさん:2010/02/22(月) 13:45:32
HOpenGLでクローズコールバック使えないんだけど、なんで?
何かそれに同機能・似た機能を実現する方法ってないの?

612 :デフォルトの名無しさん:2010/02/22(月) 21:16:54
GHC って、次のような型を定義したとして、

date TypeA = TypeA {getInt :: Int, getFloat :: Float, getStr :: String}

次のように、型の一部だけ値を変えた変数を作ったら、

t1 = TypeA 1 0.2 "foo"
t2 = t1 {getFloat = 0.3}

全体がコピーされるんじゃなくて、
getFloat だけコピーされて後は t1 も t2 も同じものを参照する
というように処理されることは期待できるの?

613 :デフォルトの名無しさん:2010/02/22(月) 22:06:22
できるよ

614 :デフォルトの名無しさん:2010/02/23(火) 07:23:47
>>613
ありがと

615 :デフォルトの名無しさん:2010/02/23(火) 12:46:14
Windows+GHC-6.12.1 wxHaskell, gtk2hs 苦労してインストールしたけど
GUIの開発は wxHaskell,gtk2hs どちらがの方が多数派なの?

616 :デフォルトの名無しさん:2010/02/23(火) 21:19:17
Haskell.org のサイトで紹介されているGUIライブラリを見る限りでは、
gtk2hsを基盤としたものの方が多い様に思われる。

617 :デフォルトの名無しさん:2010/02/23(火) 21:27:07
伝統的なGUIはHaskellでは書きにくい
Haskellの意味論とよく合うのはFRPだが、ライブラリはどれも実験的でろくにメンテナンスされていない

618 :デフォルトの名無しさん:2010/02/23(火) 23:18:55
>>617
> Haskellの意味論とよく合うのはFRPだが、ライブラリはどれも実験的でろくにメンテナンスされていない

FRPやAFRPによる各GUIライブラリの使い方を学ぶんじゃなく、
GUIライブラリという例を通してFRPやAFRP自体を学ぶ姿勢の方がいいかもしれんね。

619 :デフォルトの名無しさん:2010/02/23(火) 23:29:11
>> 604
thx。ふんぎりついた。勉強するわ。

620 :デフォルトの名無しさん:2010/02/24(水) 00:37:11
>>618
そう。だからFRPの論文を読んでみたんだが、まず数学をやる必要があると思った。

621 :デフォルトの名無しさん:2010/02/24(水) 12:42:06
Haskell 系の雑誌や機関誌は何かあるでしょうか。
英語でも構いません。

622 :デフォルトの名無しさん:2010/02/24(水) 19:28:26
apt-getでGHCをインストールしてcabal-installをソースからビルドしました。
GHC6.12にアップグレードする場合にはGHCとcabal-installをアンインストールしてからGHC6.12をインストールする必要があるのでしょうか?
ubuntuやcabalで管理している依存関係が壊れたりしないか不安です。


623 :デフォルトの名無しさん:2010/02/24(水) 19:33:50
>>622
正確に覚えていませんが、ubuntuのGHCと自分でインストールしたGHCで、
GHCのパッケージ管理が競合したか何かですごく苦労しました。

私は、結局ubuntuの用意しているものに一本化に落ち着きましたが、
それ以外のGHCを入れるなら完全にアンインストールしたほうが良いと思います。

624 :デフォルトの名無しさん:2010/02/24(水) 19:56:53
>>622
Debian系のghcパッケージはバージョンが古いので、バイナリのtarballのほうがいいんじゃないか。

俺は結局Arch Linuxに移行したがね。
Arch Linuxのパッケージは新しいし、ヘッダーも一緒(-devに分離されていない)なので、
Xを自分でセットアップする覚悟があるならおすすめ。


625 :デフォルトの名無しさん: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 は〜から〜と推論できるなどと、
詳しく演繹の様子を示していただけないでしょうか。

626 :デフォルトの名無しさん:2010/02/24(水) 20:40:38
>>625
> このとき、次の式の型が String -> Int になる理由が分かりません。
> fmap one rev

ならなくね?
(fmap one) . rev なら、 String -> [Int]になる。

627 :デフォルトの名無しさん:2010/02/24(水) 20:52:29
>>625
fmap :: (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)

628 :デフォルトの名無しさん:2010/02/24(水) 20:56:10
あ、ごめん。Control.Arrow をインポートしたらなるね。

629 :デフォルトの名無しさん:2010/02/25(木) 07:42:06
>>627
理解できました。
はじめ f が Functor で、f a の a が (->) String だと思っていました。
それが頭にあったので、one から b を推論した時点で訳が分からなくなっていました。
f は Functor f という文脈上の f なので (->) r になるんですね(関数ファンクタの場合)。

おかげさまで解決しました、ありがとうございました。


>>626,628
よくわかりませんが、私が実験した時は Prelude しかロードしていません。

630 :デフォルトの名無しさん: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")] が帰ってくるような。

631 :622:2010/02/25(木) 21:46:47
>>623
レス有り難うございます。
>>624
見るのが遅れてしまいました。
サイトで確認したところソースからビルドするにはGHCが使われると書いて在りましたので、ソースからビルドすれば矛盾は生じないと思いコンパイルを始めたのですが、今日一日コンパイルをしていても未だ終わりません。
電源が落とせなくて困ってます。(笑)

Arch Linuxは良いですね。
ubuntuを入れているマシンに入れた事がありますが、グラフィックスのドライバが合わなくマシンの調子が悪くなったので諦めました。

最近は無用なトラブルは嫌なのでubuntuにXmonadで使ってます。



632 :デフォルトの名無しさん:2010/02/27(土) 01:56:09
関数型プログラミングのベストプラクティスみたいなものないかな

633 :デフォルトの名無しさん:2010/02/27(土) 11:04:58
ライブラリを作っているのですが、
ある型クラスのインスタンスを定義している時、
その型クラスが持つ複数の関数の一部だけを実装し、
残りの関数は何らかの理由で未実装のままライブラリを公開したいとします。
(それを実装するのはまだ難しく、とりあえず試用版として公開するとか)

この場合、その関数の実装を undefined 関数で代用しても、
コンパイルは一応問題なく通ってしまい、ライブラリのユーザーは
実行時に例外が起きて初めて未実装に気づきます。
(気づければまだいい方で、メッセージも分かりやすいとはとても言えない)

それを実行時ではなく、
その関数を使用しているモジュールをコンパイルしている時に、
何かメッセージを生じさせてコンパイルエラーを起こし、
未実装であることを知らせたいです。

しかし、そのインスタンスの実装済みの関数だけを使用している場合は、
問題なくコンパイルを通らせたいです。

何かいい方法は無いでしょうか。
(使用コンパイラ:GHC)

634 :デフォルトの名無しさん:2010/02/27(土) 11:44:31
>>633
無理だと思う

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を使ってなるべく分かり易いメッセージで例外飛ばすのがいいんじゃないか

635 :デフォルトの名無しさん:2010/02/27(土) 19:21:46
>>634
やはり方法は無さそうですか。

> 一般論としては、
そうですね、error で分かりやすいメッセージを出して、
かつライブラリのリファレンスにも
それと分かるように書いておくことで対処します。

ありがとうございました。

636 :デフォルトの名無しさん:2010/03/03(水) 02:05:01
Regexどこいったの??

637 :デフォルトの名無しさん:2010/03/03(水) 02:07:56
俺の隣で寝てるよ

638 :デフォルトの名無しさん:2010/03/03(水) 02:22:43
>>622
俺は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だけだな。

本当におバカ。でも良いんだ不便ではないし。



639 :デフォルトの名無しさん:2010/03/03(水) 07:14:58
>>620
難しい論文を読む前に、"The Haskell School of Expression" を読んでおくと
イメージがつかみやすい。

640 :デフォルトの名無しさん:2010/03/03(水) 13:43:12
難しい論文読んでるみなさんカッコいいです

641 :デフォルトの名無しさん:2010/03/03(水) 17:02:00
いい歳こいて電子辞書片手じゃないとまともに読めない俺カッコワルス・・・。

642 :デフォルトの名無しさん:2010/03/03(水) 21:32:38
読まないよりはいいよ

643 :デフォルトの名無しさん:2010/03/03(水) 21:46:59
空気も読もうね

644 :デフォルトの名無しさん:2010/03/03(水) 21:48:43
オマエガナーw

645 :デフォルトの名無しさん:2010/03/04(木) 16:22:33
wxHaskellのサンプル動かすと、ちゃんと動作するけどエラーダイアログが出る。
どなたか理由わかる人がおりましたら、ご教授をいただきたく。

エラーメッセージ:
Failed to load shared library 'comctl32.dll' error 126 指定されたモジュールが見つかりません

++環境++
Haskell 6.10.4
wx 0.11.1.2
wxcore 0.11.1.2
windows7

646 :デフォルトの名無しさん:2010/03/04(木) 17:20:07
適当にネットでcomctl32.dllを落してきてC:\Windows\System32に放り込む

647 :デフォルトの名無しさん:2010/03/04(木) 17:28:31
ごめん説明漏れ。

C:\Windows\System32\comctl32.dll

はすでに存在していた。にも関わらずエラーが出て困る、ということです。こちらの不手際で、申し訳ない。

648 :デフォルトの名無しさん:2010/03/05(金) 11:37:15
seqって
今すぐ計算する事がサンクを作る事より安上がりな時に使うの?

649 :デフォルトの名無しさん:2010/03/05(金) 11:45:00
つfoldl'

650 :デフォルトの名無しさん:2010/03/05(金) 12:55:06
seqのキラーケース挙げてみて

651 :デフォルトの名無しさん:2010/03/05(金) 18:58:36
>>650
僕は、遅延IOのデータをファイルをクローズするまえに評価するために使っている。

652 :デフォルトの名無しさん:2010/03/06(土) 05:15:50
あり^^

653 :デフォルトの名無しさん:2010/03/08(月) 15:06:11
翻訳版 Real Word Haskell の正誤レポートを印刷して表紙の裏に挟んだぞい^^v
あとはマーカーでチェックだ

654 :デフォルトの名無しさん:2010/03/08(月) 19:35:51
増刷の予定はまだ無いの?

655 :デフォルトの名無しさん:2010/03/08(月) 21:00:28
>>654
第2刷は昨年末ぐらいに出てるみたいだけど(有楽町ビックにて確認)、
それ以降の増刷ってこと?

656 :デフォルトの名無しさん:2010/03/08(月) 21:09:42
>>655
お、出てたんだ。 いや、うちの近所じゃ見掛けないもんで。
四国は東京から見れば辺境だしな。
でも! 宮脇カルチャースペースがある! 宮脇なら! 宮脇ならきっとやってくれる!
次の休みに高松まで言ってみるわー

657 :デフォルトの名無しさん:2010/03/09(火) 21:48:50
宮脇ワロタ
田舎は大変だよなぁ

658 :デフォルトの名無しさん:2010/03/10(水) 02:43:09
田舎は大変だよ。
理工学系の中古書店がないから通販で買うにも高いし、
公的な図書館に行っても資料が蔵書扱いで一般の手に触れられない所に置いてあったり、そもそも置いてなかったり。
専門的な勉強してる人はみんな街に出て行っちゃうから生活能力のない内はそういうのに触れられないし、
生活能力が付く頃には学術知識に大きな開きが出て無縁な生活送っちゃうはめになるし。

659 :デフォルトの名無しさん:2010/03/10(水) 08:32:09
> 蔵書扱い

図書館にある本はみんな「蔵書」。

利用者が入れない書庫は「閉架」、館外に借り出せない本は「禁貸出」(辞書とか)。

660 :デフォルトの名無しさん:2010/03/10(水) 16:08:19
「禁帯出」ね。

661 :デフォルトの名無しさん:2010/03/10(水) 17:04:19
公務員並に暇だといいなぁ

662 :デフォルトの名無しさん:2010/03/10(水) 18:29:32
ghc-6.12.1が出て何ヶ月も経つのに
gtk2hsはdarcs版にパッチを当てないと使えない有様
足引っ張りすぎだわ

663 :デフォルトの名無しさん:2010/03/10(水) 21:26:49
gtk2hs は 6.10.4 ですら使えなかった

664 :デフォルトの名無しさん:2010/03/10(水) 22:36:56
6.10.4では使える

665 :デフォルトの名無しさん:2010/03/10(水) 22:53:38
そうか、使えたのか。

俺は色々ゴニョゴニョやってもインストールできなかったから諦めた。
代わりに wxWidgets + wsFruit に挑戦したらインストールできたんで、
今はこっちっで遊んでる。


666 :デフォルトの名無しさん:2010/03/10(水) 23:15:06
7並べを自動で処理して順位を決めるプログラム書いてるのだけど
53枚のカード(1..13x4+JOKER)[1..53]のリストを人間がシャッフルするみたいにかき混ぜる処理で躓いた
乱数の発生も分からないけど、何処かで読んだ気がする
l = [1..53]
リストlの中を抜いて後ろにつなげる処理をランダム回繰り返して
ううう、普通の処理系と勝手がすこし違うよね
スマートな処理をと考えると、データ構造にも頭使うし

667 :デフォルトの名無しさん:2010/03/11(木) 00:21:41
もっといい方法があるかもしれないが
ランダムな数のリストを作って
ランダムな数のリストと zip してランダムな数の方でソート
んで、カードの方を残す

668 :デフォルトの名無しさん:2010/03/11(木) 00:38:55
1,-1をランダムに返す関数を使ってsortByすればよくね
やったことないけど


669 :デフォルトの名無しさん:2010/03/11(木) 01:06:02
import System.Random

f [] = return []
f l = do
i <- randomRIO (0, length l - 1)
ns <- f ((take i l) ++ (drop (i+1) l))
return $ (l!!i) : ns

670 :デフォルトの名無しさん:2010/03/11(木) 02:15:25
乱数で sortBy するのって偏りは出ないんだっけ
どこかで議論を読んだ気がするんだけど忘れちゃった

671 :デフォルトの名無しさん:2010/03/11(木) 02:20:25
>>670
乱数の範囲が十分広くて、値の重複が起こらないようなら大丈夫そう。

672 :デフォルトの名無しさん:2010/03/11(木) 13:33:59
>>668のコードを書いてみたけど、偏りがあるのかどうかは分からんかった。

import 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

673 :デフォルトの名無しさん:2010/03/11(木) 20:51:05
GHC6.12.1のリリースノートに
> 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>

みたいに、エスケープされていない文字列で出力されるっていうこと?

674 :デフォルトの名無しさん:2010/03/11(木) 23:20:33
>>673
違う。putStr "あああ"みたいなのが期待通りに動くようになるってこと
エスケープはShow Stringの実装の話

675 :デフォルトの名無しさん:2010/03/11(木) 23:47:06

windows ghc-6.12.1 + gtkhs-0.10.1
windows ghc-6.10.4 + gtkhs-0.10.1
web 上 gtk2hs*split-objs で検索して設定ファイルを手で修正して
 ソースパッケージから MinGW+msys環境 でインストールした。

 一応ほとんどのdemo プログラムはコンパイル、実行できた。


676 :デフォルトの名無しさん:2010/03/11(木) 23:48:18
>>674
おお、サンクス。でも、ってことは、それほどうれしくないなぁ。

data SimpleString = S String
instance Show SimpleString where
 show (S s) = "\"" ++ s ++ "\""

みたいなのを作れば良いんだとは思うんだけど。

でも、その一歩前進で、Show Stringの実装が変わることを期待しよう。

677 :デフォルトの名無しさん: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)

678 :デフォルトの名無しさん:2010/03/12(金) 21:31:04
GHC 6.10.4 のライブラリ リファレンスの Prelude のページにある
Functor 型クラスのインスタンス一覧に 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)) だそうです。
なぜ?

使い方が分かりません。


679 :デフォルトの名無しさん:2010/03/12(金) 21:36:52
>>678

$ 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)

ってできたお。

680 :デフォルトの名無しさん:2010/03/12(金) 21:53:13
>>679
ライブラリ リファレンスの Prelude のページに書かれているからといって、
必ずしも Prelude だけをロードすれば全て使えるというわけではないのですね。

ありがとうございました。

681 :デフォルトの名無しさん:2010/03/14(日) 13:20:54
RWH22章 構文解析器で Windows環境のGHC-6.12.1 、HaXml-1.20.2 をつかっていたが
コンパイルできず(CFilter 型シグニチャが違うなど)、docContent、Posn, posInNewCxt
を探し出して、何とか動くようになった。Unix環境、他のHaXmlのバージョンでは、本のコード
で動作するのか? ご存知の方がいましたら、参考のために教えてください。

682 :デフォルトの名無しさん:2010/03/14(日) 16:55:05
Real World Haskellの日本語版が出て暫くたつけど、評判はどうなの?

683 :656:2010/03/14(日) 17:58:26
宮脇カルチャースペース行ってきたけどやっぱ1刷しかなかったからそれ買ってきた。

684 :デフォルトの名無しさん:2010/03/14(日) 18:44:31
>>681
HaXmlの公式サイトにある通り、1.13から1.20でインタフェースが大きく変わった
たぶんRWHでは1.13を前提にしてるんだと思う

685 :デフォルトの名無しさん:2010/03/14(日) 20:06:30
HaXml-1.13.3 で動作確認できました。
ありがとうございました。


686 :デフォルトの名無しさん:2010/03/14(日) 21:09:13
GUI(FRP)の他に Arrow が何か役に立った例ってありますか。
たとえば Arrow を導入することでこんなに見通しが良くなったとか。
(Arrow + FRP で本当に見通しが良くなったのかは置いておいて)

687 :デフォルトの名無しさん:2010/03/15(月) 19:59:39
Haskell で Float 型およびDouble 型のゼロに最も近い正の値、
正の無限大方向に最も大きい値などは、どのようにすれば得られますか。

688 :デフォルトの名無しさん:2010/03/15(月) 20:41:04
>>687
http://stackoverflow.com/questions/1780489/haskell-minimum-maximum-double-constant

689 :デフォルトの名無しさん:2010/03/15(月) 21:39:34
>>688
ありがとうございます。

ところで、こはなんで引数を必要とするのでしょうか。
何か意味があるのでしょうか。

690 :デフォルトの名無しさん:2010/03/16(火) 09:08:53
別に要らない
floatRangeなんかがダミーの引数を要求する(これがないとどのインスタンスのメソッドか区別できない)ので
それに合わせてるだけだと思う
引数が邪魔なら、

myMinPositiveFloat :: (RealFloat a) => a
myMinPositiveFloat = minPositiveFloat undefined

691 :デフォルトの名無しさん:2010/03/16(火) 12:34:04
>>690
わかりました。

692 :デフォルトの名無しさん:2010/03/16(火) 22:40:02
次のように型クラスやインスタンスなどを定義するとエラーになります。

class 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 パターンみたいなことです。

693 :デフォルトの名無しさん:2010/03/16(火) 23:33:34
>>692
Haskellの型変数は、そこにどんな型を代入しても良いということを表す(暗黙の全称量化)
>  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

694 :デフォルトの名無しさん:2010/03/17(水) 10:17:10
決算セールFinalが今日までか。
明日あたり発表してくれないかなー。

695 :694:2010/03/17(水) 10:17:53
誤爆。失礼しました。

696 :デフォルトの名無しさん:2010/03/17(水) 19:51:41
>>693
簡潔でとても分かりやすい説明なのですぐに理解できました。

型変数をただのワイルドカードのような感覚で使っていましたが、
意味がまるで違うのですね(どこかでそう解説してた様な気がする)。
全称量化と存在量化だと理屈が分かって納得できました。

ありがとうごさまいした。

697 :デフォルトの名無しさん:2010/03/18(木) 14:18:36
hasktagsで生成したtagsを使ってtaglistのようなことが
できるvimプラグインって無いかな?
taglistはhaskellには使えないみたい

698 :デフォルトの名無しさん:2010/03/18(木) 21:55:54
data Hoge = Hoge Int Int Intの値をIntのリストからフィードして作りたいんですが
foldl ($) Hoge [0..2]だとfoldに渡した($)の型が展開される度に変わるのでNGです。
リストから一気にHogeを作る方法はありませんか?

699 :Mail: sage:2010/03/18(木) 23:36:58
list2Hoge (x1:x2:x3:xs) = Hoge x1 x2 x3
じゃ駄目なのかな。

700 :698:2010/03/19(金) 00:00:13
>>699
要素が少ないといいんですが、
20、30とあってHogeの変更もありうるので
できればfold等でできないかなと思いまして

701 :デフォルトの名無しさん:2010/03/19(金) 00:03:01
data Hoge = Hoge [Int] にした方がましなんじゃないかそれとか思ったり。

702 :698:2010/03/19(金) 00:06:18
>>701
ごもっとも
でもそれだとHogeの使い勝手が悪いので

703 :Mail: sage:2010/03/19(金) 00:35:52
>>702
Intの数が20とかになったときに使い勝手のよいアクセス方法はあるの?
Hoge [Int]だったら0,1,..,n番目の要素を取得したい場合
getElem n (Hoge xs) = head $ drop n xs
でいけるけど。


704 :698:2010/03/19(金) 00:44:24
>>703
問題を単純化するためにIntにしたけど実際のコードでは
Gtkのウィジットを保持するdata GUIがあって、
Gladeで作ったxmlから連番で("button[0..n]"等)各ウィジットを読み込んで初期化
アクセスする時には個別なんでリストより一つ一つ名前が付いてる方が使い易いんです。

705 :デフォルトの名無しさん:2010/03/19(金) 01:29:58
一括でどうにかしようって事なら
data Hoge = Hoge [(String, Int)]
でlookupしてアクセスするぐらいしかないんじゃないかと。

706 :デフォルトの名無しさん:2010/03/19(金) 01:55:44
型定義のところだけ別ファイルにして、そのファイルを自動生成するプログラムを書き、makeチェーンに組み込むのはどう?
そういうのって、ほんとはLispとかが得意なんだと思うけど。

707 :698:2010/03/19(金) 23:55:28
結局、リストを生成する段階で一つ一つ名前を与えるというオーソドックスな
方法に落ち着きました。
[button1, button2...] <- forM.. 元の動機がこれよりシンプルで保守性が
よい方法は無いものかと言うことでしたので

レスくれた方々、ありがとうございました。


708 :デフォルトの名無しさん:2010/03/21(日) 18:16:25
haskell platform 2010はまた延期ですかね?

709 :デフォルトの名無しさん:2010/03/25(木) 07:39:25
なんでgtk2hsはcabal化されないの?馬鹿なの死ぬの?

710 :デフォルトの名無しさん:2010/03/25(木) 08:54:09
lhs2texで、日本語の通し方わかる人います?

711 :デフォルトの名無しさん:2010/03/25(木) 09:45:54
UTF-8で統一しとけばちゃんと日本語通ってた

さっきのはなかったことにして下さい。

712 :デフォルトの名無しさん:2010/03/25(木) 19:44:01
>>709
gtkのせいじゃないか?ついでにパッケージ名がgtk2hsじゃなくてgtkなのも気に入らん。どっちかに統一しろよ

713 :デフォルトの名無しさん:2010/03/28(日) 22:24:49
Haskellやってみようと思うんだけど、書籍はいきなりRWHでおけ?

プログラミングHaskellからの方が良い?

ちなみに、遊び程度だけどLispとOcamlは触れる。

CGIで掲示板作ろうと思ってるんだけど・・・

よろしこ

714 :デフォルトの名無しさん:2010/03/28(日) 22:29:58
>>713
目的による。
RWHはcomprehensiveなtutorialなので、特に他の本を読むべきということはない。
しかしHaskellを深く理解するにはそれ以上の研究が必要になるであろう。

715 :713:2010/03/28(日) 22:41:42
>>714

目的は

>>713
>CGIで掲示板作ろうと思ってるんだけど・・・

他にもSNSとかも作ろうと思ってる
あくまで趣味というか、息抜きレベル

700ページ読むのはきついけど、プログラミングHaskell読んでも
どうせRWH読まないとDBとの接続とか、セッション管理とか、
その辺のことが載ってないよっていうんなら最初からRWHかな
と・・・ どう?

716 :デフォルトの名無しさん:2010/03/28(日) 22:57:50
>>715
RWHを読むつもりなら、他の本は読まなくていい。

ただしRWHはHTTPやRDBそのものについて詳しく説明しているわけではなく、
数学を体系的に教えてくれる本でもない。だからネットを併用する必要がある。


717 :デフォルトの名無しさん:2010/03/28(日) 23:00:45
>>716

THX

ついでに、やりたいことが>>715 くらいのことだったら、プログラミングHaskell
でも十分ってことはないですか?

200頁ってのは、こうし難い魅力でもある。

スレ汚しスマソ

718 :デフォルトの名無しさん:2010/03/28(日) 23:09:32
ghc-6.10.4以降だとyi -t pangoが
yi: user errror (GConf: cannot get value of key, key is unser)とかでて起動しねぇ
gtk2hsのサンプルとかは一通り動くようになったんだけど
6.10.3までじゃないと難しいのかねぇ

719 :デフォルトの名無しさん:2010/03/28(日) 23:32:06
>>717
プログラミングHaskell はあくまで言語の入門書で、
実用的なこと始めるには不足な印象。
でもまぁ、本の値段なんて大したことないんだから両方買えばいいんじゃね?

720 :デフォルトの名無しさん:2010/03/28(日) 23:33:33
>>717
それどころか本を買う必要すらないかもしれない。
スキルがあれば、Wikibookと
http://en.wikibooks.org/wiki/Haskell
HaskellWikiだけでも何とかやれるんじゃないか?

721 :デフォルトの名無しさん:2010/03/28(日) 23:44:48
英語読めるなら↓でいいじゃん
ttp://book.realworldhaskell.org/read/

722 :デフォルトの名無しさん:2010/03/29(月) 00:15:46
>>721
まあそうだが、Real World Haskellは長すぎるという不満があったから、
簡潔なWikibookを紹介したんだよ。

723 :デフォルトの名無しさん:2010/03/29(月) 01:13:24
AndroidでHaskell動いたら楽しいだろな

724 :デフォルトの名無しさん:2010/03/29(月) 15:15:49
>>715
オレもちょっとGCIにチャレンジしているが(PHPでかくか迷っている…)、RWHは通しては読んでないよ。
データベースのところは参照したし、たいへん参考になった。
ただ、結局は、SQL文を文字列として生成して発行するわけで、インターフェースの基本さえ分かればそれ以上は必要なかった、という感じ。

むしろ、apachの設定とか、(実行するのがGHCがインストールされていない環境なら)ライブラリを静的リンクした実行ファイルを作るとかではまるんで、とにかく何でもいいからCGIとして実行的できるものを一つ作るのが先だと思う。

725 :デフォルトの名無しさん:2010/03/29(月) 21:53:54
突飛な話だけどHaskell(とアセンブラ)でOS作ろうと思ったらできるのものなん?
それとも根本的に無理な話?

726 :デフォルトの名無しさん:2010/03/29(月) 21:55:52
Yes, you can.

727 :デフォルトの名無しさん:2010/03/29(月) 22:05:43
Haskellで書いてあるOSならHouseってのがある。

House: Haskell User's Operating System and Environment
http://programatica.cs.pdx.edu/House/

728 :デフォルトの名無しさん:2010/03/30(火) 06:34:50
どう読んでもHUOSEなのに

729 :デフォルトの名無しさん:2010/03/30(火) 08:45:51
Kleisli Triple <T,η,*>で言うところの自然変換η:I -> Tを
Haskellでunitではなくreturnという名前にしているのは、
do記法がより手続的に見える以上の理由があるの?

730 :デフォルトの名無しさん:2010/03/30(火) 12:33:35
ない。
誰もが失敗したネーミングだと言ってる。

そもそも、「手続的に見える」よりもっと狭い。
C言語のように見える(見えなくもない)というだけの話。

731 :デフォルトの名無しさん:2010/03/30(火) 22:27:06
ParsecのSourcePosは行と列を保持していますが
ソースの先頭からの絶対位置を取得する方法はないでしょうか?

ソースはファイルなので行と列を取得しておいて
行、列の分だけhGetLineとhGetCharを回す等を考えていますが
ベターな方法はないものかと思っています。

732 :デフォルトの名無しさん:2010/03/31(水) 03:24:15
import Text.Parsec
import 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


733 :732:2010/03/31(水) 03:28:38
あ、どうせ規制中だろうと思って適当に投稿ためしてみたら、解除されていた。
もし、Text.Parsec.Char の関数を使いたいなら、これでいちおうお望みのことはできると思います。
いまひとつスマートな感じがしないし、もっとスマートな方法がありそうな気がするけど。

Text.Parsec.Char の関数を使う気がないなら、もっとどうとでもやりようはあると思う。

734 :731:2010/03/31(水) 22:10:55
>>732
ありがとうございます。
書き方が悪かったのかもしれません
「ソースの先頭からの絶対位置」というのは
パースが終ってから hSeek h AbsoluteSeek pos とできる位置のことです。

今、パーサをbinaryで書く方法とParsecで取得しておいたLine/Columnを辿って
絶対位置を割り出す方法のどちらがましか検討しています。

735 :732:2010/03/31(水) 22:41:02
>>734
あ、hSeek だとバイトオフセットだから、>>732ではダメですね。
というか、エンコーディングのことを考えていませんでした。ごめん。

736 :デフォルトの名無しさん:2010/04/02(金) 23:26:08
Real World Haskellの2刷り以降持ってる人、>>294の訂正は盛り込まれてる?

737 :デフォルトの名無しさん:2010/04/03(土) 16:56:04
294に盛り込んである旨ちゃんと書いてありましたね。甘め、初版を掴ませおってw

738 :デフォルトの名無しさん:2010/04/03(土) 18:28:30
>>736
立ち読みで軽く見ただけだが、
自分の指摘した一件が修正されてるのを確認した。

739 :デフォルトの名無しさん:2010/04/03(土) 22:36:29
RWH 4.6.8右からの畳み込み

foldr step zero (x:xs) = step x (foldr step zero xs)
と記されているけれど、

foldr step zero (x:xs) = step (foldr step zero xs) x
と書くべきじゃないかしら。あまり意味ないか

740 :739:2010/04/03(土) 22:45:14
次のページ見て自己解決した。本のままでいいわ

741 :デフォルトの名無しさん:2010/04/05(月) 22:11:28
Foreign.Storable モジュールの Storable クラスについて質問です。

alignment 関数の戻り値として返す値は、C 言語の構造体で言うところの
4バイト アライメントや8バイト アライメントの「アライメント」の値ですか。

「本物のプログラマはHaskellを使う」で hsc2hs の使い方が簡単に紹介されていますが、
http://itpro.nikkeibp.co.jp/article/COLUMN/20080805/312151/?ST=ittrend&P=3
ここでは alignment = sizeOf と定義していますが、これは正しいのでしょうか。

742 :デフォルトの名無しさん:2010/04/05(月) 22:23:58
>>741
http://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は(厳しすぎる可能性があるものの)正しい

743 :デフォルトの名無しさん:2010/04/05(月) 22:35:31
>>742
ということは、アライメントがはっきり分かっている場合はその値を、
分からなければとりあえず sizeOf を返しておけば問題は無いということですね。

ありがとうございました。


744 :デフォルトの名無しさん:2010/04/08(木) 07:58:05
Haskellスレで聞くことじゃないかもしれないんだけど、
関数型言語のエッセンスを手っ取り早く学ぶのに良い言語って何だろう。
とりあえず、Java使いなのでScalaに傾き中なんだけど。

745 :デフォルトの名無しさん:2010/04/08(木) 09:07:58
>>744
何事もまずは手を動かすことが大事だから、自分が入りやすいと思う言語、気になった実装系でよいと思う。
ただ、まぁ、ひとつあげろと言われるとHaskellだな、真面目な話。

理論的な話は置いておいて、プログラマとして実践的な面からの関数型言語のエッセンスは、高階関数の多用だと思う。
高階関数を多用するためには、無名の関数、有名の関数の両方が非常に簡潔にかけることが望ましい。
で、Haskell以上にそれが簡潔な言語をオレは知らん(Lazy Kを除いて)。

746 :デフォルトの名無しさん:2010/04/08(木) 10:38:58
>>744
上にほぼ同意だが、余裕があればHaskellに加えてLISPもやるといい。
特に、Schemeインタプリタを自力で実装するといい。
しかし関数型言語ということであればHaskellだろう。Expand your brainといわれている。

747 :Mail: sage:2010/04/08(木) 10:44:56
>>745
個人的にはカリー化が簡単にできるのもポイント高い。
add x y = x + yとかあるのをカリー化したいときに
(add 3) で簡単に作れるのがいい。
schemeとかlispだと
(define (add3 x) (add 3 x))ってやらないといけない。


748 :デフォルトの名無しさん:2010/04/08(木) 10:53:03
関数型言語としての特徴を学ぶなら、やっぱHaskellだと思うなあ。
こういった場合、中途半端はよくない。純粋関数型言語を選択して欲しい

749 :デフォルトの名無しさん:2010/04/08(木) 12:42:41
私は Scheme や F# から関数型を知って色々勉強してましたが、
書籍「関数プログラミング」を読んでから
純粋関数型である Haskell の魅力にとりつかれました。
この本に関数型言語のエッセンスが凝縮されています。

この本 + Haskell がまさに「手っ取り早い」と思います。
(ただし、この本に Haskell の使い方は載っていない)

750 :デフォルトの名無しさん:2010/04/08(木) 12:55:30
>>749
検索したら複数出てきましたがどれでしょうか?

751 :デフォルトの名無しさん:2010/04/08(木) 15:06:34
俺はbirdの書いたのに一票

752 :デフォルトの名無しさん:2010/04/08(木) 19:20:59
>>750
おっと、そいつはすまなかったな
これです。
http://www.amazon.co.jp/dp/4764901811

753 :デフォルトの名無しさん:2010/04/08(木) 19:27:41
原書はHaskell版が出てるんだっけ?

754 :744:2010/04/08(木) 21:15:41
ありがとう、Haskellを前向きに検討してみる。
ちなみに、外に出かけたので>>752を探してみたけど、今は入手困難みたい(´・ω・`)

755 :デフォルトの名無しさん:2010/04/08(木) 21:21:32
>>754
中古ではダメなのか

756 :デフォルトの名無しさん:2010/04/08(木) 21:51:14
>>755
それしかなさそうだね。
ただ、実は友達と勉強会やろうかって話をしてて、教科書にするには厳しそうだなと。

757 :デフォルトの名無しさん:2010/04/09(金) 17:47:01
『プログラミングHaskell』 残り2章ってところまで写経してきて気が付いた
んだけど、この本難しい方?

ちなみにHaskellの本は初めて読んでます。

758 :デフォルトの名無しさん:2010/04/09(金) 18:31:15
悟れるまで黙って繰り返し写経しててください。

759 :デフォルトの名無しさん:2010/04/09(金) 19:11:16
なんで写経なの?頭で考えたら?

760 :デフォルトの名無しさん:2010/04/09(金) 19:37:16
自分で考えることは賛成だが
そのための準備は必要

761 :デフォルトの名無しさん:2010/04/09(金) 21:27:54
モナドの定義で何をやっているのかぜんぜん分からなかった
調べてみたら、論文に載るような難しい概念だということが分かった
それからは、中身は特に考えずにそういうもんだと思い込んで使っている

762 :757:2010/04/09(金) 21:32:29
>>759

え? 写経って、本読んで考えながら、手も動かしてみることを
言うんじゃないの?

ちなみに、RWHの方が簡単?

763 :デフォルトの名無しさん:2010/04/09(金) 21:42:02
>>762
写経=コピー
理解できなくても、考えなくても、文字が読めて書ければ写経できる。

RWH は応用だから対象読者が違う。

764 :デフォルトの名無しさん:2010/04/09(金) 21:42:22
>>761
たぶん、「そういうもんだ」と思い込んでいる、その「そういうもんだ」と理解していることが、理解すべきことの全てだと思う。
Monad クラスは形式的な枠組みを規定しているだけで、それ以上に意味も中身もない。

イルカとサメが似ているようなもん。外見が似ている、それだけ。

765 :デフォルトの名無しさん:2010/04/09(金) 21:46:03
モナド則によってある程度意味を与えられていると思うが。

それも含めて形式的な枠組みに過ぎないという事なのか

766 :757:2010/04/09(金) 21:48:30
>>763

>写経=コピー
>理解できなくても、考えなくても、文字が読めて書ければ写経できる。

写経って言葉を少し間違って使っていたようです スマンコ

>RWH は応用だから対象読者が違う

応用≒実践ってことかな?

それだったら、RWHの方が目的にあってるような気がする・・・

767 :Mail: sage:2010/04/09(金) 21:54:49
>>761
モナドそのものについては圏論の初歩で理解できるよ。
対象、射、(共変)函手、自然変換の4つの概念くらいしか必要ないし。
あと「図式が可換」っていう意味が分かればモナドが弄れる。

けど、どうしてこんなにHaskellで利用されているのかをつかむには不十分みたいなんだよね。
頭で理解するより慣れた方が多分近道。
あと、おそらくHaskellプログラマかつ非数学者のためのpdfがあるけど、案外不評。
ttp://lambda-the-ultimate.org/node/1183
証明に可換図式を使わないとこんなに面倒なのか、って思う。

768 :デフォルトの名無しさん:2010/04/09(金) 21:55:56
>>766
そういうこと。
5章から JSON ライブラリを作ってみたり、
バーコードリーダーを作ってみたりといった実践が始まる。
その中でテクニックを学んでいく。

とりあえず RWH を読んでみて、
説明を端折ってるなって思える部分に出会ったら、
他の文献を当たるなりすれば良いと思う。

769 :757:2010/04/09(金) 22:04:43
>>768

THX

770 :デフォルトの名無しさん:2010/04/09(金) 22:07:34
>>765
じゃぁ、言い直そう:

イルカとサメが似ているようなもん。海を泳ぐ、それだけ。

771 :デフォルトの名無しさん:2010/04/09(金) 22:14:36
「中身は特に考えずにそういうもんだと思い込んで使っている」
その先を目指して理解できると、きっと「より面白い」と感じると思うんだがなぁ

イルカとサメがどーたらこーたらで止まってしまうのが、
ちょっとだけもったいない気がする

772 :デフォルトの名無しさん:2010/04/09(金) 22:25:04
>>762
RWH、と言うかオラ本は全般に説明がくどいね。変な例えとかジョークで厚みが増しトル。読み物的。
それがイイって人も多いのかもしれないが。

ついでに池袋ジュンク覗いてきたけど初版がまだ店頭に並んでた

773 :デフォルトの名無しさん:2010/04/09(金) 22:43:51
尼はまだ初版かな?<RWH

774 :Mail: sage:2010/04/09(金) 22:44:21
>>771
まだ読んでないけど、この論文とかが圏論の言葉少なめ、
計算機科学の言葉多めで面白いかもね。
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

この後、どう面白くなるのかがまだ分からん。

775 :デフォルトの名無しさん:2010/04/09(金) 23:13:44
>>766
>>写経=コピー
>>理解できなくても、考えなくても、文字が読めて書ければ写経できる。
>
>写経って言葉を少し間違って使っていたようです スマンコ

あってるだろ
本物の写経も
考えずにコピーするだけの写経もあれば
意味を考えながらの写経もある

776 :デフォルトの名無しさん:2010/04/10(土) 00:35:43
いままで数学とかまるで興味なかったけど挑戦してみようかと思ってます

Haskellでサーバアプリ作れるくらいのレベルだけど、圏論すぐに理解できますかね?
Haskellが得意な人向けの圏論の入門書とかサイトとかないでしょうか

777 :デフォルトの名無しさん:2010/04/10(土) 01:22:38
クマーの予感

778 :デフォルトの名無しさん:2010/04/10(土) 03:29:17
ググレカスという言葉を贈ろう

779 :デフォルトの名無しさん:2010/04/10(土) 10:43:59
>>776
サーバアプリと圏論は全く関係ない。
F1 ドライバーだけどチャーハン上手く作れますかね、という質問といっしょ。

Haskell が得意な人向けの圏論の入門書やサイトもおそらく無い。
Haskell が得意であることと圏論が分かることもほとんど無関係だから。

「Conceptual Mathematics : A first introduction to categories」
この本の第2版(赤い本)でも読んで、まずは圏論の雰囲気でも掴むと良い。
各階段の段差が低いから、日本語で書かれた圏論関係の本よりよほど読みやすいと思う。

780 :デフォルトの名無しさん:2010/04/10(土) 10:45:09
>>776
http://www.amazon.co.jp/dp/4627018304
見た感じとしては易しそうな感じだった。読んではない。

781 :デフォルトの名無しさん:2010/04/10(土) 10:50:45
http://ci.nii.ac.jp/naid/110003743564

782 :デフォルトの名無しさん:2010/04/10(土) 10:59:27
これも
http://ci.nii.ac.jp/naid/110003743465


783 :デフォルトの名無しさん:2010/04/10(土) 11:09:58
どうみても、役には立たないな。
理論とは適当に折り合いをつけてプログラムしろぐらいの意味しかないだろ。

784 :デフォルトの名無しさん:2010/04/10(土) 12:13:03
これじゃだめ?
http://coolee.at.infoseek.co.jp/kenron.html#-1

785 :デフォルトの名無しさん:2010/04/10(土) 12:18:28
こんなんもあった。いろいろ書いてくれてる人がいるね。正しいかどうか見てないけどw
ttp://d.hatena.ne.jp/m-hiyama/20060821/1156120185

786 :デフォルトの名無しさん:2010/04/10(土) 12:29:37
Most programming language researcher do not work for helping people but for their research interests.

787 :デフォルトの名無しさん:2010/04/10(土) 12:34:33
興味なしに調べてもロクな文書は公開できないのでそれでもいいのです

788 :デフォルトの名無しさん:2010/04/10(土) 12:47:30
Don't ask people for resources which might help you. Search for your own.

789 :デフォルトの名無しさん:2010/04/10(土) 12:49:16
An introductory book to category theory.
http://www.amazon.com/Categories-Computer-Science-Cambridge-Texts/dp/0521422264

790 :デフォルトの名無しさん:2010/04/10(土) 14:21:14
圏論は実際に作れる簡単な例題がないのかな
C言語が得意な人向けの線形代数とかの入門書はたくさんあるんだけど

791 :デフォルトの名無しさん:2010/04/10(土) 15:10:54
Exercises? There are.

792 :デフォルトの名無しさん:2010/04/10(土) 17:30:07
圏論って既に数学のいろんなところで使われてるから、
数学を嗜んでいる人なら意識せずに普段から使ってるよ。


793 :デフォルトの名無しさん:2010/04/10(土) 17:33:40
高校の数学の先生になった友達と勉強会を開いたんだけど、
彼がホワイトボードになにやら図やら式やらを書き始めたのを見て、
あれ?君、圏論をどこで勉強したの?
って聞いたら、圏論?はい?
って答えが返ってきた。
それぐらい世の中に浸透してる。

794 :デフォルトの名無しさん:2010/04/10(土) 19:44:21
Haskellもすっかり過去の言語となってしまったなあ

795 :デフォルトの名無しさん:2010/04/10(土) 19:47:14
The more people use Haskell, the less advanced Haskell will become. Stop using Haskell immediately.

796 :デフォルトの名無しさん:2010/04/10(土) 20:10:06
>>794

なんで?

797 :デフォルトの名無しさん:2010/04/10(土) 20:28:51
>>795

Which language you recommend instead of Haskell?

798 :デフォルトの名無しさん:2010/04/10(土) 20:47:23
やっべ俺Haskellて関数型言語の中ではモダンな方だと思ってた
知ったかぶりするには何を押さえておけばいいの?

799 :デフォルトの名無しさん:2010/04/10(土) 20:58:45
Haskellはあらゆるプログラミング言語研究の最先端の成果を
常に詰め込みつづけるために作られた言語なわけだから、
開発が止まらない限り最もモダンな言語の一つなわけだけどw

800 :デフォルトの名無しさん:2010/04/10(土) 21:01:00
全く普及の兆しをみせないHaskell

801 :デフォルトの名無しさん:2010/04/10(土) 21:06:50
>>797
Try 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.

802 :デフォルトの名無しさん:2010/04/10(土) 21:08:01
この外人さんは誰

803 :デフォルトの名無しさん:2010/04/10(土) 21:09:38
俺でもよめるやさしい英語

804 :デフォルトの名無しさん:2010/04/10(土) 21:09:43
>>799
言語のコアは変えられない。できるのは拡張だけ。
まあ意味論が数学に基づいているから一般的なプログラミング言語としては限界だろうけど

805 :デフォルトの名無しさん:2010/04/10(土) 21:09:53
Shiroさん

806 :デフォルトの名無しさん:2010/04/10(土) 21:11:17
>>804
限界があるならそこで開発は終わるだろ。
後はメンテだけします、って事になって終了。

807 :デフォルトの名無しさん:2010/04/10(土) 21:16:22
>>806
純関数言語としての根幹は変えられなくても、拡張の余地はある。
もっと手続的なほうが使いやすいかもしれないが、並列化のトレンドを考えれば抽象度が高いほうがいいだろう。
ゆえにHaskellが勝利する。

808 :デフォルトの名無しさん:2010/04/10(土) 21:17:26
どうでもいいが、英語にミスが散見されるな。
書いたのは俺だが

809 :デフォルトの名無しさん:2010/04/10(土) 21:21:40
純粋タイプで元気(まとも)なのはHaskellだけ?
ttp://ja.wikipedia.org/wiki/%E9%96%A2%E6%95%B0%E5%9E%8B%E8%A8%80%E8%AA%9E

810 :デフォルトの名無しさん:2010/04/10(土) 21:23:38
一般的な人が終了しても、数学的な連中は続けるから。
日常的なことは他の言語を使ってればいい。

811 :デフォルトの名無しさん:2010/04/10(土) 21:24:36
>>809
Haskellはそもそもその始まりが純粋関数型のフラッグシップ。
それまで乱立していた関数型言語の人をみんなHaskellに結集させたんだから当然。

812 :デフォルトの名無しさん:2010/04/10(土) 21:31:48
>>810
Haskellやってるのは数学系の人じゃないんだけどね。
コンピュータサイエンスの人。

813 :デフォルトの名無しさん:2010/04/10(土) 21:32:59
>>811
いや、ここに挙がってる他のは古いか細ってるかみたいだったから、
ほかに新しいのいないのかなと思って。

814 :デフォルトの名無しさん:2010/04/10(土) 21:44:06
>>813
新しいのを作るのが意味ないからね。少なくとも研究目的では。
純粋かつ非正格評価という制約がある限り、先行するHaskellの劣化コピーにしかならない。
みんなHaskellに移ってしまったから、MirandaもCleanもリソースがない。
だからますますHaskellに集まる。
このポジティブフィードバック。

815 :デフォルトの名無しさん:2010/04/10(土) 21:50:31
>>811
たしか、それぞれ独自に研究してた人たちが究極のを作ろうと集結したんだっけ。

この頃の話とか、Haskell に魅了された研究者たちの話って書籍化されてないのかな。
インタビューとか交えたノンフィクションがあれば是非読んでみたい。

816 :デフォルトの名無しさん:2010/04/10(土) 21:58:36
純粋かつ正格な言語はまだですか

817 :デフォルトの名無しさん:2010/04/10(土) 21:59:20
>>816
Clean

818 :デフォルトの名無しさん:2010/04/10(土) 22:00:54
>>814
正格には、MirandaやCleanから人が移って減ったわけではない。
他の純粋な人たちがみんなでHaskellを作っただけ。

819 :デフォルトの名無しさん:2010/04/10(土) 22:02:21
>>814
レスどうもです。そうでしたか。
今はどうやって関数型の利用を進めるかを考える時期なんでしょうかね

820 :デフォルトの名無しさん:2010/04/10(土) 22:10:03
既存理論を関数型言語で取り扱えるように整理し直せばいい。
計算機理論の体系をフレームに他分野の理論を読み替えて、
具体的解を取得できる形式系を作ればいい。

821 :デフォルトの名無しさん:2010/04/10(土) 22:20:54
Haskellで蓄積された型理論の研究成果はセキュアなシステムの構築に役立つことが期待されている。
Haskellの型システムに対する拡張の研究はこれからも続くだろう。

ttp://cacm.acm.org/magazines/2010/2/69367-type-theory-comes-of-age/fulltext

822 :デフォルトの名無しさん:2010/04/10(土) 22:24:22
数学の厳密な意味論に基づいて現実世界をモデル化すれば、
主観と客観がないまぜになった実学を洗練することができそうだな

823 :デフォルトの名無しさん:2010/04/10(土) 22:25:28
>>808

おめーかよw

おれは>>797だけど、厳密に言うとdoが抜けてるな

ちなみにScalaやClozureはJavaのランタイムに明るくないと
あんまり恩恵受けないってことはないの?

824 :デフォルトの名無しさん:2010/04/10(土) 22:42:43
恩恵というのが何を意味するのかわからないが、
確かにプログラミング言語を仕事で使うにはランタイムの知識も必要だといわれている。
しかしGHCも遅延評価のおかげでとても不可解だ。サーバでは使えないだろう。

ところでScalaもClojureも末尾最適化をしないらしい。
再帰ではなくイテレーティブに書かなければいけない。
関数型言語と称するには無理があるんじゃないか。

825 :デフォルトの名無しさん:2010/04/10(土) 22:51:42
遅延評価は慣れの問題じゃないの。

826 :デフォルトの名無しさん:2010/04/10(土) 22:54:22
遅延評価をデフォにしちまうとどうしても余計な処理が入るから遅くなっちゃうね。

827 :デフォルトの名無しさん:2010/04/10(土) 22:54:22
慣れというかたぶんバグった時の解析がキツい

828 :デフォルトの名無しさん:2010/04/10(土) 23:18:03
みなさんはロギングをしたいときどうしてますか?
すべての関数をIO型にするしかない?

829 :デフォルトの名無しさん:2010/04/10(土) 23:18:25
遅延評価はそのままでいいけど、グラフ簡約の様子をそのままグラフ化してプリントアウトしてくれるツールが欲しい

830 :デフォルトの名無しさん:2010/04/10(土) 23:25:36
>>828
なぜ Writer を使わない?
そういう意味ではないの?

831 :デフォルトの名無しさん:2010/04/11(日) 00:32:55
>>830
書き方が悪かった。
論点は,「ロギングを素直に挿入すると、関数の型を変えざるを得ないが、もっと良いやり方はないか?」
ということです。

832 :デフォルトの名無しさん:2010/04/11(日) 01:58:38
>>831
unsafeio

833 :デフォルトの名無しさん:2010/04/11(日) 02:12:34
>>831
デバッグのときとかに、関数の評価の様子を知りたいだけなら、traceを入れてghciで実行。

アプリケーションの機能としてログ出力を行いたいのなら、純粋な関数は引数が変わらないかぎりなんど実行しても動作が同じでそのログをとる必要はなく、
実行ごとに引数が変わるのは外部と関係するときだけだから、かならずIOモナドでログをとれるタイミングがあると思うんだけど?
モナド上で行わない限り、出力するタイミングを制御できないわけだし(評価順序をあれこれ考えればできなくもないけど)。

834 :デフォルトの名無しさん:2010/04/11(日) 06:18:00
>>815
最初期の人ではないが、RWHを書いたサリバンへのインタビューがネットで読める。
http://broadcast.oreilly.com/2009/01/the-power-of-haskell.html


835 :デフォルトの名無しさん:2010/04/11(日) 06:33:12
遅延評価は正格評価と比べて必ずしも遅いわけではない。
速い場合もあるし遅い場合もある。
値がサンクとして渡されるので、全体として時間コストも空間コストも予測が難しい。
GHCが遅いのは最適化よりも新規性目的で機能が取り込まれているせいもある。


836 :デフォルトの名無しさん:2010/04/11(日) 07:10:57
そういや、速いという話だったGRINの話題がちょっと前に出てなかったっけ?

837 :デフォルトの名無しさん:2010/04/11(日) 12:54:54
>>834
ありがと

ついでに、自分でも調べたら
「A History of Haskell: Being Lazy With Class」なる論文を見つけた。
http://research.microsoft.com/en-us/um/people/simonpj/papers/history-of-haskell/

面白そうなんで併せて読んでみる。

838 :デフォルトの名無しさん:2010/04/11(日) 15:49:53
Cabalがエラりまくる
なんだよこれ3パッケージに1つはエラーでビルド失敗するわ

839 :デフォルトの名無しさん:2010/04/11(日) 15:55:10
Cabalはパッケージマネージャではないから仕方ない

840 :デフォルトの名無しさん:2010/04/11(日) 16:18:28
じゃあどうすれば仕方あるんですか!?

841 :デフォルトの名無しさん:2010/04/11(日) 16:19:25
パッケージマネージャーを作る

842 :デフォルトの名無しさん:2010/04/11(日) 16:31:22
怒らないでマジレスしてほしいんだけど
おまえら、なんでこんな時間に書き込みできるわけ?
普通の人なら学校や会社があるはずなんだけど
このことを知った親は悲しむぞ?
もっと、現実を見ようぜ。

843 :デフォルトの名無しさん:2010/04/11(日) 16:52:19
今日日曜日だぞ

844 :デフォルトの名無しさん:2010/04/11(日) 17:11:07
週末と平日の区別すらないのか。
普通の人ならそんな質問をしないはずなんだけど。
もっと現実を見ようぜ。

845 :デフォルトの名無しさん:2010/04/11(日) 17:17:25
お仕事お疲れ様でし。

846 :デフォルトの名無しさん:2010/04/11(日) 17:20:32
マジレスするとそれはコピペなのでスルーしとけ

847 :デフォルトの名無しさん:2010/04/11(日) 17:23:55
Cabalが依存パッケージのビルドに失敗する
個別にインストールすれば成功するのに
なぜだろう

848 :デフォルトの名無しさん:2010/04/11(日) 18:30:13
マジレスすると >>846 もコピペなのでスルーしとけ

849 :デフォルトの名無しさん:2010/04/11(日) 18:38:54
駄目だiconvがインスコできね
死ねCabal

850 :デフォルトの名無しさん:2010/04/11(日) 18:41:27
>>849
では Cabal はもう死んだと思って、別の手段を使えばいいのではないか

851 :デフォルトの名無しさん:2010/04/11(日) 19:10:39
諸君らが愛してくれたCabalは死んだ。何故だ!

852 :デフォルトの名無しさん:2010/04/11(日) 19:12:51
>>851
研究のためのモルモットに過ぎなかったから

853 :Mail: sage:2010/04/12(月) 03:23:58
>>790
エピかつモニックだがアイソではない射がhaskellにあるか否か、とか。
答えは知らんが、圏論とhaskell以外の知識はいらない問題。
あと、圏論だけだけど、モナド<T,η,μ>からKleisli Triple<T,η,*>を導き、
Kleisli Tripleが満たす法則を証明し、
逆にモナド則をKleisli Tripleから導くとか。

854 :デフォルトの名無しさん:2010/04/13(火) 12:31:36
普通のハスケルがくどすぎて嫌
lispはすでに習得しているレベルの人向けな本はないですか

855 :デフォルトの名無しさん:2010/04/13(火) 12:38:15
>>854
・Haskell: The Craft of Functional Programming
・Algorithms A Functional Programming Approach
・The Haskell School of Expression
辺り

普通のハスケルは読んだこと無いから「くどさ」がよく分からんが、
もしかしたら一番上のもちょっとくどいかも知れん。

もう少し分かるなら、
・the fun of programming
も良い

856 :デフォルトの名無しさん:2010/04/13(火) 13:04:34
>>854

RWHはダメなの?

分かるところは飛ばせばいいんだし

857 :デフォルトの名無しさん:2010/04/13(火) 18:12:15
↓これの後半3ページをもーちょっと優しく解説してる記事か本を知りたいです
http://www.ipsj.or.jp/07editj/promenade/4703.pdf

858 :デフォルトの名無しさん:2010/04/13(火) 19:14:11
>>857
余計なおしゃべりのないそれが一番いいと思うんだけどな
イメージが湧かないというのなら
http://blog.sigfpe.com/2006/08/you-could-have-invented-monads-and.html

859 :デフォルトの名無しさん:2010/04/14(水) 06:37:27
>>857の記事を理解したくて緑色の本で圏論齧ってみたけどF-AlgとAdjointあたりでイミフになって挫折したことを思い出したわ

860 :デフォルトの名無しさん:2010/04/14(水) 10:15:50
>>857
図式が可換、っていうのは
「その図中で、ある地点からある地点への経路をどのように取っても
 (どういう射の合成を使っても)等しい」という意味なので、
例えば自然変換η:Ix->Tの自然性を示す可換図式は
       ηA
 IxA ---> TA
 f|             |Tf
  V   ηB  V
 IxB ---> TB
こいつは、以下の式と同じ意味
Ixf○ηB= ηA○Tf (fはA->Bの全ての射,Ixは恒等函手,Tは函手)
ドメイン、コドメインなんて図で考えてれば間違えることは無いので、
積極的に図式を使うといい。

861 :デフォルトの名無しさん:2010/04/14(水) 18:08:18
unsafePerformIOを使ってIO comonadを作るような論文があったと思うんですが思い出せません
心当りがある方がいらっしゃれば教えてください

862 :デフォルトの名無しさん:2010/04/14(水) 18:33:48
> FUNDIO: A Lambda-Calculus With letrec,case, Constructors,
> and an IO-Interface:Approaching a Theory of unsafePerformIO

辺り?

863 :デフォルトの名無しさん:2010/04/14(水) 18:35:43
ありゃ? 切れたね。

> FUNDIO: A Lambda-Calculus With letrec, case, Constructors,
> and an IO-Interface:Approaching a Theory of unsafePerformIO

辺り?

864 :デフォルトの名無しさん:2010/04/14(水) 18:36:44
letrec, の後ろで切れるのはnavi2chのバグかな?

> FUNDIO: A Lambda-Calculus With letrec, case, Constructors,
> and an IO-Interface:Approaching a Theory of unsafePerformIO

じゃねえかな。

865 :デフォルトの名無しさん:2010/04/14(水) 18:41:27
切れてないっすよ

866 :デフォルトの名無しさん:2010/04/14(水) 18:42:00
すまん、article-filterの設定のせいのようだ。

867 :デフォルトの名無しさん:2010/04/14(水) 20:42:00
すんません

左畳み込みでメモリリークが発生しやすくて、右畳み込みだと発生しにくい理由が分からんです
だれか教えてください

868 :デフォルトの名無しさん:2010/04/14(水) 22:36:37
foldr と foldl の計算は模式的に次のように表せる。

foldr : (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

869 :デフォルトの名無しさん:2010/04/14(水) 22:38:18
>>868 からの続き

foldr : (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 ではこういう一見分かりにくいメモリ領域の使用を
メモリリークではなくスペースリークと呼ぶ。

私はこう解釈しているが、もし違ってたらごめん。

870 :デフォルトの名無しさん:2010/04/14(水) 22:55:24
>>868
間違ってる

>その結果としてカリー化された関数(仮に fa1 とする)を返す。
>この時点で、a1 は既に評価されてしまったので、a1 の情報はその評価結果の値のみが残り、
fの定義のされ方にもよるけど、普通に二引数関数として定義されているなら(f a1)を評価してもa1は評価されない
仮に評価されたとしても、評価済みの値を持っておく必要があるので結局メモリが要る

>>867
foldrがfoldlに比べて空間効率がいいのは、畳み込みに使う関数が第二引数について非正格なとき(他にもある?)
例えば(++)は第二引数についてほぼ非正格なので、
concat = foldr (++) []
と定義すればO(1)の空間で動く(紙の上で追ってみれば分かると思う)のに対して
concat = foldl (++) []
だと酷いことになる

871 :デフォルトの名無しさん:2010/04/14(水) 23:16:49
>>870
>fの定義のされ方にもよるけど、普通に二引数関数として定義されているなら(f a1)を評価してもa1は評価されない

あ、そうか。
ベータ簡約はされるが(実装的にはポインタの差し替え程度だと思うが)、
評価までは未だされないのか。

やっぱり間違ってたか。
>>867 すまん、無視してくれ。

872 :デフォルトの名無しさん:2010/04/15(木) 00:26:45
どちらも、評価の結果全てが欲しいなら、空間効率は一緒、実行効率は畳み込み用の関数opに依存するね。
foldr 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の場合は第一要素を求める場合、最終行まで展開したあと、
ここから更に全部を計算していく必要があってメモリは要るわ最終的にいらないところまで計算するわで効率が悪い。


873 :デフォルトの名無しさん:2010/04/15(木) 00:28:40
以下の2つの foldl, foldr の [1..5000000] の計算結果で、
t05l.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 ではスタックの使用に変わったようなもの。。。
というようなことを聞いた不確かな記憶があるのですが、
サンクとはどのような情報をどのような形で保持しているのでしょうか?


874 :デフォルトの名無しさん:2010/04/15(木) 00:51:18
>>873
thunkってのは>>872にあるような、計算途中の式のこと。
x1 `op` (x2 `op` (x3 `op` init))みたいなの。
メモリ上にどう構成されているかは知らんが、遅延評価だとサンクが大きくなりがち。

875 :870:2010/04/15(木) 08:59:34
言葉が足りなかったな、ごめん

>>872
全部を評価する場合でも、結果を順番に読み捨てていくなら空間効率も変わるよ
たとえば、
print $ foldr (++) [] $ map (flip replicate ()) [0..n]
は全体としてO(1)の空間で動くけど、foldrをfoldlにするとO(n)になる

876 :デフォルトの名無しさん:2010/04/15(木) 18:21:09
圏論ってアウェアネストレーニングみたい。

877 :デフォルトの名無しさん:2010/04/15(木) 18:28:44
>>873
foldl (+) 0 [1..10000000]とfoldr (+) 0 [1..10000000]をPreludeで走らせてタスクマネージャ見たけど、
大きな違いないね。

>>867
分かりません

878 :デフォルトの名無しさん:2010/04/15(木) 19:46:53
明日じゃん!
http://atnd.org/events/3820

879 :デフォルトの名無しさん:2010/04/15(木) 21:49:35
>>878
名古屋で似たようなミーティングはないですか?
東京まで行く時間がありません

880 :デフォルトの名無しさん:2010/04/15(木) 22:03:42
同じく岐阜だから行けん。
ビデオを撮ってストリーミングか、後で公開してくれるのなら
金払ってでも見るんだがなぁ

881 :デフォルトの名無しさん:2010/04/15(木) 22:35:18
プログラミングHaskellもRWHも読み終わった。 Hakellで作りたいものも頭の中にあるけど
その前に達人の書いたHaskellのコードを読んでみたい。

ってオレにおすすめのサイト教えて。よろ

882 :デフォルトの名無しさん:2010/04/15(木) 22:41:52
サイトではないが書籍なら「the fun of programming」はどうだ?
達人たちはこう考えるのか、という本だと思う

883 :881:2010/04/15(木) 22:48:20
>>882

http://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

これ?

ってか、書籍代節約するために読書用のモニタ増やしたので、出来ればサイトで・・・

英語読めます

884 :デフォルトの名無しさん:2010/04/15(木) 22:49:38
GHC付属のライブラリのうち興味が持てるやつを読むといいよ

885 :デフォルトの名無しさん:2010/04/15(木) 23:40:51
>>879
名古屋であるとしたら OCaml Meeting かなあ


886 :デフォルトの名無しさん:2010/04/16(金) 10:05:40
あ、ビューティフルコードで予習しないと

887 :デフォルトの名無しさん:2010/04/16(金) 21:31:15
>>878のに行った人いないの?報告plz

888 :デフォルトの名無しさん:2010/04/17(土) 12:50:07
twitter 見てたけど twitter の見方が分からなくてワケ分からんかった

889 :デフォルトの名無しさん:2010/04/17(土) 15:23:47
やっとモナドがわかりかけてきたお(^ω^)

890 :デフォルトの名無しさん:2010/04/17(土) 18:59:19
>>889
分かった様な気がしたり、また分からなくなったりを繰り替えしております(笑)


891 :デフォルトの名無しさん:2010/04/17(土) 19:24:26
monad以前にnatural transformationがわからない
いやそれ以前にdiagram, universal construction, limitあたりもあやしい

892 :デフォルトの名無しさん:2010/04/17(土) 20:21:30
hom集合がわからない
haskell的には、例えば「Int->String型のすべての単相関数」あるいは「型が同じ単相関数をすべて同一視して考えると…」っていうように考えればよいの?

893 :デフォルトの名無しさん:2010/04/18(日) 01:25:20
>>891
commutative diagramが分かればnatural transformが分かる。後は知らない。
>>892
単相関数なる単語は初めて聞くけど、同じ型の射を集めたものをhom集合と呼んでいるだけでしょ?
Haskellの型を圏の対象とし、Haskellの関数を射としてみればhom(Int,String)は
Int->Stringの関数全てをさす。

894 :デフォルトの名無しさん:2010/04/18(日) 11:04:05
>>887
報告っつっても、アジェンダの通りだったけど。
Simonさんの話はビューティフルコードの通り。STM は IORef みたいなことが
できるけど、アトミックな実行が保証されるからレースが起きないよとか、
ミサイル発射(という例が好きなんだなw)みたいな IO は型のおかげで
STM の中には入れられないよ、とか。

話のマクラに、Haskellって普及したよね、委員会による設計の言語
(一般には失敗するとされている)だけど、とかそんな話題もあった。
http://langpop.com/ のグラフをいくつか挙げたり。(LtUのグラフとか)

山本さんの話はmew.orgに使ってるHaskell製httpdについて。
性能の話が主だった。C10Kにも耐えるようにprefork使ったとかselect遅いとか。

山下さんの話は「擬データ」の紹介で、Pseudoというデータコンストラクタ(かな?)とか
:-> という演算子(Haskellの文法的にはコンストラクタだけど、多分コンストラクタじゃ
ないと思う)で、擬データから値を取り出す...のかな。ちょっと理解しきれなかった。

当日のプレゼン資料どっかで公開しないのかな?

895 :デフォルトの名無しさん:2010/04/18(日) 19:37:52
ミサイル発射は僕も大好きです
積極的に使おうと思います

896 :デフォルトの名無しさん:2010/04/18(日) 20:40:46
>>894
STMモナドの中に(小細工しなければ)普通のIOを入れられない、ってそんなに有益かなぁ。
STMモナドを入れ子にしてしまう危険を避けられるという点は有益だと思うけど。

897 :デフォルトの名無しさん:2010/04/18(日) 21:03:56
STMにIOを入れると、やり直しが発生したときにIOが複数回実行されてまずいんじゃないの?

898 :896:2010/04/18(日) 21:37:21
>>897
ああ、そうか。たしかRWHに書いてあったのに忘れていた。
ありがとう。

899 :デフォルトの名無しさん:2010/04/18(日) 22:08:42
こんな本が出るのか、知らなかった
http://www.cambridge.org/uk/catalogue/catalogue.asp?isbn=9780521513388

900 :デフォルトの名無しさん:2010/04/18(日) 22:45:39
ありがと、早速予約してきた

901 :デフォルトの名無しさん:2010/04/18(日) 23:36:01
>>900

気の早いこって

902 :デフォルトの名無しさん:2010/04/19(月) 00:13:39
珠玉の関数型アルゴリズムデザイン!

903 :デフォルトの名無しさん:2010/04/19(月) 03:54:43
The Windows installer currently provides the 2010.1.0.0 Haskell Platform

904 :デフォルトの名無しさん:2010/04/19(月) 04:44:51
やっとか…

905 :デフォルトの名無しさん:2010/04/19(月) 17:31:26
Haskell + OpenGLでやってるんだけど、
OpenGLのウィンドウを閉じたときに処理が終わるようにってできないの?
Haskell 6.4.2 だと勝手に閉じるんだけど、
Haskell 6.10.4 だとならない。

**
windows 7
Haskell 6.10.4
HOpenGL 2.4.0.1

906 :デフォルトの名無しさん:2010/04/19(月) 18:35:14
GLFWのwindowCloseCallback等を使う

907 :デフォルトの名無しさん:2010/04/19(月) 21:09:49
双方向リスト↓を見つけたのですが…
ttp://mono.kmc.gr.jp/~oxy/w/?Lazy+Evaluation

中身がお互いに参照されてループになってて、GCでお掃除されず永久にメモリに居ることになったりするん?

908 :デフォルトの名無しさん:2010/04/19(月) 21:41:32
>>907
循環参照で困るのはリファレンスカウント GC くらいじゃね?
それもアルゴリズムを工夫することで解消できるし

909 :デフォルトの名無しさん:2010/04/19(月) 21:50:33
>>907
GHCの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

910 :デフォルトの名無しさん:2010/04/20(火) 09:36:37
>>899
60usドルか。レートよりも高いな。
www.cambridge.org/us/catalogue/catalogue.asp?isbn=0521513383
amazon.co.jpだと6319円
www.amazon.co.jp/Pearls-Functional-Algorithm-Design-Richard/dp/0521513383

911 :デフォルトの名無しさん:2010/04/21(水) 00:33:13
ghci で次の結果を得ましたが、理由が分かりません。

:t map . (*)
> map . (*) :: (Num a) => a -> [a] -> [a]
let f = map . (*)
> f :: Integer -> [Integer] -> [Integer]

束縛させないものも束縛させたものも、ともに型は明示していないのに、
一方はポリモーフィックでもう一方に Integer 型に決まってしまうのは何故でしょうか。

912 :デフォルトの名無しさん:2010/04/21(水) 06:02:36
mapなしで(*)だけでも同様の結果になるみたいだね
なんでやろ

913 :デフォルトの名無しさん:2010/04/21(水) 07:04:19
>>911-912 それは↓の最後にある 型のデフォルト化 って奴だと思う。
http://www.kotha.net/ghcguide_ja/latest/interactive-evaluation.html

914 :デフォルトの名無しさん:2010/04/21(水) 07:41:46
>>911
単相性制限じゃないかなあ。
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

915 :デフォルトの名無しさん:2010/04/21(水) 09:38:29
>>911
つ let f = map . (*) in f 1.1 [1,2,3]


916 :デフォルトの名無しさん:2010/04/22(木) 18:14:46
Version 6.12.2 (released 22 April 2010)

917 :デフォルトの名無しさん:2010/04/22(木) 22:19:54
>>913,914
ありがとう。
でも、すいません、正直言ってまだ理解できていません。
とくに、型が決定されるのが束縛という操作の時に起こるのがいまいち。
f に束縛したのなら、その f を何か引数に適用する時に、
その引数と併せて推論すればいいのにと思うんですが・・・

ただ、Integer 型に勝手に決まって困るというのは、
単に型シグネチャを明示してやれば解決することなので、
べつに切羽詰まった問題でもないです。
教えていただいたドキュメントをじっくり読んでゆっくり勉強してみます。

>>915
おそらく、let と in を併せてひとつの式と考えられるので、
その場合はひとつの式の中で適切に型推論されるのだと思います。

918 :デフォルトの名無しさん:2010/04/22(木) 22:36:03
>>917
>f に束縛したのなら、その f を何か引数に適用する時に、
>その引数と併せて推論すればいいのにと思うんですが・・・
Haskell98ではまさにそうなってる
単相性制限が適用された変数の型には、そのモジュール内での使われ方だけからでは推論できない場合のみデフォルト化規則が適用される
こういうことができるのは、一つのモジュールの型検査を一度にやることが前提だから

ghciの場合は宣言が入力されるたびにその型を決定するような設計になっている
つまり、使われ方を見ずに型を決めないといけないので、
単相性制限が適用されたら自動的にデフォルト規則も適用されることになる

919 :デフォルトの名無しさん:2010/04/22(木) 23:04:03
>>918
> ghciの場合は宣言が入力されるたびにその型を決定するような設計になっている

そこがポイントで、理屈どうのこうのではなく、
単にそういう戦略を採っているという事なんですね。
(まぁ、いくつかある戦略のうちで
最も開発者の目的にあったものを採用したのでしょうけど)

宣言が入力されるたびにその型を決定する戦略と、
宣言の以降にその宣言されたものを使うまで決定を保留にしておく戦略とで、
インタプリタである GHCi という環境下での
それぞれのメリット、デメリットが気になるところですが、
とりあえずは納得できました。

単相性制限がよく分からないので、これについてはまだ勉強中です。

920 :デフォルトの名無しさん:2010/04/22(木) 23:51:11
単相性制限は
-XNoMonomorphismRestriction

{-# LANGUAGE NoMonomorphismRestriction #-}
で無効にできます

921 :デフォルトの名無しさん:2010/04/23(金) 00:40:06
もなどがわからーん!

922 :デフォルトの名無しさん:2010/04/23(金) 16:01:52
RWH読んだら次進む書籍を教えてくらはい

923 :デフォルトの名無しさん:2010/04/23(金) 16:43:17
読むよりコーディングしろよ

924 :デフォルトの名無しさん:2010/04/23(金) 17:38:31
>>922

オレ今RWH2回目読んでるw

でも今回は手を動かしていないので進むスピードが段違いだが・・・

925 :デフォルトの名無しさん:2010/04/23(金) 19:39:17
>>922
Haskell で数独でも解いてろ
エレガントに組もうとすると意外に悩んでいい勉強になる

926 :デフォルトの名無しさん:2010/04/24(土) 13:23:09
Text.Regex をインポートしてghcでコンパイルするとこんな(↓)エラーがでます。
test.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の検索で出てくるパッケージをすべてインストールしました。

なんか間違ってますでしょうか?

927 :デフォルトの名無しさん:2010/04/24(土) 13:25:58
>>926 ですけど、↓のインストール失敗してました。何か関係あるでしょうか?
E: libghc6-pandoc-dev: サブプロセス installed post-installation script はエラー終了ステータス 1 を返しました

928 :デフォルトの名無しさん:2010/04/24(土) 16:41:24
>>926
似たようなことになったことがある
regexじゃなくてhsloggerだったけど
ググっても何も出なくて途方に暮れてたけど
いつの間にかビルドが通ってそのまま
ちなみにghcは6.12.1

929 :デフォルトの名無しさん:2010/04/24(土) 17:13:49
>>926
ghc -package regex-compat test.hs
あるいは、
ghc --make test.hs

930 :デフォルトの名無しさん:2010/04/24(土) 17:16:03
regex-compatじゃなくてregex-posixか
compatでもリンク通っちゃったが

931 :デフォルトの名無しさん:2010/04/24(土) 17:31:39
ubuntu + GHC は、私もubuntuのパッケージが何かおかしくなることが何度かあったので、
今は、ubuntuのパッケージは全部アンインストールして、GHCの最新版を$HOME以下にインストール+cabal にしている。
でも、gtk2hsがコンパイルできないんだよね… 悩む。

932 :デフォルトの名無しさん:2010/04/24(土) 18:47:42
>>931
ghc-6.12.1でビルドするためのgtk2hs用パッチがあるよ
6.12.2で使えるかは知らないけど

ttp://www.mail-archive.com/gtk2hs-devel@lists.sourceforge.net/msg00484.html

933 :デフォルトの名無しさん:2010/04/24(土) 18:50:35
なんかプロファイル有効にすると失敗するんだわ>gtk2hs on ghc-6.12.1

934 :デフォルトの名無しさん:2010/04/24(土) 21:35:46
gtk2hs cabalized
って、home page に書いているから、
もうちょっと経つと、幸せになれるかもしれない。


935 :デフォルトの名無しさん:2010/04/24(土) 23:54:48
>>931
>>932
Darcsレポジトリに入ってるgtk2hsの開発版は既にパッチが当てられている。
私はクリーンなghcでのビルドに成功した。
しかし一般にHaskellのコンパイルは依存パッケージ等の問題で失敗しやすいので、うまくいく保証はない。

936 :デフォルトの名無しさん:2010/04/25(日) 05:41:57
それにしてもdarcsの遅さは何とかしてもらいたいものだ

937 :デフォルトの名無しさん:2010/04/26(月) 21:39:15
Purely functional data structure注文しようと見に行ったら、ついこないだまで在庫あったのにkonozamaだったよ。

ネットで取ってこられるPDFと内容大分違う?

938 :デフォルトの名無しさん:2010/04/27(火) 00:56:15
>>937
ウェブで公開されているドラフトのほうは読んでないけど、章の構成も違ったような気がする
って、見ればわかるか

939 :デフォルトの名無しさん:2010/04/27(火) 10:02:53
>>937
最近,洋書はwww.bookdepository.co.ukで買うことが増えてる
amazon.co.jp, amazon.comよりも安いことが多い
梱包は良くないけどね


940 :デフォルトの名無しさん:2010/04/27(火) 14:58:37
>>939
.co.ukのほう?俺は.comだ。
送料無料だから1冊だけだと安い
複数冊だとamazon.comのほうが安いかもしれない

941 :デフォルトの名無しさん:2010/04/27(火) 18:00:15
C++でselect()を使って最大1024のソケットを読み書きするプログラム
をHaskell(GHC)に移植しているんですが
GHCではソケット毎にforkIO(内部的にはselect()らしい)するのが一般的なんでしょうか?
epollを使うような例もググればあるにはあるんですが・・
優先度はCPU/メモリ負荷>>>スループット、OSはLinuxです。

942 :デフォルトの名無しさん:2010/04/28(水) 21:16:05
今RWH読んでるんだけど、難しいわ
もしかしてHaskellって難しい?
みんな本当にRWHの内容全部理解できてるの? 実はぼんやりなんでそ?

943 :デフォルトの名無しさん:2010/04/28(水) 23:17:39
>>942
Haskellを全部理解するには、離散数学の素養や、進歩しつづけるGHCコンパイラの実装技術に関する知識なども必要だからね。
そこまでわかる人はほとんどいないだろう。
Haskellはみんなで研究開発する言語です

944 :デフォルトの名無しさん:2010/04/28(水) 23:20:04
短く書ける /= 必要とする知識が少ない


945 :デフォルトの名無しさん:2010/04/28(水) 23:23:24
私なんて1年以上前からrwhに取り組んでいるから大丈夫
Haskell以外にもやってるが

946 :942:2010/04/29(木) 01:03:17
>>943 >>945 >>945

THX

ちょっとホッとしたわ。プログラミングとコンピュータの構造については
それほど疎いわけではないと思うのに、たまに読んでる内容が分から
なくなることがあって・・・

気にせず進むことにする

947 :942:2010/04/29(木) 01:10:06
>>946

× >>943 >>945 >>945

>>943 >>944 >>945

948 :デフォルトの名無しさん:2010/04/29(木) 02:02:38
>>945
さすがにそれは長すぎ

949 :デフォルトの名無しさん:2010/04/29(木) 09:21:51
おれは、何かしら作ってみるまでなにも理解できない。
でも、なにか作り始めると「動けばいいや」ってなって、全然
言語に詳しくなってない。。
なので、どっちにしても結局理解してない。

950 :デフォルトの名無しさん:2010/04/29(木) 10:32:17
一行目は同感だ

951 :937:2010/04/29(木) 11:34:38
>>939,940
Thx. 紹介して頂いた所でorderできました。調子に乗ってhardcoverでw

952 :デフォルトの名無しさん:2010/04/29(木) 12:56:12
>>942
RWHは例題が悪すぎる。
Haskell以前に例題が理解できない。
はじめて読む人は、まず例題の解説が必要。何をやろうとしてるのか分からない。
(C言語で解いた場合のプログラムコードが載ってるけど、いきなり見せられるとC屋さんでも首をかしげるレベル)

さらに、文法やイディオムのまとめがないので、後から文法を調べるときにももう一度分かりにくい例題を始めから読まないといけない。
あと、プログラミング論全般の話題をしてるときに、いきなりHaskell固有の文法の解説が入って話が飛ぶのも良くない。
結果、一つの記号や文法の説明が複数の章に散在してしまい、ハンドブックとしても使いにくくなっている。


953 :デフォルトの名無しさん:2010/04/29(木) 13:44:32
>>952
使い方を間違えてないか。ハンドブックは別に用意すればいいw

例題が何とかは特に感じなかったのでパス

954 :デフォルトの名無しさん:2010/04/29(木) 14:11:03
バーコードの章は途中でついていけなくなった。

955 :デフォルトの名無しさん:2010/04/29(木) 14:13:38
Real World Haskellってただのライブラリ解説書でしょ

956 :デフォルトの名無しさん:2010/04/29(木) 14:29:05
>>953

ハンドブックとしてのお薦めは?

957 :デフォルトの名無しさん:2010/04/29(木) 15:29:43
>>956
ネット。チュートリアルとリファレンスと論文を使い分けるのが正しいアプローチ。

958 :デフォルトの名無しさん:2010/04/29(木) 15:48:46
ようするに、チュートリアルやリファレンスや論文の分かりやすい説明をRWHに期待するなということですよ

959 :デフォルトの名無しさん:2010/04/29(木) 15:51:01
Real World Haskellってただのライブラリ解説書でしょ

960 :デフォルトの名無しさん:2010/04/29(木) 15:51:35
>>955
違う

961 :デフォルトの名無しさん:2010/04/29(木) 15:52:56
>>960
持ってるから何が書いてあるか分かる。
ライブラリの解説ぐらいしかみどころがない。

962 :デフォルトの名無しさん:2010/04/29(木) 16:18:16
ライブラリ解説書というほど多くのライブラリを網羅しているわけではない
リストとか正規表現の関数も一部しか出てこない

963 :デフォルトの名無しさん:2010/04/29(木) 17:01:38
>>961
ライブラリ解説書はライブラリ内の多くの機能を辞書的に解説す事に価値がある。
本書は、その機能をどう使うのか、なぜ使うのかを学べるとともに、
一般的なライブラリ解説書では学べない多くのことも学べる。

たとえば第5章では JSON 用のライブラリを書くことを通じて、
代数データ型で構文木を作り、それをルートから辿りながら
ノードをひとつひとつ処理していく方法を学ぶ。

他にも第9章では、可能な限り IO モナドに頼らずに、
プログラムの振る舞いを指示する表現力豊かな機能を作る問題に対して、
DSL という回答を与えて実演して見せている。
第10章なら、条件分岐の深い入れ子になりがちなデータ解析という処理を
状態遷移と捕らえ、かつ運ぶべき状態情報を隠蔽する方法を提示しており、
また後の章でさらに抽象化している。

このような方法論を学べる「ライブラリ解説書」はまず無い。
他にも例を提示しようか?

964 :デフォルトの名無しさん:2010/04/29(木) 17:16:54
>>957

ネットでお薦めは?

965 :デフォルトの名無しさん:2010/04/29(木) 17:29:53
>>963
方法論、ぴったりの言葉ですね。
Real World Haskell (RWH)はHaskellプログラミングのマイルストーンです。
言語仕様や個別のライブラリについては他のドキュメンテーションをあたるべきです。
RWHはHaskell学習の出発点、ルートノードとして使われるべきリソースです。

966 :デフォルトの名無しさん:2010/04/29(木) 17:31:11
>>963
そもそもJSONのライブラリを作るという例題が解説書として不適切な気が

967 :デフォルトの名無しさん:2010/04/29(木) 17:31:58
>>966
どーして?

968 :デフォルトの名無しさん:2010/04/29(木) 18:06:18
>>967
・JSON形式自体を理解するのにワンステップ必要だから
・Javaの意味の用語(オブジェクト、型、構成子)を知ってると微妙に混乱する

で、なんとか理解した気持ちになってページめくったら、Justで包むとかいう表現が出てきてワケ分かんないって
普通に show を別途実装するとかいう例題でよかったと思うのは俺だけか…

969 :デフォルトの名無しさん:2010/04/29(木) 18:14:14
>・JSON形式自体を理解するのにワンステップ必要だから
簡単な紹介はするが、詳細は自分で調べてというのはごく普通の態度だろう。

>・Javaの意味の用語(オブジェクト、型、構成子)を知ってると微妙に混乱する
Javaは関係ない。そもそもJavaが出てきたのはHaskellの後であり、十分な理論的基盤を構築せずに開発を始めたJavaが悪い

970 :デフォルトの名無しさん:2010/04/29(木) 18:19:39
>>969
十分な理論的基盤を構築せずに開発を始めたJavaのために作られたJSONを例題に使うのは良くないと思う

971 :デフォルトの名無しさん:2010/04/29(木) 18:20:14
横からだけど、詳細を調べる過程でその悪いJavaの知識が必要なJSONをわざわざ持ってくるのが悪いという話では?

972 :デフォルトの名無しさん:2010/04/29(木) 18:35:43
オレもJSONのところ(5章)と次の6章はしんどかったなぁ。2回やったら
何をやらんとしてるかは分かったけど、でもまだ ? なところはある。

一応CとHaskellだけで全て賄おうと思ってるんで、先に進みます。

973 :デフォルトの名無しさん:2010/04/29(木) 18:37:47
JSONがJavaScriptのサブセットだというのは知ってたが
Javaのために作られたというのは知らなかった

974 :デフォルトの名無しさん:2010/04/29(木) 18:57:13
JavaScriptという言語では、ブラウザ-サーバ間でデータ転送を行うことができて、
HTTPでデータ転送を行うときには、(Javaの世界の)オブジェクトをString型に変換(シリアライズ)してやりとりしている
(Javaの世界の)オブジェクトをString型に変換する手法のひとつがJSON

という最低限の知識を持ってないと、読むときにひっかかる

他の章でも、「プログラムコードのほとんどは例外処理」とか「ボイラープレートは面倒くさい」とか「ハンドル」とか「シノニム」とか「クロージャ」とか、最低限のリテラシを持ってないとスラスラ読めない

そういう本です

975 :デフォルトの名無しさん:2010/04/29(木) 19:01:11
そりゃ *Real World* Haskellだからなあ
JSONぐらいで批判されるとは思わないだろう

976 :デフォルトの名無しさん:2010/04/29(木) 19:03:47
JSONはもともとJavaScript由来のもの。
だからJSONとJavaは関係ない。


977 :デフォルトの名無しさん:2010/04/29(木) 19:03:57
Scrap your boilerplateが話題になった頃にHaskell触ってた奴じゃないとボイラープレートとかわかんないだろうなぁ

978 :デフォルトの名無しさん:2010/04/29(木) 19:06:23
というかboilerplateは普通の英単語なので、ただ日本人に馴染みがないだけ。
synonymも同様。普通の英文法用語。


979 :デフォルトの名無しさん:2010/04/29(木) 19:09:47
>>976
コンピュータ言語とは構文解析するときの仕様である、という立場をとると、JSONもJava由来

980 :デフォルトの名無しさん:2010/04/29(木) 19:10:39
>>979
わけがわからない。何でもJavaで考える頭の悪い子か?

981 :デフォルトの名無しさん:2010/04/29(木) 19:11:08
http://www.merriam-webster.com/dictionary/boilerplate

Main 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 かな・・・

982 :デフォルトの名無しさん:2010/04/29(木) 19:11:13
涙拭けよ

983 :デフォルトの名無しさん:2010/04/29(木) 19:12:04
× 頭が悪い
○ かわいそう

984 :デフォルトの名無しさん:2010/04/29(木) 19:12:23
>>974
最低限の知識…いや、自分は読んだとき知らなかったけど、5.1を読み、そこで紹介されてる
web頁見るかwikiでもつつくかして、まあこんなもんがあるのか位に思えば済んだ事だけどね

そろそろ次スレ建てましょうか?

985 :デフォルトの名無しさん:2010/04/29(木) 19:16:05

オブジェクト内のパラメータが増えるとセッター/ゲッターメソッドが増えてメンドいという経験がないと、ボイラープレートが云々の話はムズいと思う。
「type はただのシノニム」という説明もかえってムズい。

986 :デフォルトの名無しさん:2010/04/29(木) 19:18:03
そこでdata-accessorやfclabelsですよ


987 :デフォルトの名無しさん:2010/04/29(木) 19:18:29
>>985
???
その前の部分を読んでいれば、Haskellでも抽象度の低いboilerplateな書き方は
読みにくいのがわかるはずだが?

988 :デフォルトの名無しさん:2010/04/29(木) 19:19:23
おまいら次スレが重複したら自決してくださいね

989 :デフォルトの名無しさん:2010/04/29(木) 19:24:48
関数型プログラミング言語Haskell Part12
ttp://pc12.2ch.net/test/read.cgi/tech/1272536128/

990 :デフォルトの名無しさん:2010/04/29(木) 19:29:47
>>57
例えば57ページだけど、ボイラープレートでも読みやすいけど。
nicerID (Book id _ _ ) = id
nicerTitle (Book _ title _ ) = title
nicerAuthors (Book _ _ authors) = authors

ここの説明だけ読むと、分かりやすいけどただコードをたくさん書くのがウンザりだから、ボイラープレートコードを避けてるようにしか見えない。

991 :デフォルトの名無しさん:2010/04/29(木) 19:32:06
>>990
誰に対して言ってるんだ?

992 :デフォルトの名無しさん:2010/04/29(木) 19:39:30
>>989
おつおつ

993 :デフォルトの名無しさん:2010/04/29(木) 19:40:33
JSON が実際にどういうものかはどうでも良いと思うよ。
JSON という名前がついたシリアライズの方法のひとつを例に取るというだけのこと。
数値や文字列、オブジェクトなどを簡単な文字列でシリアライズする
というくらいの前知識だけで、[5.6 JSON データを印字する] から
構文木をたどって処理する方法を学ぶのに十分だよ。
(最低限の簡単な前知識はその前の節で説明されてるし)。

俺も JSON が何か知らずに読み初めたけど方法論を学べたし、
理解できた後でも未だに JSON なんて実際に一回も使ったことがない。

994 :デフォルトの名無しさん:2010/04/29(木) 20:07:35
できれば、「シリアライズ」の説明も欲しかった
前後にバイトコードの話もあったから、混乱するっちゃ

995 :デフォルトの名無しさん:2010/04/29(木) 20:28:03
もう日本語の説明が必要って話だね。
いや、"Real World"って立ち位置で作者は良くまとめてくれていると思うよ。

996 :デフォルトの名無しさん:2010/04/29(木) 20:32:14
本屋に行ってHaskellの本を探して、ふつうのHaskellとRWHしかなくて、両方買って、始めにふつうの方を読んで、その後でふつうの続編の感覚でRWH読んだら死亡ですか

997 :デフォルトの名無しさん:2010/04/29(木) 20:39:58
人によってはそうかもしれないけど、間を埋める本があるわけじゃない。
プログラミングHaskellはふつうと並ぶ立ち位置だよね?

998 :デフォルトの名無しさん:2010/04/29(木) 20:47:20
>>994
いまどきの子は直列化とか言われたら単三電池ですかって答えるぞ
埋め

999 :デフォルトの名無しさん:2010/04/29(木) 20:49:54
Haskell: The Craft of Functional Programming

The Haskell School of Expression: Learning Functional Programming through Multimedia

The Haskell Road To Logic, Maths And Programming

洋書で分かりやすいのってどれですか?

1000はあきらめた

1000 :デフォルトの名無しさん:2010/04/29(木) 20:55:28
はじめてのCレベルの入門書はどれでしょうか?

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

278 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)