関数型プログラミング言語Haskell Part9
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん
2008/05/17(土) 16:41:29http://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/
・2chの仕様により、行頭の半角スペースは表示されません。
コードをインデントしたいときは、代わりに または全角スペースを使うことができます。
0002デフォルトの名無しさん
2008/05/17(土) 16:42:18・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/
0003デフォルトの名無しさん
2008/05/17(土) 16:42:39・関数型言語Part IV
http://pc8.2ch.net/test/read.cgi/tech/1083649982/
・【数学者】Haskellはクソ言語【オナニー】
http://pc8.2ch.net/test/read.cgi/tech/1128011645/
・純粋関数型言語Concurent Clean
http://pc8.2ch.net/test/read.cgi/tech/1075629340/
・関数型言語ML(SML, OCaml, etc.), Part 5
http://pc11.2ch.net/test/read.cgi/tech/1186292994/
・Lisp Scheme Part21
http://pc11.2ch.net/test/read.cgi/tech/1207300697/
・【入門】CommonLispその4【質問よろず】
http://pc11.2ch.net/test/read.cgi/tech/1201402366/
・Emacs Lisp 3
http://pc11.2ch.net/test/read.cgi/tech/1191875993/
0004デフォルトの名無しさん
2008/05/17(土) 16:43:00Haskell98によると、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のような例外を除くと、単純にリテラルを使うことはできない。
2. GHC6.6
ソースコードにはUTF-8、入出力にはLatin-1を仮定する。このため、EUC-JPでリテラルを直に
書くことはできない。
(続く)
0005デフォルトの名無しさん
2008/05/17(土) 16:43:203.最近のHugs(非WindowsかつCのwchar_tがUnicodeの環境、というかLinux)
ソースコード・入出力ともロケールのエンコードを利用する。
4.最近のHugs(Windows)
ソースコード・入出力ともLatin-1を仮定する。ただし文字列リテラルにShift-JISを使ってもエラーにならない。
5.最近のHugs(それ以外)
未調査。
・結局どうするか。
規格どおりにCharにUnicodeを入れるか、Charを単なるバイトとして扱うかの二択。
i. CharをUnicodeとして扱う
(3)以外の場合入出力で変換が必要。(2)または(3)以外の場合文字列リテラルでは
明示的なエスケープ(たとえば"\22234")が必要。
ii. Charをバイトとして扱う
(3)ではファイルをバイナリモードで開くなどの対策が必要。(1)でEUC-JPを使う場合と(4)
を除き文字列リテラルでは明示的なエスケープ(たとえば"\143\153")が必要。
lengthやisAlphaのような関数、およびwin32パッケージの関数(win32API)が正しく動作しない。
0006デフォルトの名無しさん
2008/05/17(土) 16:43:41前スレが終わってからしばらく建ってなかったので建てました。
行き届かないところがあったらごめんなさい。
0007デフォルトの名無しさん
2008/05/17(土) 17:05:58, '´ λ ヽ
!,.イリノ)))〉
リ)^ヮ^ノ| このスレのマスコットキャラ
ノ⊂)水!つ
((( く/_l〉 リ はすけるたん
`` し'ノ
0008デフォルトの名無しさん
2008/05/17(土) 18:53:58Word8からWord32に変換する方法についてなのですが、
Word8からtoInteger・fromInteger関数を経てWord32に変換する以外に、
クレバーな方法はありませんか?
0009デフォルトの名無しさん
2008/05/17(土) 18:54:51http://www.haskell.org/croppedhaskell.jpg
0010デフォルトの名無しさん
2008/05/17(土) 19:44:18n(n-1)個のcastを用意するのが
2n個のcastを用意するよりクレバーだと思いますか?
0011デフォルトの名無しさん
2008/05/17(土) 20:00:311. ソース中の文字列 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 のコメントに書いてある)
よろしくたのむ、な。
0012sage
2008/05/17(土) 20:05:38toEnum . fromEnum でよくね
0013デフォルトの名無しさん
2008/05/17(土) 21:23:49>1. ソース中の文字列 hello = "こんにちは" :: String は UTF-8
これどういう意味?Stringになってしまえば文字コード関係なくね?
>2. これを ghci で表示することは可能
*Main> print hello
"\12371\12435\12395\12385\12399"
こうなった
0014デフォルトの名無しさん
2008/05/17(土) 21:25:11fromIntegral :: (Integral a, Num b) => a -> b
fromIntegral = fromInteger . toInteger
という関数がある
0015デフォルトの名無しさん
2008/05/17(土) 21:41:450016デフォルトの名無しさん
2008/05/18(日) 08:26:56上げていただいている関連書籍で、
・Introduction to Functional Programming Using Haskell
・Haskell: The Craft of Functional Programming
は読み終えて、
・The Haskell School of Expression: Learning Functional Programming Through Multimedia
を問題解きつつ進めているところですけど、
・The Fun of Programming
次はこちらがいいんでしょうか。それともネット上の新しい記事とかを
見ていくほうがいいですか?
0017デフォルトの名無しさん
2008/05/18(日) 09:26:23The Haskell Programmer's Guide to the IO Monad ― Don't Panic
http://stefan-klinger.de/files/monadGuide.pdf
は、Haskellのモナドを理解するのにおすすめ。
0018デフォルトの名無しさん
2008/05/18(日) 12:25:58100MB程度の音楽データを編集するツールを作ろうと思っているのですが、
音楽データを格納するための型のお勧めは何ですか?
0019デフォルトの名無しさん
2008/05/18(日) 12:39:36音楽ツールのことは良く知らないから一般的なことだけ言うと、
Haskellで配列っぽいデータを扱うときに一番空間効率がいいのは非ボックス化配列
(具体的にはUArrayかIOUArrayかSTUArray)で、Cの配列と同じくらいコンパクト
ただし、これは生の配列だから切ったり貼ったりするのには向かない
切り貼りしたいなら、「非ボックス化配列を葉とする木」みたいな構造が必要かも
ところで音楽編集ソフトって全部メモリ上で作業するんだろうか
0020デフォルトの名無しさん
2008/05/18(日) 22:20:25ありがとうございます。文系なので理解できるか不安ですがw。
一通りの基本構文については馴染んできたと思うので、もう少し
アプリ全体の構成などについての解説文書みたいなものって
ありますでしょうか。
或いは、モナドもその一つだと思うのですが、関数型によるプログラミング
テクニックというんでしょうか、そういったものがもう少しまとまっている
本があると嬉しいんですが。
0021デフォルトの名無しさん
2008/05/18(日) 23:25:58細かいこと考えないのが吉なのか凶なのか。
0022デフォルトの名無しさん
2008/05/18(日) 23:34:120023デフォルトの名無しさん
2008/05/18(日) 23:37:22真理?なにそれ食えるの?
0024デフォルトの名無しさん
2008/05/18(日) 23:40:594 :: Int
は絶対的な真理じゃね?
0025デフォルトの名無しさん
2008/05/18(日) 23:50:330026デフォルトの名無しさん
2008/05/19(月) 00:15:42ささ、次行きましょう
0027デフォルトの名無しさん
2008/05/19(月) 00:16:50その例のようなことが成り立つ数体系が便利だから、
たまたま人間が採用して「正しい」として使ってるだけとも言える
とはいえ、「数学は人間の存在にかかわらず成立するから
数学はこの世の真理の一つだ」と主張する哲学者もいたような
0028デフォルトの名無しさん
2008/05/19(月) 00:19:330029デフォルトの名無しさん
2008/05/19(月) 00:22:380030デフォルトの名無しさん
2008/05/19(月) 00:27:10言葉が足りなかったな
Haskell98における式「4」は、Haskell98における型式「Int」で表される型を持つ
と言えばよかったか
もちろんHaskell98ってのは地球でBC1998年に定義された「あの」Haskell98のことで、
「型」とか「式」とかの術語はHaskell98の仕様に従って解釈するものとしてね
0031デフォルトの名無しさん
2008/05/19(月) 00:49:11真理の意味が分かってないんだろ
0032デフォルトの名無しさん
2008/05/19(月) 00:52:180033デフォルトの名無しさん
2008/05/19(月) 00:53:52まことのことわり。
コレは絶対の真理。
0034デフォルトの名無しさん
2008/05/19(月) 00:55:36例:HaskellスレはHaskellを論ずる為に存在している
これでおk?
0035デフォルトの名無しさん
2008/05/19(月) 00:55:400036デフォルトの名無しさん
2008/05/19(月) 00:59:02そこから >>31 を導出するのは至難だなw
0037デフォルトの名無しさん
2008/05/19(月) 01:04:010038デフォルトの名無しさん
2008/05/19(月) 01:06:01理系に限らず2chの雑談はどこもこんな感じです。
0039デフォルトの名無しさん
2008/05/19(月) 01:07:30春か?春だからなのか?
0040デフォルトの名無しさん
2008/05/19(月) 01:19:01修飾語は強調する為にも使うけど、意味内容の重複は許されないという主張?
0041デフォルトの名無しさん
2008/05/19(月) 01:25:540042デフォルトの名無しさん
2008/05/19(月) 01:31:460043デフォルトの名無しさん
2008/05/19(月) 13:06:150044デフォルトの名無しさん
2008/05/19(月) 13:50:330045デフォルトの名無しさん
2008/05/19(月) 18:57:28+とか++とかもあってよくわからないのですが
0046デフォルトの名無しさん
2008/05/19(月) 19:25:42× haskell4000年の歴史
○ AD
0047デフォルトの名無しさん
2008/05/19(月) 19:41:15解らないなら使うな以上
0048デフォルトの名無しさん
2008/05/19(月) 19:46:25(+) は Integralクラスのインスタンス、つまり数の加法。
(++) は リストの結合。[1, 2, 3] ++ [4, 5, 6] は [1,2,3,4,5,6]。
(+++) は Arrowの合成かなにかに使う。Arrowは俺も良くわかんないし、まあ知らんでもプログラムは書けるから気にするな。
0049デフォルトの名無しさん
2008/05/19(月) 19:46:290050デフォルトの名無しさん
2008/05/19(月) 19:49:24失敬!(+)はIntegralじゃなくてNumクラスのインスタンスの加法だな。
0051デフォルトの名無しさん
2008/05/19(月) 20:03:27「16文字のString型」という定義は型定義の段階でできるのでしょうか?
0052デフォルトの名無しさん
2008/05/19(月) 20:11:35ありがとうございます
0053デフォルトの名無しさん
2008/05/19(月) 20:14:01絶対の真理
005420
2008/05/19(月) 22:42:22ちなみに自分は理系人間に対しては羨望の眼差しで見ています。
The Fun of Programming って読んだ方いらっしゃいますでしょうか。
0055デフォルトの名無しさん
2008/05/19(月) 23:25:55彼女ができると聞いたのですが
みなさんは彼女いてますか?
0056デフォルトの名無しさん
2008/05/19(月) 23:39:5555人ぐらいいるよ。
0057デフォルトの名無しさん
2008/05/20(火) 03:13:47そんな教科書ばっか読んでなにがしたいの?
>>20
Haskellで書かれたアプリのコード読め。
0058デフォルトの名無しさん
2008/05/20(火) 22:55:170059デフォルトの名無しさん
2008/05/20(火) 23:03:23今はもっと洗練されてる。
0060デフォルトの名無しさん
2008/05/21(水) 00:08:320061デフォルトの名無しさん
2008/05/21(水) 01:40:02それってリトル隙間の姉妹本?
0062デフォルトの名無しさん
2008/05/21(水) 02:51:300063デフォルトの名無しさん
2008/05/21(水) 03:51:48まってないで作って公開しろ
0064デフォルトの名無しさん
2008/05/21(水) 23:00:47今って例えばどれ?
0065デフォルトの名無しさん
2008/05/22(木) 03:04:27古いというか、力技で作ったって感じ。
>>59はFRPを念頭においてるんだろうけど、
FragのObjectBehaviorなんかが洗練されてるのかは微妙。
0066デフォルトの名無しさん
2008/05/22(木) 19:37:060〜10までの整数を定義した型というのは宣言できますか?
0067デフォルトの名無しさん
2008/05/23(金) 01:04:34数学基礎論がまるで分からないんだね。
0069デフォルトの名無しさん
2008/05/23(金) 07:10:080070デフォルトの名無しさん
2008/05/23(金) 13:34:41沢山あるからどれを読もうか迷ってしまう
このスレ的に、コレは読んでおいて損は無い!って奴あったら教えてくらはい
今のとこ読んだのはImperative functional programmingとLazy vs Strictと
Haskell vs. Ada vs. C++ vs. Awk vs. ...
0071デフォルトの名無しさん
2008/05/23(金) 13:47:070072デフォルトの名無しさん
2008/05/23(金) 13:49:132chは時代遅れ情報しか出てこねーな。noobどもしかいねぇ。
0073デフォルトの名無しさん
2008/05/23(金) 13:53:080074デフォルトの名無しさん
2008/05/23(金) 14:18:52落として読んでみるよー
他にもあったら是非教えてクレクレ
>>72
玄人さん面白かった論文教えて
0075デフォルトの名無しさん
2008/05/23(金) 14:36:10そんな事を言う奴が来るな!
数学なんぞできんでもプログラムはできる!!
0076デフォルトの名無しさん
2008/05/23(金) 14:49:15手続き型にどっぷり浸かった後で関数型言語を触って嵌ってしまったやつは
やつは皆計算機科学の世界に飛び込み二度と帰ってこなくなっちまうものなのさ
「コード書いてるより数式弄くってるほうが楽しいおwwww」
俺の同僚の最後の言葉さ・・・
0077デフォルトの名無しさん
2008/05/23(金) 16:03:560078デフォルトの名無しさん
2008/05/23(金) 18:02:35いまいちメリットが無いんだよなぁ。
前のコードの方が短かったし、arrowにしたせいで複雑になってしまうことも多々ある。
arrowのメリットを具体的に教えてくださいよ。
論文読んでみてもarrowのうまみが伝わってこないんだよね。
0079デフォルトの名無しさん
2008/05/23(金) 18:31:300080デフォルトの名無しさん
2008/05/23(金) 19:12:20arrowを使ったほうが分かりやすいって感じる人も少しはいるでしょうから
そういう人が勝手に使ってればそれでいいんでしょう
008136 ◆K0BqlCB3.k
2008/05/23(金) 19:20:21008236 ◆K0BqlCB3.k
2008/05/23(金) 19:21:010083デフォルトの名無しさん
2008/05/23(金) 19:39:51warrockに帰れwww
0084デフォルトの名無しさん
2008/05/23(金) 19:58:07(モナドと比較した場合)arrowの旨みって、モナドではないがarrowである型があるっていう一点じゃないの?
そういう型を扱うときはarrowの枠組みが便利というだけ
008536 ◆K0BqlCB3.k
2008/05/23(金) 20:07:010086デフォルトの名無しさん
2008/05/23(金) 20:12:53確かにそれは慣れれば便利かもな
でも、Arrow (->)という特定のインスタンスを使ってるだけなら、
>>78が言ってるようなArrowの旨味とは別の話な気がする
0087デフォルトの名無しさん
2008/05/23(金) 23:35:21ちょwwBeautiful Codeって本みながら、たまたまスレ覗いたら、
本の中でソレ紹介されてたぞww
0088デフォルトの名無しさん
2008/05/24(土) 00:10:42解析関係かデバッグ関係
形式証明以外使えそうな分野
無い
0089デフォルトの名無しさん
2008/05/24(土) 04:49:010090デフォルトの名無しさん
2008/05/24(土) 04:59:310091デフォルトの名無しさん
2008/05/24(土) 22:25:11関数型が好きな理由は、所謂プログラミングの面白さがあるからではないな。
0092デフォルトの名無しさん
2008/05/25(日) 00:01:550094デフォルトの名無しさん
2008/05/25(日) 01:33:41do{...}が値を持つ単なる式であるか、という質問ならそのとおり
>>93が言うようにdo式は構文糖で、bind演算子(>>=)の略記
do式の値が(広い意味で)アクションか、という質問ならそのとおり
具体的には、IOモナドに関するdo式なら値はIOアクション、リストモナドならリスト、という具合
0097デフォルトの名無しさん
2008/05/25(日) 03:08:50そういうつもりで書いた
一般的でない用語法だったらすまん
0098デフォルトの名無しさん
2008/05/25(日) 03:28:30Nothing : 計算を即座に終了させるアクション
0099デフォルトの名無しさん
2008/05/25(日) 07:33:241 + 2: 1と2を加えるアクション
0100デフォルトの名無しさん
2008/05/25(日) 09:42:48知識をダイレクトにコード化が可能だと感じますか?
Cなんかだと似ても似つかないものにしないといけませんよね。
数学的なモデルのシュミレーションなんかを記述する際に、
正しく書くのは結構大変じゃないかと思ってしまいます。
そういう点で、Haskellはそのままとは言いませんが書きやすいの
かなぁと。だけど、僕の知人で理系の人たちはC言語使う場合が
多いようです。最大の理由はスピードだそうですが、手間を考えると
早い計算機使ってHaskellで書いた方がいい、という考えの人も
いるんでしょうか。
0101デフォルトの名無しさん
2008/05/25(日) 10:41:40LINPACKが使えるかどうか
それが問題だ
0102デフォルトの名無しさん
2008/05/25(日) 10:49:58関数とアクションは同じものなの?
0103デフォルトの名無しさん
2008/05/25(日) 10:55:25別のものだよ
>>99はネタ(か、たちの悪い誤解)だから真に受けんな
0104デフォルトの名無しさん
2008/05/25(日) 11:19:31氏ねよw
0105デフォルトの名無しさん
2008/05/25(日) 11:24:300か1かみたいな考え方は辞めた方がいいかと。
工学の人は合理的、合目的的に考えるから、適材適所でやります。
速い計算機に、さらに速いソフトウェアがあれば、より計算を回せます。
計算機が速いから、ソフトウェアは遅くていいなんてやり方じゃ、
ライバルに負けてしまいます。遊びならそれでもいいけど。
0106デフォルトの名無しさん
2008/05/25(日) 11:39:540107デフォルトの名無しさん
2008/05/25(日) 12:36:24Maybeとかでも「アクション」ていうの?
0108デフォルトの名無しさん
2008/05/25(日) 12:43:090109デフォルトの名無しさん
2008/05/25(日) 12:43:17関数の外の世界に対して、関数の動きが影響を与えたり、逆の現象が発生
するのがActionであり、IO型であると。
IOがモナドなのは、モナド則に当てはまるから、ってだけではないでしょうか?
0110デフォルトの名無しさん
2008/05/25(日) 13:21:380111デフォルトの名無しさん
2008/05/25(日) 13:24:07そうそう、その時点その時点でのベストを尽くします。そして、過去の仕事に対するリスペクトも忘れません。
0112デフォルトの名無しさん
2008/05/25(日) 15:24:57たとえば
data Hoge = Hoge { x1 :: Word32, x2 :: Word32, x3 :: Word16, x4 :: Word16}
のようなHogeを[Word8]と相互変換する便利な方法ってないでしょうか?
0113デフォルトの名無しさん
2008/05/25(日) 15:29:120114デフォルトの名無しさん
2008/05/25(日) 15:33:25へえ・・・ 何となくおもしろそう
ドキュメントとか読んでみます
0115デフォルトの名無しさん
2008/05/25(日) 15:58:200116デフォルトの名無しさん
2008/05/25(日) 16:02:020117デフォルトの名無しさん
2008/05/26(月) 00:05:41計算機プログラムの構造と解釈
ってどっち買ったらいいの?
なんか最近数学の基礎たりねー
0118デフォルトの名無しさん
2008/05/26(月) 00:17:22つい先日第2版が出たので聞いてみた
私事だけど金がないので優先度が欲しい
0119デフォルトの名無しさん
2008/05/26(月) 07:36:440120デフォルトの名無しさん
2008/05/26(月) 09:26:17しかもHaskellには関係ない
推薦図書スレは別にあるよ
0121デフォルトの名無しさん
2008/05/26(月) 14:08:03http://science6.2ch.net/test/read.cgi/informatics/1160740645/
012236 ◆K0BqlCB3.k
2008/05/26(月) 15:31:05arrow使ってていつも思うんだが、並列処理に向いてなくない?
FPGAとかのHDL記述とかに応用したりしてる人いないの?
0123デフォルトの名無しさん
2008/05/26(月) 22:01:15若いうちに読んどいた方がいいのは計算理論の基礎 の方だろ。
計算機プログラムの構造と解釈は仕事で必要になってからで十分。
0124デフォルトの名無しさん
2008/05/26(月) 22:17:09独学でやってしまった奴は
次何すればいいの?
とりあえず今自習でλの数学側の
側面勉強してみているが
何の役に立つかわからん
0125デフォルトの名無しさん
2008/05/26(月) 22:24:27http://d.hatena.ne.jp/m-hiyama/20070220/1171956186
0126デフォルトの名無しさん
2008/05/26(月) 22:27:23むしろ、次に述べるようなことがより大きな動機となります。
まず、関数を表現する方法としてのラムダ記法(lambda notation)に慣れて、紙と鉛筆によるインフォーマルなラムダ計算が出来ると、
けっこうそれを使える場面が多いのです。例えば、「JavaScriptによるテンプレート・モナド、すっげー簡単!」の最後で、モナド法則を示すために、
インフォーマルなラムダ計算を使っています。
ある種の計算的実体(例:クロージャ)や計算手法(例:継続ベースの計算)の説明にもラムダ式がよく使われます。
式言語(EL; expression language)に対する処理系(パーザーやエバリュエータ)を作る場合なども、ラムダ計算が良いヒントになるでしょう。
もちろんラムダ計算は、既存の関数型言語を理解する基盤となります。あるいは、新しいプログラミング言語を設計する際にもラムダ計算が規範になるかも知れません。
0127デフォルトの名無しさん
2008/05/26(月) 22:45:040128デフォルトの名無しさん
2008/05/26(月) 23:36:500129デフォルトの名無しさん
2008/05/27(火) 00:14:010130デフォルトの名無しさん
2008/05/27(火) 07:23:35という定義で自然数(0以上の整数)が表現できる。(ペアノの公理を満たす)
このとき S のことを後者関数(successor function)と呼ぶ。
0131デフォルトの名無しさん
2008/05/27(火) 11:39:43定義に再帰を使っていいんですか?
とか聞くとYコンビネータとか出てきちゃうんだろうか
0132デフォルトの名無しさん
2008/05/27(火) 16:49:17yampaっていったい何ですか?
ごく簡単に馬鹿でもわかるように概要を説明してください
0133デフォルトの名無しさん
2008/05/27(火) 19:16:35http://d.hatena.ne.jp/propella/20070315/p1
なんかどうよ。
0134デフォルトの名無しさん
2008/05/27(火) 20:06:04http://ll.jus.or.jp/llw2004/program/Reactive.pdf
5ページ目
Haskell による Arrowised Functional Reactive
Programming という実装
0135デフォルトの名無しさん
2008/05/27(火) 22:54:500136デフォルトの名無しさん
2008/05/28(水) 07:20:03その他良本情報はこちら
ttp://www.kurims.kyoto-u.ac.jp/~hassei/reading_list.html
0137デフォルトの名無しさん
2008/05/31(土) 11:55:19ファイルってどこかに落ちてませんかね。
0138デフォルトの名無しさん
2008/05/31(土) 13:59:28ttp://www.haskell.org/soe/software1.htm
0139デフォルトの名無しさん
2008/05/31(土) 14:22:28あ、これってグラフィックライブラリだけじゃなくて、本のコードも
入ってるのか。勘違いしてた。ありがとう。
0140デフォルトの名無しさん
2008/05/31(土) 20:44:19このときの
Maybe a -> (a -> Maybe b) ここまでが入力だよね?
2項目の引数が関数になっているって解釈でいいんだよね?
0141デフォルトの名無しさん
2008/05/31(土) 21:04:280142デフォルトの名無しさん
2008/05/31(土) 21:41:20入力 : Maybe a
出力 : (a -> Maybe b) -> Maybe b
0143デフォルトの名無しさん
2008/05/31(土) 21:51:450144デフォルトの名無しさん
2008/05/31(土) 21:52:57同じことじゃねーか
関数を返す関数と二引数の関数を同一視するのはHaskellでは普通の習慣
0145デフォルトの名無しさん
2008/05/31(土) 22:22:38a -> Maybe b
っていう関数を引数にとるっていうことだよ
0146初心者修業中
2008/05/31(土) 22:30:19Maybe a -> (a -> Maybe b) の2つを入力とする事もできるし、
Maybe a だけを入力とする事もできる。
後者の場合は(a -> Maybe b) -> Maybe bの関数が出力となる。
これを部分適用といい、こういった事ができるのが
Haskellの魅力である。
…と認識しています。
0147デフォルトの名無しさん
2008/05/31(土) 22:31:41えっとねそれじゃあ
Maybe aと関数を引数に取るために
(a -> Maybe b)、この2つを与えてますよね?
関数渡すためにこう記述するしか方法がないから
そのようになっていると理解したてみたのですが
どうやら上の人曰く間違っているようで何が違うのでしょうか
Haskellはグラフ簡約によって1度に1つのTermを解釈していくだけ
なので、最終的な結果は高々1つになるはずだと思っていたのですが
どうやら違うようで混乱してきました。困った、不勉強だ困った
0148デフォルトの名無しさん
2008/05/31(土) 22:38:00右結合の二項演算子?である「->」の結合順序をデフォルトから変更している。
A -> B -> C -> D
は、「->」が右結合の二項演算子?であるがゆえに、
A -> (B -> (C -> D))
と解釈される。
A -> (B -> C) -> D
は、
A -> ((B -> C) -> D)
と解釈される。
0149デフォルトの名無しさん
2008/05/31(土) 22:39:34>どうやら上の人曰く間違っているようで
間違ってないよ
0150デフォルトの名無しさん
2008/05/31(土) 22:55:51> Haskellはグラフ簡約によって1度に1つのTermを解釈していくだけ
> なので、最終的な結果は高々1つになるはずだと思っていたのですが
> どうやら違うようで混乱してきました。困った、不勉強だ困った
型の問題と適用の問題が、頭のなかでうまく区別が付いていないのでは?
適用される関数はA -> (B -> C) -> D型で変化はないけど、
* A型の「値」に適用すると、(B -> C) -> D型の「値」(関数)が帰ってくる。
* A型の「値」と、 (B -> C)型の「値」(関数)の2引数に適用すると、D型の「値」が帰ってくる。
このように考えてはどうか。
これで納得できなければ、やっぱり単純に、
A -> (B -> C) -> D型は、A型の値をとって、(B -> C) -> D型の値を返す関数の「型」
という出発点に戻るべきかな。
0151デフォルトの名無しさん
2008/05/31(土) 22:56:33> Maybe a -> (a -> Maybe b) ここまでが入力だよね?
の部分。
> 2項目の引数が関数になっているって解釈でいいんだよね?
こっちは合ってる。
0152デフォルトの名無しさん
2008/05/31(土) 23:54:09↓ではお願いします。
0153デフォルトの名無しさん
2008/05/31(土) 23:58:340154初心者修業中
2008/06/01(日) 01:08:22複数の引数を持つ関数を
引数一つの関数の組み合せとする事。
…と認識しています。
0155デフォルトの名無しさん
2008/06/01(日) 01:08:36「カリンカカリンカ カリンカマヤ」という歌が繰り返されて止まらなくなる。
0156デフォルトの名無しさん
2008/06/01(日) 01:54:38でも、カリー化ときいてターメリックをぶっかけてるイメージしかないw
0157デフォルトの名無しさん
2008/06/01(日) 09:01:040158デフォルトの名無しさん
2008/06/01(日) 10:27:150159デフォルトの名無しさん
2008/06/01(日) 10:28:140160デフォルトの名無しさん
2008/06/01(日) 10:59:26A -> (B -> C)
というふうに切り出してしまったけど、これは本来の
A → ((B → C) → D)
という結合関係を無視してる(「A -> (B -> C)」という型を扱うみたいに書いている)。
ってのが>>142でしょ。
カリー化の影響として、「複数の引数をとる」
(A × (B → C)) → D
ことと、「関数を返す」ことの、どちらに主眼があるかが不明瞭になるってのがあると思うね。
0161デフォルトの名無しさん
2008/06/01(日) 11:24:29その理屈は分かるんだが、カリー化を理解してるのか怪しい初心者に対して
混乱させるようなことを言うのは不親切だと思う
Maybe aと(a -> Maybe b)の二つが引数になっているという理解で正しい、と教えれば十分じゃないか
0162デフォルトの名無しさん
2008/06/01(日) 11:29:36f : A×B×C→Y
f a b c = ((f a) b) c = y
(((f a) b) c) : Y
((f a) b) : C→Y
(f a) : B→(C→Y)
f : A→(B→(C→Y))
0163デフォルトの名無しさん
2008/06/01(日) 11:48:09「ここまでが引数リストに対応する部分だよね?」と読むと○
「ここまでが引数の型だよね?」と読むと× ← ちょっと窮屈な解釈かも、みたいな空気
0164デフォルトの名無しさん
2008/06/01(日) 15:19:49と書けばおk
0165デフォルトの名無しさん
2008/06/01(日) 17:10:160166デフォルトの名無しさん
2008/06/01(日) 23:06:520167デフォルトの名無しさん
2008/06/01(日) 23:33:450168デフォルトの名無しさん
2008/06/01(日) 23:44:14=>
これがよくわからん
0169デフォルトの名無しさん
2008/06/01(日) 23:47:320170デフォルトの名無しさん
2008/06/02(月) 00:31:270171初心者修業中
2008/06/02(月) 01:36:10:は、リストの先頭に要素を結合する演算子
=>の左辺(文脈)は、
多相的なデータを静的型チェックするために
コンパイラに与える条件
…と認識しています。
0172OCamler
2008/06/03(火) 22:55:070173デフォルトの名無しさん
2008/06/04(水) 01:51:131 : [2, 3]
1 : 2 : [3]
1 : 2 : 3 : [] ← 本来のデータ構築子 (:)(cons)、[](nil)で書く(ただし、いまいちリストに見えない)
1 : (2 : (3 : [])) ← 右結合性にたよらないで書く
(:) 1 ((:) 2 ((:) 3 [])) ← 演算子としての表記法をやめる(S式マゾ以外には読みにくい)
0174初心者修業中
2008/06/04(水) 01:51:200175デフォルトの名無しさん
2008/06/04(水) 03:18:52>>168
4.1 Overview of Types and Classes
> but the type system has been extended with type classes (or just classes)
> that provide a structured way to introduce overloaded functions.
型クラスの存在意義がわかるかどうかだと思う。
整数の足し算と有理数の足し算って、ふつう同じ記号を使うけど、
計算の内容は違う(多重定義、オーバーロードされている)でしょ。
でも、共通の性質を考えたいときもある。
そのとき、ただ「共通の演算記号+を使っているから同類とみなす」では話にならないから、
twice :: a -> a
twice x = x + x -- 2倍したいけど、+の型などがコンパイル時に不明
+を「Numという型クラスの特徴」として整理して、整数や有理数はその特徴を共有している、とみなすと。
twice :: Num a => a -> a -- 「型aはクラスNumに属する(Numのインスタンスである)」という前提をする
twice x = x + x -- と、演算子+の存在と型が保証される
そんな感じ?(ごめん、確認してない)
0176デフォルトの名無しさん
2008/06/04(水) 07:01:52すまぬ
0177デフォルトの名無しさん
2008/06/05(木) 00:09:02C++のテンプレートの特殊化みたいなものか
演算子は定義されているけど特定の型じゃないと
処理できない場合、特定のの変数を特殊化すること
あるけど
0179デフォルトの名無しさん
2008/06/05(木) 08:24:10メジャーになった証か
0180デフォルトの名無しさん
2008/06/05(木) 08:41:12質問、というより興味本位のアンケート。
あなたが思うhaskellの面白いところってどこですか?
0181デフォルトの名無しさん
2008/06/05(木) 09:05:560182デフォルトの名無しさん
2008/06/05(木) 16:59:32記号を多用してたり、インデントを使ってたり
0183デフォルトの名無しさん
2008/06/05(木) 18:54:010184デフォルトの名無しさん
2008/06/05(木) 19:19:05高速化を考え出すと、すごくたいへんなところ。
0185デフォルトの名無しさん
2008/06/05(木) 21:02:040186デフォルトの名無しさん
2008/06/05(木) 21:59:49このスレ見てたらそう思えんわな、、、
0187デフォルトの名無しさん
2008/06/05(木) 22:55:55しかしいい言語だ
0188デフォルトの名無しさん
2008/06/05(木) 23:02:27かなり野心的な言語設計になるね。
クラス囲い込み度が低いからだろうか。
0189デフォルトの名無しさん
2008/06/05(木) 23:56:07そんなのできたの!?と思って ghci で試したらできなかった。
ちょっと悲しくなった。
0190デフォルトの名無しさん
2008/06/06(金) 00:00:22エラーでていらつく
なんとかならんのかね?この糞言語
インデント制約糞なら最初からなんか
そういう機能入れろよなぁ
あーあー世界で最悪の糞言語だね
インデントのせいだけで
0191デフォルトの名無しさん
2008/06/06(金) 00:12:41そういう説もあります。
そうでないという説もあります。
0192デフォルトの名無しさん
2008/06/06(金) 00:29:14一緒だよ
0193デフォルトの名無しさん
2008/06/06(金) 00:37:44教えてくれませんか?
qsort _ [] = [] (1)
qsort f (x:xs) = before ++ (x : after) (2)
where before = qsort f (filter (not . (f x)) xs) (3)
after = qsort f (filter (f x) xs) (4)
どこにいれればいいのやらw
0194デフォルトの名無しさん
2008/06/06(金) 03:41:000195初心者修業中
2008/06/06(金) 05:35:07私はまだtraceに手を出すつもりはありませんが、
ググってみました。
参考になるでしょうか…?
↓
第15回 Haskellでのデバッグのコツをつかむ
ttp://itpro.nikkeibp.co.jp/article/COLUMN/20071204/288630/?P=2
import Debug.Trace
quicksort[] = []
quicksort(x:xs) =
trace ("x." ++ show x) $
trace ("x." ++ show x ++ " > y." ++ show losort) $
trace ("x." ++ show x ++ " <= y." ++ show hisort) $
losort ++ [x] ++ hisort
where
losort = quicksort [y|y <- xs, y < x]
hisort = quicksort [y|y <- xs, y >= x]
Main> quicksort [3,2..1]
x.3
x.2
x.1
x.1 > y.[]
x.1 <= y.[]
x.2 > y.[1]
x.2 <= y.[]
x.3 > y.[1,2]
x.3 <= y.[]
[1,2,3]
0196デフォルトの名無しさん
2008/06/06(金) 07:41:250197初心者修業中
2008/06/06(金) 08:06:28これ、やってみたけど止まりませんね…。
*Main> take 10 [(x,y)|x<-[0..],y<-[0..],(x+y)==10]
[(0,10)
x=0 のままyの無限リストを検索してるから当たり前ですけど…
*Main> take 10 [(x,y)|x<-[0..],y<-[0..]]
[(0,0),(0,1),(0,2),(0,3),(0,4),(0,5),(0,6),(0,7),(0,8),(0,9)]
↓みたいなリストを返す簡単な方法ありますかね…?
[(0,0),(1,0),(0,1),(2,0),(1,1),(0,2).....]
0198初心者修業中
2008/06/06(金) 08:42:12tlist::[(Int,Int)]
tlist = concatMap (\n ->f n) [0..]
where f = \n->take (n+1) $ iterate (\(x,y) ->(x-1,y+1)) (n,0)
*Main> take 10 tlist
[(0,0),(1,0),(0,1),(2,0),(1,1),(0,2),(3,0),(2,1),(1,2),(0,3)]
*Main> take 10 [(x,y)| (x,y)<-tlist, (x+y)==10]
[(10,0),(9,1),(8,2),(7,3),(6,4),(5,5),(4,6),(3,7),(2,8),(1,9)]
0199デフォルトの名無しさん
2008/06/06(金) 08:43:25[(x,y) | k <- [0..], x <- [0..k], y <- [0..k], x + y == k]
0200デフォルトの名無しさん
2008/06/06(金) 08:52:37[(x, 10-x) | x <- [0..10]]
0201デフォルトの名無しさん
2008/06/06(金) 08:54:12間違ってるやん!
0202デフォルトの名無しさん
2008/06/06(金) 09:51:55こんなんできたっけ
0203デフォルトの名無しさん
2008/06/06(金) 09:52:480204デフォルトの名無しさん
2008/06/06(金) 10:16:24Pythonに見られるインデントによる制御構造の是非
http://pc11.2ch.net/test/read.cgi/tech/1169473442/l50
0205初心者修業中
2008/06/06(金) 14:27:09なるほど、そういう事もできるのですね。
*Main> take 12 [t | x <- [0..], y <- [0..x], (x+y)==10, t<-[(x,y),(y,x)]]
[(5,5),(5,5),(6,4),(4,6),(7,3),(3,7),(8,2),(2,8),(9,1),(1,9),(10,0),(0,10)]
リストモナドの>>=はconcatMapでしたもんね。
勉強になります。
(5,5),(5,5)がだぶってるのが、おしいですね。
0206デフォルトの名無しさん
2008/06/06(金) 15:16:520207デフォルトの名無しさん
2008/06/06(金) 18:05:51作って公開してくれ。
0208デフォルトの名無しさん
2008/06/07(土) 00:31:440209デフォルトの名無しさん
2008/06/07(土) 00:52:24名前をつけるまでもない単純な関数を作る時に便利
0210デフォルトの名無しさん
2008/06/07(土) 01:08:37名前よりも式そのもののほうが理解しやすい場合もある
0211デフォルトの名無しさん
2008/06/07(土) 01:24:35こういうのに名前つけるのはいやだな
0212デフォルトの名無しさん
2008/06/07(土) 02:04:23そういう話題は関数型言語スレのほうが向いている。
関数型言語一般について語れるよ。
0213デフォルトの名無しさん
2008/06/07(土) 02:12:55どんなバックグラウンドをもってる?関数型言語についての経験は?
手続き型の国の人ならば、わかりにくいところやね。
関数を変数でもたすってのは関数型では日常茶飯事なんですわ。
そこに便利さのヒントがアルよ。
0214デフォルトの名無しさん
2008/06/07(土) 07:57:490215デフォルトの名無しさん
2008/06/07(土) 10:56:31手続きの国からワープしてきたのですが
関数を変数にするならポインタ渡せばよくないですか?
そうすれば、定義しても渡せますよね?
0216デフォルトの名無しさん
2008/06/07(土) 11:20:46関数オブジェクトは、メソッドがひとつしかないクラスのインスタンス、に似ています
インスタンスに名前がついているとは限らないのです
0217デフォルトの名無しさん
2008/06/07(土) 11:33:06よくわからないぉ
もう少し詳しく説明してぉ?
0218デフォルトの名無しさん
2008/06/07(土) 11:43:320219デフォルトの名無しさん
2008/06/07(土) 11:46:43間違えただけだぉ気にしないで
0220デフォルトの名無しさん
2008/06/07(土) 11:47:44悟りは得るものではなく開くものです。
0221デフォルトの名無しさん
2008/06/07(土) 12:06:14再利用しない
定義している箇所を探すのが面倒くさい
関数内部の処理が簡潔
のときは無名関数使いたくならないか?
0222デフォルトの名無しさん
2008/06/07(土) 12:14:340223デフォルトの名無しさん
2008/06/07(土) 12:28:02(new Satori(x)).open(y)
0224デフォルトの名無しさん
2008/06/07(土) 12:43:21たとえば、
f n = if n == 1 then 1 else n * f (n-1)
はどのように書けばいいですか?
0225デフォルトの名無しさん
2008/06/07(土) 12:46:45むみょーん。Haskellian じゃないから fix があるかどうかシラネ
0226デフォルトの名無しさん
2008/06/07(土) 12:49:20(\f -> f f) (\f n -> if n == 1 then 1 else n * f f (n-1))
0227デフォルトの名無しさん
2008/06/07(土) 12:54:260228デフォルトの名無しさん
2008/06/07(土) 13:11:01ここはHaskellのスレですよ
0229初心者修業中
2008/06/07(土) 13:17:55Control.Monad.Fix にありますね。
fix :: (a -> a) -> a
fix f = let x = f x in x
0230デフォルトの名無しさん
2008/06/07(土) 13:22:40不動点演算のfixを使うようです。
Prelude> Control.Monad.Fix.fix(\f n -> if n == 1 then 1 else n * f (n-1)) 5
120
0231デフォルトの名無しさん
2008/06/07(土) 14:00:440232デフォルトの名無しさん
2008/06/07(土) 14:16:56... f ...
where f n = if n == 1 then 1 else n * f (n-1)
局所的な関数定義で代わりになるんじゃないの、というのはダメかな
0233デフォルトの名無しさん
2008/06/07(土) 16:01:170234デフォルトの名無しさん
2008/06/07(土) 16:19:360235デフォルトの名無しさん
2008/06/07(土) 16:37:58こうかー
0236デフォルトの名無しさん
2008/06/07(土) 17:21:15whereが作るのは式じゃなくて節だから使える場所が決まってる(定義の後とかcase選択肢の後とか)
... (let f n = if n == 1 then 1 else n * f (n-1)) in f) ...
ならおk
0237デフォルトの名無しさん
2008/06/07(土) 17:22:54... (let f n = if n == 1 then 1 else n * f (n-1) in f) ...
0238デフォルトの名無しさん
2008/06/09(月) 21:46:25この本の解答集のようなもの、ネットには無いでしょうか。
http://www.elbeno.com/haskell_soe_blog/
↑このページは参照してますけど、11章までなので、全部が
まとまったのがあると嬉しいです。
0239デフォルトの名無しさん
2008/06/16(月) 14:44:56Haskellでは原理的にどんな関数でもポイントフリースタイルに
変形可能なのでしょうか。
0240デフォルトの名無しさん
2008/06/16(月) 15:00:340241デフォルトの名無しさん
2008/06/16(月) 18:48:23Sコンビネータとかもポイントフリーに出来るんだっけか?
0242デフォルトの名無しさん
2008/06/16(月) 18:52:01>>241
Control.Monad.ap :: (Monad m) => m (a -> b) -> m a -> m b
を(->) rモナドについて使えば、Sコンビネータそのもの
0243デフォルトの名無しさん
2008/06/17(火) 22:58:00何が自由なの?
0244デフォルトの名無しさん
2008/06/17(火) 23:28:00ポイントフリースタイル = ポイントを使わない関数定義
0245デフォルトの名無しさん
2008/06/18(水) 00:11:23これって未だによくわからないけど
手計算できそうな実例ないですか?
0246デフォルトの名無しさん
2008/06/18(水) 00:28:46f :: Monad m => m (a -> b) -> m a -> m b
f mg mx = do { g <- mg; x <- mx; return $ g x }
test1 = f Nothing (Just 1)
test2 = f (Just succ) (Just 2)
test3 = f (Just id) Nothing
test4 = f [] []
test5 = f [id] [5]
test6 = f [id, succ, (* 2)] [6, 9]
0247デフォルトの名無しさん
2008/06/18(水) 09:12:380248デフォルトの名無しさん
2008/06/18(水) 11:53:170249デフォルトの名無しさん
2008/06/18(水) 14:40:13initial object(始対象)じゃなくて terminal object(始対象)だお。
集合の圏で terminal object からの arrow というと一点集合に相当する。
集合の圏では任意の一点集合 x に対して f x = g x ならば f = g
「point(一点集合)を使わずに関数が等しいことを表現できる」=>「ポイントフリー」ということだと思う。
0250デフォルトの名無しさん
2008/06/18(水) 18:25:28失礼、書き間違えた。
terminal object(終対象)だな。
0251249
2008/06/18(水) 18:26:24○ terminal object(終対象)
だった。
0252デフォルトの名無しさん
2008/06/20(金) 11:33:25気がついたらポイントフリースタイルで5行も書いてたぜ
これはもはや関数型スパゲッティだな
0253デフォルトの名無しさん
2008/06/20(金) 12:48:07実際に適当なλ式で変換してみたら出てきた式はとても読める
代物ではなかったのを思い出した
0254デフォルトの名無しさん
2008/06/20(金) 15:00:420255デフォルトの名無しさん
2008/06/20(金) 18:06:18SKコンビネータも、名前付きにできると若干読みやすそうだけど。
っていうか、それが出来たら、どんな高級言語とも変らんという話になって、逆に面白さがないか。
0256デフォルトの名無しさん
2008/06/20(金) 19:22:12そこでunlambdaですよ!
0257デフォルトの名無しさん
2008/06/21(土) 00:27:42つ super combinator
0258デフォルトの名無しさん
2008/06/22(日) 17:45:00f [] = []
f (_:[]) = []
f (x:xs) = (x, head xs) : f xs
0259デフォルトの名無しさん
2008/06/22(日) 17:52:530260デフォルトの名無しさん
2008/06/22(日) 18:05:140261デフォルトの名無しさん
2008/06/23(月) 18:15:270262261
2008/06/23(月) 19:03:55f xs = zip xs (drop 1 xs)
0263デフォルトの名無しさん
2008/06/23(月) 19:21:38らしいから>>260と>>261は等価かな
こういうのを意識しないといけない場面だと非正格性が気持ち悪い
0264デフォルトの名無しさん
2008/06/24(火) 00:09:28⊥って勃起してるのw?
0265デフォルトの名無しさん
2008/06/24(火) 01:03:130266デフォルトの名無しさん
2008/06/24(火) 06:18:25でも
zip (tail xs) xs
と
zip (drop 1 xs) xs
は等価じゃない
つまり、zipでは第一引数が先に評価されるということを覚えていないといけない分、ややこしい
(厳密には評価順の問題じゃなくて「zipは第一引数について正格で第二引数について非正格」ということだけど)
0267デフォルトの名無しさん
2008/06/24(火) 07:48:57例えば
f (x1 : x2 : x3 : xs) -> x1 + x3
だったら、引数のリストの最初の要素と3番目の要素について正格ってこと?
0268デフォルトの名無しさん
2008/06/24(火) 08:32:09そういうつもりで「正格」という言葉を使った
0269初心者修業中
2008/06/24(火) 09:53:02どうしても括弧が増えて見ぐさい気が…。
こんなのがあったら便利だと思うんですけど、
↓
infixr 1 $.
($.)=(.)
こんな感じ
↓
sigma = tail $. scanl (+) 0
標準ではなさそうなんですが、
やっぱ、問題ありですかね?
0270デフォルトの名無しさん
2008/06/24(火) 09:55:220271初心者修業中
2008/06/24(火) 10:13:14関数の優先順位はどの演算子よりも上ですね。
これで問題ないのか
↓
sigma = tail . scanl (+) 0
>>270
レスありがとうございます。
早く慣れたいです。
まだ、頭で考えないとよくわからない。
(考えてもわからない時ありw)
0272デフォルトの名無しさん
2008/06/24(火) 11:35:10「厳密には」も何も最初っからそう
0273デフォルトの名無しさん
2008/06/24(火) 12:56:24> 覚えていないといけない
覚えてなくてもプログラム書くのにはなにも困らない。
等価性とか考えだすと全部正格のほうが楽かもしれんけど。
0274デフォルトの名無しさん
2008/06/24(火) 18:49:23書くときは良くても読むとき困る
例えば>>260のコードが空リストに対しても正しく動作するかどうか確かめるのに、
いちいちPreludeの仕様を読まないといけない
zipみたいに明確な定義のある関数ならまだいいけど、
例えばhPutStrLn undefined ""の値が
1. ⊥
2. 実行時にエラーになるアクション
3. ()を返すアクション
のどれになるかは仕様では決まっていないはずで、ちょっと厄介
0275デフォルトの名無しさん
2008/06/25(水) 15:42:16その辺は想像で読めば十分じゃない?
zip xs (tail xs) とあって、
コードを書いたのが信頼できる人なら、
zip は第二引数について非正格なのだろうな、とか。
hPutStr undefined "" も、
hPutStr _ "" = return () と定義されては無いだろうし、
undefined が正しいハンドルじゃないからと
hPutStr が独自にエラーを出すというのも、
先に undefined が評価されるから有り得ないだろう、とか。
hPutStr (error "1") (error "2") にしても error "1" だろう、とか。
0276デフォルトの名無しさん
2008/06/25(水) 15:49:330277デフォルトの名無しさん
2008/06/25(水) 17:38:53main「ちょっと undefined に "" 出力してこい」
hPutStrLn「へい」
...数十ns後
hPutStrLn「やってきやした」
main「おまwwww改行どうしたwwwwwwww」
>>276
正直くだらないネタ以外はここではなく他の所に書く。
0278デフォルトの名無しさん
2008/06/25(水) 18:27:02HaskellでGPGPU関連の話題ってありませんか?
0279274
2008/06/25(水) 20:23:02>>275
>コードを書いたのが信頼できる人なら、
勉強のためにコードを読んでるならいいけど、
レビューとかデバッグとかしてるならそうはいかないだろ
>hPutStr が独自にエラーを出すというのも、
誤解させたかもしれんが、HugsもGHCも2.の振る舞いをする
実行した時点でundefinedが評価されてエラー発生ね
でも、例えば最適化のために
hPutStr h s = seq h $ ...
みたいな実装になってたら1.だし、
hPutStr h s = mapM_ (hPutChar h) s
みたいな定義が考えられる以上3.もあり得なくはない
結局、非正格がデフォルトなせいで関数の仕様に書かなければいけない事項が多いのが問題
それを不用意にうやむやにすると関数の振る舞いが実装に依存してしまう
それほど頻繁に問題になることではないけど、たまに面倒
0280275
2008/06/25(水) 21:28:51> レビューとかデバッグとかしてるならそうはいかないだろ
うん。
> hPutStr h s = mapM_ (hPutChar h) s
> みたいな定義が考えられる以上3.もあり得なくはない
なるほど。
> それほど頻繁に問題になることではないけど、たまに面倒
そういうこったね。
0281275
2008/06/25(水) 21:32:14> 実行した時点でundefinedが評価されてエラー発生ね
そういうつもりでしたか。
ちなみにそれだと1.はどういうつもりだったのですか?
0282デフォルトの名無しさん
2008/06/25(水) 21:49:44hPutStr undefined "" `seq` 0
を評価してエラーが発生すれば1.だよな
実際試したらHugsでもGHCiでもエラーは発生しなかった
0284デフォルトの名無しさん
2008/06/26(木) 21:37:05比較的新しい技法についてわかりやすく書かれた文書はどの辺
でしょうか。
0285デフォルトの名無しさん
2008/06/26(木) 23:11:250286デフォルトの名無しさん
2008/06/26(木) 23:16:360287デフォルトの名無しさん
2008/06/26(木) 23:28:26プログラミング的にはこれといってメリットないよ。
0288デフォルトの名無しさん
2008/06/27(金) 00:23:45http://www.haskell.org/haskellwiki/Arrow
0289デフォルトの名無しさん
2008/06/28(土) 00:05:34めっちゃべんりですっっっっs
0290デフォルトの名無しさん
2008/06/28(土) 01:15:420291デフォルトの名無しさん
2008/06/28(土) 01:22:400292デフォルトの名無しさん
2008/06/28(土) 10:42:430293デフォルトの名無しさん
2008/06/28(土) 10:48:09eclipseは糞だし。
0294デフォルトの名無しさん
2008/06/28(土) 11:10:100295デフォルトの名無しさん
2008/06/28(土) 11:45:120296デフォルトの名無しさん
2008/06/28(土) 12:32:37自分もEclipseはちょっと嫌ですねぇ。
0297デフォルトの名無しさん
2008/06/28(土) 12:44:03$ hugs -Evim
0298デフォルトの名無しさん
2008/06/28(土) 16:06:10結合性宣言があったりするので、
トークン読んだ時点では構文木を作れないような気がするんだけど。
何かの資料とか、HugsやGHCでの実現方法のソースとかあったら教えてくだしあ
0299デフォルトの名無しさん
2008/06/28(土) 16:38:24GHCはとりあえず全部左結合として解析(parser/Parse.y)して、
後のrenameのパスで結合性宣言をもとに組み立て直してる(rename/RnExpr.lhs)
0300デフォルトの名無しさん
2008/06/28(土) 16:57:55俺もvimだわ
なんか文法と相性良さげだし
0301デフォルトの名無しさん
2008/06/28(土) 17:16:47そういう手があったか。いや、全然関係ないパーサを先日作ってたんだが。
パス(1パスコンパイラとか2パスコンパイラとかのパス)にこだわっていては
非富豪的かねぇ。
0302デフォルトの名無しさん
2008/06/28(土) 18:10:34とりあえずリンクトリストにしといてから、
あとでパーズしなおすって事。
0303デフォルトの名無しさん
2008/06/28(土) 18:39:000304デフォルトの名無しさん
2008/06/28(土) 20:10:12どうなってんだ糞
0305デフォルトの名無しさん
2008/06/28(土) 20:19:06グラフの研究で路線データ(や道路のデータなど)が使いたいのですが、
そういうデータを手に入れるにはどうすればいいですか?
0306デフォルトの名無しさん
2008/06/28(土) 21:47:48質問です
Haskellと関係ありますか?
0308デフォルトの名無しさん
2008/06/29(日) 08:23:280309デフォルトの名無しさん
2008/07/01(火) 18:44:49http://www.amazon.co.jp/Real-World-Haskell-Bryan-OSullivan/dp/0596514980/
> This easy-to-use, fast-moving tutorial introduces you to functional
> programming with Haskell. Learn how to use Haskell in a variety of
> practical ways, whether it's for short, script-like programs or large
> and demanding applications.
0310デフォルトの名無しさん
2008/07/02(水) 02:44:41http://book.realworldhaskell.org/beta/
表紙が決まったんだね。ヘラクレスオオカブト?
0311デフォルトの名無しさん
2008/07/02(水) 03:40:510312デフォルトの名無しさん
2008/07/02(水) 22:40:44そう思っていた時期が僕にもありました
0313デフォルトの名無しさん
2008/07/02(水) 23:40:42ちょおまw
0314デフォルトの名無しさん
2008/07/04(金) 04:55:50全30章中残りは3章。
20. The foreign function interface
27. Profiling and tuning for performance
30. A concurrent RESTful web application
書きにくそうなのが残った感じw
0315デフォルトの名無しさん
2008/07/09(水) 08:14:010316デフォルトの名無しさん
2008/07/09(水) 12:30:550317デフォルトの名無しさん
2008/07/09(水) 22:36:35らむだけいさんってなんですか?
0318デフォルトの名無しさん
2008/07/09(水) 23:38:520319デフォルトの名無しさん
2008/07/09(水) 23:44:400320デフォルトの名無しさん
2008/07/10(木) 05:32:310321デフォルトの名無しさん
2008/07/10(木) 16:58:13032236 ◆K0BqlCB3.k
2008/07/11(金) 01:58:31とっとと仕事しろやボケ
0323デフォルトの名無しさん
2008/07/11(金) 09:38:420324デフォルトの名無しさん
2008/07/11(金) 10:04:210325デフォルトの名無しさん
2008/07/11(金) 16:03:12なにエラソーに言ってんだよ。しょーもない評論家なくせして。
0326デフォルトの名無しさん
2008/07/19(土) 00:59:560327デフォルトの名無しさん
2008/07/20(日) 23:31:18'aとか''aとか出てきますが
どのような意味なのでしょうか
0328デフォルトの名無しさん
2008/07/21(月) 01:16:27具体的なコード書いてみて
0329デフォルトの名無しさん
2008/07/21(月) 15:09:50a'とかa''じゃなくて?
ちなみにそれならただの変数名だよ。
0330デフォルトの名無しさん
2008/07/21(月) 15:13:03見直したらそうでした
許してくださいw
ごめんなさい
0331デフォルトの名無しさん
2008/07/21(月) 23:32:45この\_ってC++のtemplate <t>みたいなもんですか?
0332デフォルトの名無しさん
2008/07/21(月) 23:38:070333デフォルトの名無しさん
2008/07/21(月) 23:43:54じゃあ何なのでしょうか?
0334デフォルトの名無しさん
2008/07/21(月) 23:55:35ていうかなんか一冊入門書買うことをおすすめする
0335デフォルトの名無しさん
2008/07/22(火) 01:00:320336デフォルトの名無しさん
2008/07/22(火) 01:40:52Haskellでぐぐっていくつか読めばわかるぐらいのことで
これって型でしょ
違います
じゃあなんなんだよ
つ やさしいHaskell入門
0337デフォルトの名無しさん
2008/07/26(土) 19:44:300338デフォルトの名無しさん
2008/07/26(土) 20:22:33怖くね?
0339デフォルトの名無しさん
2008/07/27(日) 01:34:240340デフォルトの名無しさん
2008/07/27(日) 02:01:40向こうで完結して。
034136 ◆K0BqlCB3.k
2008/07/27(日) 02:23:520342デフォルトの名無しさん
2008/07/27(日) 10:47:30他のスレを荒らすならここを荒らしますよ?
0343デフォルトの名無しさん
2008/07/27(日) 12:10:53ほー、やってみてください。本当にできるのですか?
0344デフォルトの名無しさん
2008/07/27(日) 13:11:28A 「この夏、何かおもしろいことでもしようかな。」
B 「ならスレ荒らししてみれば?」
A 「簡単にできるのですか?」
B 「こうやれば邯鄲」
A 「ネ申キター!d!マジ面白いね。他スレ荒らしてクルーwktk」
0345デフォルトの名無しさん
2008/08/06(水) 05:48:39ttp://ascii.jp/elem/000/000/157/157495/
0346デフォルトの名無しさん
2008/08/06(水) 06:00:24面白かった。サンクス。
0347デフォルトの名無しさん
2008/08/06(水) 19:32:590348デフォルトの名無しさん
2008/08/06(水) 20:30:02nobsunだね。
0349デフォルトの名無しさん
2008/08/06(水) 20:47:230350デフォルトの名無しさん
2008/08/06(水) 22:06:03山下さんなんかがいるってことは特殊な会社?
Haskellの開発コンサルということだけど、一般企業の業務システム
なんかを対象にしてるのかな。金融系とか合ってそうだけど、
普通の土方システムには豚に真珠かな。
0351デフォルトの名無しさん
2008/08/06(水) 22:30:36看板役みたいなものだよ。
よくあること。
SRAでも青木淳みたいなのを雇っているけど、青木は普通の仕事はしていないね。
金にならないことを自由にやっているって感じ。
ちなみに、青木の部下はかわいい女の子限定。
0352デフォルトの名無しさん
2008/08/07(木) 05:56:030353デフォルトの名無しさん
2008/08/07(木) 07:30:34青木はSRAやめたよ
0354デフォルトの名無しさん
2008/08/07(木) 08:39:56会社の事業だけ見ると、Haskell関係なさそうだね。Higher Order Programmingってなんだ?造語か?
もっと記事をよく見てみる。
0355デフォルトの名無しさん
2008/08/07(木) 08:55:02ちょ、おまwww
0356デフォルトの名無しさん
2008/08/07(木) 09:12:130357デフォルトの名無しさん
2008/08/07(木) 09:45:570358デフォルトの名無しさん
2008/08/07(木) 12:53:37あそこって、gaucheかんけいなひとがおおそうなんだけど。
0359デフォルトの名無しさん
2008/08/07(木) 12:58:00そりゃそうだ。普通のJaverやC++マが金を取ってこなきゃ、
みんなgaucheとかに走ったら誰が食い扶持を稼ぐんだって。
0360デフォルトの名無しさん
2008/08/07(木) 13:19:400361デフォルトの名無しさん
2008/08/07(木) 13:46:180362デフォルトの名無しさん
2008/08/07(木) 13:54:110363デフォルトの名無しさん
2008/08/07(木) 16:12:52小野伸二を思い出したんだけど。nobsunはやっぱり天才なんですかね。
0364デフォルトの名無しさん
2008/08/07(木) 19:03:09ルネッサ〜ンス!
0365デフォルトの名無しさん
2008/08/07(木) 19:05:14最近テレビの前で普通にいじめる先輩芸人が多くないか?
0366デフォルトの名無しさん
2008/08/07(木) 19:55:170367デフォルトの名無しさん
2008/08/07(木) 20:41:53にある最終章、「A concurrent RESTful web application」が読みたいんだけど、
これは本買わないとダメってこと?
0368デフォルトの名無しさん
2008/08/07(木) 21:15:32そうか、本になるのか…買おうかな>RealWorldHaskell
0369デフォルトの名無しさん
2008/08/07(木) 23:21:20なんでみんな買うの?
こんなにHaskellって腐ってます
ゴミですって随所に書かれているのにw
0370デフォルトの名無しさん
2008/08/07(木) 23:24:06脳内カウンターが回りまくりですかな
0371デフォルトの名無しさん
2008/08/08(金) 00:09:000372デフォルトの名無しさん
2008/08/08(金) 00:12:48そう書き込んだ人間が一名いるようです。
また、買おうかなと書き込むことと買うことは別です。
プログラマたる者、このくらいの論理性は持って欲しいです。
部分と全体を混同するなんて、継承に毒されすぎです。
0373デフォルトの名無しさん
2008/08/08(金) 02:02:00論理じゃなくて、揚げ足取りっていいませんか?
買おうかなと書き込んだということは、買う意思が比較的強いということでしょう。
0か1かじゃないんですよ。
物事は確率的なのです。
0374デフォルトの名無しさん
2008/08/08(金) 02:42:06> 買おうかなと書き込んだということは、買う意思が比較的強いということでしょう。
著作権者や出版社勤務者が宣伝のために書いたかも知れませんよ
0375デフォルトの名無しさん
2008/08/08(金) 02:42:51そういう可能性もある。
確率の問題。
0376デフォルトの名無しさん
2008/08/08(金) 02:50:39ソース
>>370
君が一人しか見てないだけ
0377デフォルトの名無しさん
2008/08/08(金) 03:20:20>Throughout this book, we're going to show you how Haskell's
alternatives to the features of traditional languages are more
powerful, more flexible, and safer. Haskell is positively crammed
full of cutting edge ideas about how to create great software.
(chap1 power)
と最初のところでかいてるけど、なぜ批判本と?
どこをさしていってるの?
0378デフォルトの名無しさん
2008/08/08(金) 03:22:29オレイリーから関数型言語ぼんが出るのは初めてじゃ内科?
国内ではgauche本があるがね。
0379デフォルトの名無しさん
2008/08/08(金) 03:42:030380デフォルトの名無しさん
2008/08/08(金) 11:58:000381デフォルトの名無しさん
2008/08/08(金) 14:34:11ttp://www.amazon.fr/dp/2841771210/
フランスでは流行ってるんだな
0382デフォルトの名無しさん
2008/08/08(金) 14:42:460383デフォルトの名無しさん
2008/08/08(金) 16:16:02いつの本の話してんだか。
この本の和訳プロジェクトはつぶれたね。
0384デフォルトの名無しさん
2008/08/08(金) 19:15:39全然違う。Rubyは世界的にPythonを急追している。
0385デフォルトの名無しさん
2008/08/08(金) 23:55:14俺も1.9がちゃんとしたモノになるまではrubyは使うべきではないと思う。
0386デフォルトの名無しさん
2008/08/08(金) 23:59:16そもそも本当に10月に発売できるか分からんぞ。
0387デフォルトの名無しさん
2008/08/09(土) 00:21:55年内出れば御の字
0388デフォルトの名無しさん
2008/08/09(土) 00:33:37それがほんとかなぁ。とおもってgoogle trendsでruby,python,perlの検索数を比較させて
みたけど、国によって微妙に違うね。
usaなら、2006ねんごろからperlが凋落しきって、python,rubyとならんで、2006中頃から、
rubyが一歩抜けて、perl,pythonが同等になっていた。
italyは、同じような時期にperlが落ちてきてるけど、pythonがかなり強くって、perlとruby
が同等
japanが、perlの凋落が進んできてるけど、usaやitalyほどではなくて、一番ですね。2番め
がrubyで徐々に増えてる。pythonは完全に横ばい。
chinaはpythonの伸びがかなり強い。そんなにrubyは使われてない。
indiaは日本と傾向が似てるな。
israelはrubyは絶滅ぎみ。
google全体ではrubyが一番強くなってきてるけど、これはusaでのruby人気が支えてる
ような感じだな。europaとchinaではpythonが強く、それ以外の国ではperlが強いかな。
0389デフォルトの名無しさん
2008/08/09(土) 04:23:59世界的にみても、わかって言語を選んでいる人よりも
バズワード追ってるだけの人のほうが多いからね。
0390デフォルトの名無しさん
2008/08/09(土) 06:09:31基本コンパイラだし、インタプリタも軽量とは言い堅いし。。。
0391デフォルトの名無しさん
2008/08/09(土) 06:13:310392デフォルトの名無しさん
2008/08/09(土) 08:06:03GHCばかり取り上げられてHugs涙目
0393デフォルトの名無しさん
2008/08/09(土) 08:07:11そんなあなたをはぐはぐ。w あーっ!ではないよ。
0394デフォルトの名無しさん
2008/08/09(土) 08:22:00理由って何かあるんでしょうか。純粋であることや遅延評価が、静的
型やコンパイル時の最適化を要請するということなんでしょうか?
0395デフォルトの名無しさん
2008/08/09(土) 08:27:55「やっぱりGHCだね」
0396デフォルトの名無しさん
2008/08/09(土) 09:06:49静的なのは、最適化も大きいだろうけど、
むしろ安全性を狙ってるという要素が大きいんだろう。
遅延評価なのはコンパイル時の最適化にプラスなのかなぁ?
これは理論的に停止できる関数は必ず停止できるっていう、
これまたある種の安全性?が主な目的だと思うけど
( if true (answer foo) (nonStop baa) ) みたいな文を考えよう(Haskellの文法忘れたから適当)。
0397デフォルトの名無しさん
2008/08/09(土) 10:14:15効率はどうなんだろう、"動的型付け-正格"の言語よりさらに遅いことは想像が付くが
0398デフォルトの名無しさん
2008/08/09(土) 10:28:23Goferがそうだったから。
で、なんでGoferがそうだったのかというと、Mirandaがそうだったから。
0399デフォルトの名無しさん
2008/08/09(土) 10:37:45遅延評価は最適化にマイナスだよ。少なくともメモリ空間の最適化には全く向かない。
0400デフォルトの名無しさん
2008/08/09(土) 10:44:26今日はやらない
0401396
2008/08/09(土) 10:50:37そうだよね。
コンパイル技術がすげー発達して高速になれば、話は変わるだろうけど。
(まぁ、コンパイル技術が「すげー発達」すれば、どのコンパイル言語でもマシン語と同じスピードが出るんだから、意味ない話)
あと「理論的に停止できる関数は必ず停止できる」は意味不明だとか、
文じゃなくて式だとか、気づいたけど後の祭り、いわゆるアポステオリorz
0402デフォルトの名無しさん
2008/08/09(土) 11:02:51Guarded Horn Clauses
0403デフォルトの名無しさん
2008/08/09(土) 11:31:02評価方式としては、式、文の逐次的解釈が当然になる。
関数型言語は、ラムダ式から出て来たから、
その評価形式をどうするかというのが一つのポイントになる。
遅延評価は最左最外簡約の研究から出て来た。
効率がどうのこうのというより、
新しいプログラミングパラダイムを産み出したので、
(例えば無限リスト、無限木の積極的利用)
研究され続けているんだと思う。
0404デフォルトの名無しさん
2008/08/09(土) 11:32:55GLOBAL HONORED CROWN http://www.noah.co.jp/ghc.php
0405デフォルトの名無しさん
2008/08/09(土) 11:37:31何ができるってわけでもないし
HaskellでWindowsは作れないしLinuxも作れない
Webサーバも作れないしDBも作れない
意味がない
040636 ◆K0BqlCB3.k
2008/08/09(土) 11:44:54http://www.thenewsh.com/~hws/
040736 ◆K0BqlCB3.k
2008/08/09(土) 11:45:520408デフォルトの名無しさん
2008/08/09(土) 11:47:37代入だらけのプログラムをSSAとかいう形式に変換するとか。
0409デフォルトの名無しさん
2008/08/09(土) 11:48:09純粋関数型言語・遅延評価で、
型なし・インタプリタ言語ってあるよ。
変態言語 Lazy K がそれ。
ある意味では Make とかもそうかも。
少なくとも、
純粋関数型言語・遅延評価と、
コンパイル言語かインタプリタ言語か
っていうのはあまり関係ない。
純粋関数型言語・遅延評価は、
シンプルな手続き型よりもインタプリタを書くのが難しい、
っていうのはあるかもしれないけど。
純粋関数型言語であることと静的型であることは、少し関係があるかも。
純粋関数型言語でかつ動的型というのは、概念的にあまり良い食い合わせではないとは思う。
動的型っていうのは、関数の世界では「型無し」ってことになると思うんだけど、
いずれにせよアドホックなエラー処理が必要になって、
純粋関数型的にアドホックなエラー処理というのは少なくとも美しくない。
0410デフォルトの名無しさん
2008/08/09(土) 12:17:29遅延評価でインタプリタ。破壊的関数が作れないというものなら、R言語くらいしか知らない。
0411394
2008/08/09(土) 12:56:14論理的に組み合わせ悪いというよりは、静的型のメリットを選んだ
ということなんでしょうか。
静的型VS動的型というのは、安全VS自由ということだと思うんですが、
Haskellは安全を選んだということなのかな。純粋関数型としては、
副作用に関連する不具合から自由なのが売りだと思うので、更に
静的型によって徹底的に信頼性を上げてるという感じなんでしょうか。
>>409
純粋関数型であること(参照透明であること)と動的型が食い合わせ
悪いというのがちょっと分かりませんでした。動的型は実行時不具合
の問題が付きものと思うのですが、参照透明との関係をよろしければ
少し詳しく教えていただけマスでしょうか。
0412デフォルトの名無しさん
2008/08/09(土) 13:08:180413デフォルトの名無しさん
2008/08/09(土) 13:13:08動的型を使うと、アドホックなエラー処理が必要になるよね?
っていうか、それがないと動的型を使ううまみがないと思うんだけど。
ここでいうアドホックなエラー処理っていうのは、
対象オブジェクトの型をプログラムで認識して、
意図しないオブジェクトが来たときにエラー処理するってことだけど。
このエラー処理にIOを使わないなら、
それは多相型やクラスを使っても同じ結果が得られるよね。
だから、Haskellに動的型を組み込む必要性は、
意図しないオブジェクトが来たときIOを使ったエラー処理をしたいときに限られると思う。
で、純粋関数型言語は参照透明性ゆえにIO処理するの苦手。
まぁ、動的型っていうのはプログラム中で型を認識できないと意味ないよね?
っていう時点で、カリー・ハワード対応との関係で微妙っていう気にするけど。
僕が考えているのは、そんな感じ。
0414デフォルトの名無しさん
2008/08/09(土) 13:17:44Haskellに多いやつらの典型だなw
0415デフォルトの名無しさん
2008/08/09(土) 13:18:59動的でマルチパラダイムな言語で書いたのと同じになる。
0417デフォルトの名無しさん
2008/08/09(土) 13:50:48せいぜい生きる力を養ってください
0418デフォルトの名無しさん
2008/08/09(土) 13:54:52implementationの本を読むといいよ
Peyton Jonesのがpdfで読めるはず
0419デフォルトの名無しさん
2008/08/09(土) 14:11:34俺はPJのが好きだな。
静的型付けとグラフ簡約が運命的な出会いであることがわかった。
0420デフォルトの名無しさん
2008/08/09(土) 14:19:55なんか議論が無茶苦茶じゃないか?
例えば「型エラー」を「0除算エラー」に置き換えても論理展開が変わらん
>このエラー処理にIOを使わないなら、
>それは多相型やクラスを使っても同じ結果が得られるよね。
動的型の重要な利点は、型をいちいち書かなくてもいいという利便性だよな
多相型やクラスを使って動的型をシミュレートするのはすごく面倒だから、この利点を享受できない
それから、GHCではerrorやundefinedで発生したエラーをIOモナド上で捕捉できる。念のため
0421デフォルトの名無しさん
2008/08/09(土) 14:26:59あと、動的型のメリットを例外処理だけに限定するのは視野が狭すぎる。
LISPのメリットはアドホックな例外処理か?そうじゃないと思う。
0422デフォルトの名無しさん
2008/08/09(土) 14:39:32納得できないのなら、それで良いです。
僕も、べつにそんなに優れた論拠だと思ってないから。
0423デフォルトの名無しさん
2008/08/09(土) 14:55:35>>416が理解したのが驚愕。
0424デフォルトの名無しさん
2008/08/09(土) 15:20:10すげえ
0425394
2008/08/09(土) 15:22:47それだけであれば、コンパイルで発見する不具合をテスト時に見つけよう
とする、つまり面倒なことを後回しにしてるだけ、ってことになりませんか?
0426デフォルトの名無しさん
2008/08/09(土) 15:23:150427デフォルトの名無しさん
2008/08/09(土) 15:30:45S式なんて最たるもので、静的な型付けは不能あるいはワイルドカード的。
静的か動的かはトレードオフの問題。
0428デフォルトの名無しさん
2008/08/09(土) 15:42:04不具合を見つけるタイミングが遅くなるという対価を払って、記述の利便性および変更の容易さという報酬を得る
ちゃんと取引として成立してるじゃないか
もちろん「型を書かなくて済む」こと以外にも利点はある
特定の静的型付け言語ではそもそも型を付けられないようなコードが許容されるとか
0429デフォルトの名無しさん
2008/08/09(土) 17:38:51lispを使ってる限りの印象だが
都合のよい所だけ型宣言が出来るというのは柔軟性につながるかな。
プログラムの最適の仕方も静的/動的で違いがあると思うよ。
型なんで考えずにアルゴリズムだけ作っちゃえができるからね。
それでも型を意識したプログラミングをすることはあるが。
でも、haskellでもポリモつかえばある程度型無視ラピッドプログラミング
は可能じゃないか?
0430デフォルトの名無しさん
2008/08/09(土) 17:41:420431デフォルトの名無しさん
2008/08/09(土) 17:44:14haskellって参照透明性ってかなりのメリットだと思ってるけど。
0432デフォルトの名無しさん
2008/08/09(土) 17:49:41Hashkellはメリットを殺すデメリットしかないだろ
0433デフォルトの名無しさん
2008/08/09(土) 17:56:37http://en.wikibooks.org/wiki/Haskell/Existentially_quantified_types
0434デフォルトの名無しさん
2008/08/09(土) 17:57:26OCamlはstrictだから。残念。
0435394
2008/08/09(土) 19:55:26コンパイル時に問題が抽出されることと、テストによって抽出されるのでは
質的な違いがあるんじゃないですか?テストは結局は人間がやるものだし、
不具合の可能性を低めるということにしかならないけど、コンパイルでの
不具合検査は対象となるプログラムの論理的正しさを証明していることに
なるかと思います。
容易に変更ができたとして、不具合がどこに潜んでいるのか分かりにくい
というのは非常に問題あると思いますよ。コンパイルで分かるのならば、
これは明白でしかも機械的に全てが晒されますから安心です。
0436デフォルトの名無しさん
2008/08/09(土) 20:20:59そんざいしないしな
0437デフォルトの名無しさん
2008/08/09(土) 20:23:09確かに、バグがどの段階で発見されるかには質的な違いがある
でも、静的な型検査だって全てのバグを検出できる訳じゃないから、
結局、動的検査との安全性の違いは程度問題
その上で、静的な型検査の利点がコストを上回るという判断は当然ありえるし、
そう判断したなら静的型言語を使えばいい
0438デフォルトの名無しさん
2008/08/09(土) 20:28:12静的型チェック馬鹿ですやん
0439394
2008/08/09(土) 20:39:50例えば、参照透明ということについてはどうでしょうか?こちらも、副作用を許容
すれば、プログラム中に登場する変数の中身が何に変異しているかどうかが
分からなくなり、実行してみないと問題が検出できない、ということになります。
参照透明を強要するのも、型を強要するのも、結局その辺がクリアできない
プログラマというのはそれらに関連する不具合を出してしまうんだと思いますが
どうでしょうか。気をつければいい、というのは簡単で規模が小さなシステムでは
言えることで、そうでなければ膨大なテスト工程が必要になってしまうのでは?
0440デフォルトの名無しさん
2008/08/09(土) 20:46:48refとかで破壊的な変数が作れるから嫌とかそういうレベルの話じゃないよね。
それだったらref使わなければいいだけだから。
逆に、Haskellの参照透明で良い所ってどのへんなの?
OCamlのでも、ErlangのでもなくHaskellの参照透明性が良い理由を説明してほしいんだが。
0441394
2008/08/09(土) 21:04:32参照透明でない、ということは値が望んだ通りの値であることを
保証するためにどこまでも神経質にテストをしなければならない、
ってことですよね。
一人で開発するのであればいいですが、多くの人の手によって
間違いがあってはならないシステムの開発をする際、「それは
禁じ手だから止めてね」と口約束するだけってのは非常に怖い
わけです。だからこそ、テストの工程が膨れ上がる。
Haskellに自分が惹かれている大きな理由の一つは、この辺の
頑固さを貫いていることですね。
0442デフォルトの名無しさん
2008/08/09(土) 21:19:02それだけでテストが必要なくなるわけでも、
テストが簡単になるわけでもない。
そうなるのはトイプログラムだけ。
嘘だと思うなら、GHC, Hugsなどのバグトラックをみてみればいい。
0443デフォルトの名無しさん
2008/08/09(土) 21:21:510444437
2008/08/09(土) 21:22:55何が言いたいのか良く分からん
俺は「気をつければいい」なんて一言も言ってないよ
>>428に書いたように、動的か静的かの間でトレードオフが成立すると言っているだけ
>>441
OCamlの変数は変更不可だよ
変更できるのは参照(ref)で、これは変数とは別物
だから、口約束するまでもなく変数の値が変わらないことは保証されてる
0445デフォルトの名無しさん
2008/08/09(土) 21:26:07参照透明性を壊さないと入出力できないのが嫌
044636 ◆K0BqlCB3.k
2008/08/09(土) 21:37:36数学的に無理だから、統計的に証明するわけですよ。
実際に〜〜でした、ってね。
ヒューマンインターフェース系の論文が参考になるんじゃないかな。
あっちは全部そんな感じ。
0447デフォルトの名無しさん
2008/08/09(土) 21:38:56Haskellでもやろうと思えばIORefとかで事実上破壊的な操作が可能になるわけですが、
これについてはどうお考えで?
「HaskellでIORefは使うな」っていうプログラミングルールを設定することは
「OCamlでref使うな」っていうルールを設定することと本質的に違わないと思うんだけど
それについてはどうなんすか。
044836 ◆K0BqlCB3.k
2008/08/09(土) 21:40:14どう見てもアクリル製のガワの中に反射板入れただけやん。
UFOとかエイリアンとか、考古学じゃなくてSFやん。
突っ込みどころ満載な映画でした。
かしこ
0449デフォルトの名無しさん
2008/08/09(土) 22:13:11したいです。どこがいい問題集頂戴
0450デフォルトの名無しさん
2008/08/09(土) 22:23:39do記法を使わずにliftM、liftM2、joinを実装
Continuationモナドを実装
045136 ◆K0BqlCB3.k
2008/08/09(土) 23:30:03また何も考えずにそういうこと言う。
>>449
http://ja.doukaku.org/
045236 ◆K0BqlCB3.k
2008/08/09(土) 23:31:04http://projecteuler.net/
0453デフォルトの名無しさん
2008/08/10(日) 05:05:51モナドとλの練習なら>>450はいい案じゃないか。
いっぱいじゃないけど質的にいい。
0454デフォルトの名無しさん
2008/08/10(日) 05:08:55>>419
PJのって何?本もpdfもPJのでしょ?
0455デフォルトの名無しさん
2008/08/10(日) 08:02:29Implementation of Functional Programming
Implementing Functional Languages,(D. Lesterと共著)
を書いていて両方公開。
http://www.haskell.org/haskellwiki/Books
0456デフォルトの名無しさん
2008/08/10(日) 08:05:37http://www.haskell.org/haskellwiki/Tutorials
0457デフォルトの名無しさん
2008/08/10(日) 13:23:16すまん、>>455のImplementing...のほうを言いたかった。
045836 ◆K0BqlCB3.k
2008/08/10(日) 13:39:12>>449は本当にモナドとラムダの練習のためだけに問題をほしがっているのかどうかってこと。
それに、初心者は何か目に見えて動かせるものを書きたがるものさ。
誰かに見られることを想定して書くのと、「動けばそれでいい」だけで書くのとでは、
やっぱり前者の方がいろいろ調べたりすることで勉強になる。
0459デフォルトの名無しさん
2008/08/10(日) 15:23:20そこ載ってなくね?w
http://research.microsoft.com/~simonpj/Papers/slpj-book-1987/index.htm
http://research.microsoft.com/~simonpj/Papers/pj-lester-book/
>>457
サンクス。目次しか見てないけど、
Implementationがパターンマッチや型など広く扱ってて、
Implementingはコンパイラのコアな部分を主に扱ってる感じ?
静的型付けとグラフ簡約の運命的な出会いというからそうでもない?
まあImplementingのほうを読んでみます。
>>458
そうですね。
0460デフォルトの名無しさん
2008/08/10(日) 16:23:15グラフ簡約と運命的な出会いというと遅延評価じゃないかね。
特にPJ的には。
0462419
2008/08/11(月) 14:44:370463デフォルトの名無しさん
2008/08/11(月) 16:05:22あまり理解できてなかったんじゃない?w
0464デフォルトの名無しさん
2008/08/11(月) 16:13:31かもしれない。
できれば君が読んでポイントだと思ったところを挙げてくれると皆の参考になると思う。
0465デフォルトの名無しさん
2008/08/11(月) 16:20:35例え動的型チェックをやろうとも、そのコードは、
他の普通のコードと一緒でスーパー・コンビネータになって、
グラフ簡約されるだけだから、コンパイル時に型チェックを済ませることが、
スーパー・コンビネータのグラフ簡約上、特に有利だとは思えません。
0466デフォルトの名無しさん
2008/08/11(月) 17:39:550467デフォルトの名無しさん
2008/08/13(水) 09:02:330468デフォルトの名無しさん
2008/08/13(水) 10:48:150469デフォルトの名無しさん
2008/08/13(水) 11:17:46MonadCont の callCC :: ((a -> m b) -> m a) -> m a のことじゃないの。
>>467
俺も気になる。違いはあるだろうけど、どう違うのか。
0470デフォルトの名無しさん
2008/08/13(水) 11:23:16作るとしたら、ステートモナドに次のアクション
入れておくとかですかね。
0471デフォルトの名無しさん
2008/08/13(水) 13:45:50# mfixとか使えば別だけど。
例えば、Schemeで次の式は書けるが、MonadContでは書けない。
(call/cc (lambda (c) c))
(call/cc (lambda (c) (set! foo c)))
つまり、次の式は型が付かない。
callCC (\c -> return c)
callCC (\c -> lift $ put c)
要は、callCCで捉えた継続をそのcallCCの外に出せない。ただし、
callCC (\c -> ... callCC (\c' -> c c') ...)
のように、内部で別のcallCCを使って、それで捉えた継続を外に出すのはOK。
あと、変な例として、
callCC (\c -> return (Right (c . Left)))
はOK。でもやっぱり無限ループはできない。
0472デフォルトの名無しさん
2008/08/13(水) 14:58:55だとすると、smlのcall/ccを使ったco-routineみたいなことはできないということ?
0473デフォルトの名無しさん
2008/08/13(水) 17:43:19import Control.Monad.Cont
foo = callCC (\c0 ->
do
c1 <- callCC c0
c2 <- callCC c1
c2 10
undefined)
bar =
(do
c1 <- foo
c2 <- callCC c1
callCC c2)
main = print $ runCont bar id
0474デフォルトの名無しさん
2008/08/13(水) 18:18:41HaskellでYコンビネータを書くとき型が問題になるけど、
実質的には fix f = let g = f g in g で問題ない。
それと同じように、
loop = callCC (\c -> let g = c g in return g)
とすれば
do { l <- loop; liftIO $ print 0; l }
のように無限ループを書ける。
(これの変数付きループ版が MonadLib にあった。)
(call/cc (lambda (c) c))
がどう使われるのかよく分からないけど、
実質的には同じことになるんじゃないかな?
(call/cc (lambda (c) (set! foo c)))
callCC (\c -> lift $ put c)
は IORef を使うと問題なくできる。
State だと無理だけど、新しく再帰的なデータ型を定義してやれば、
あまり便利では無さそうだけど一応できた。
0475デフォルトの名無しさん
2008/08/13(水) 22:46:51著者にプレッシャヨロ
047636 ◆K0BqlCB3.k
2008/08/13(水) 22:51:050477デフォルトの名無しさん
2008/08/13(水) 23:21:14んですよね?Haskellではそういうのは無いと思っていいんでしょうか?
0478デフォルトの名無しさん
2008/08/14(木) 00:04:58モナド無しでということなら無い。
そもそもcall/ccは副作用があるし。
0479デフォルトの名無しさん
2008/08/14(木) 13:47:210480デフォルトの名無しさん
2008/08/14(木) 17:35:340481デフォルトの名無しさん
2008/08/14(木) 18:53:400482デフォルトの名無しさん
2008/08/14(木) 18:54:490483デフォルトの名無しさん
2008/08/16(土) 19:35:13http://lethain.com/entry/2008/aug/14/global-popularity-of-programming-languages/
0484デフォルトの名無しさん
2008/08/16(土) 20:24:000485デフォルトの名無しさん
2008/08/16(土) 22:50:09こうゆう落ちもある。
0486デフォルトの名無しさん
2008/08/17(日) 12:30:17http://haskell.org/haskellwiki/Xmonad/Config_archive
の設定ファイル郡を理解できるぐらいまでHaskellについて知りたいんですが
どこから勉強すればいいんでしょう?
知識はXmonadやGhcをソースからインストールできる程度です
0487デフォルトの名無しさん
2008/08/17(日) 13:44:52テストは軽減する。haskellなどはそのことが数学的に証明されているので
プログラマはぬるぽやoutofboundsなどの基本的な間違いにであうことなく、
本質だけを考えることができる。
0488デフォルトの名無しさん
2008/08/17(日) 14:23:37たとえば「空でないリスト」型が欲しいとき、ぬるぽ的な実行時エラーを防げるの?
0489デフォルトの名無しさん
2008/08/17(日) 14:47:05依存型のある言語なら防げるかも知れんけど
0490デフォルトの名無しさん
2008/08/17(日) 15:31:08おまえ初心者スレにいたHaskell信者だろ。
0491デフォルトの名無しさん
2008/08/17(日) 18:08:120492デフォルトの名無しさん
2008/08/17(日) 18:14:59それヘボすぎ
0493デフォルトの名無しさん
2008/08/17(日) 18:26:58誰か教えて下さい
0494デフォルトの名無しさん
2008/08/17(日) 18:36:200495デフォルトの名無しさん
2008/08/17(日) 18:36:410496デフォルトの名無しさん
2008/08/17(日) 18:42:380497デフォルトの名無しさん
2008/08/17(日) 18:59:33ttp://www.sampou.org/haskell/a-a-monads/html/
の以下の部分を読むとわかるかも
Maybe というモナド
ひとつの例
リストもモナド
0498497
2008/08/17(日) 19:11:05の各モナドの利用場面や動機を見るのもいいかもしれない
0499デフォルトの名無しさん
2008/08/17(日) 19:15:59便利だからという理由以外にモナドをIO以外に使う理由はあったりしますか?
それだけの理由で使うには扱いが難しくて、プログラムを組む度に頭がオーバーヒートしそうになる
慣れの問題かそれとも理解不足か・・
0500デフォルトの名無しさん
2008/08/17(日) 19:25:15そこでmaybeもなどですよ。
0501デフォルトの名無しさん
2008/08/17(日) 20:06:22IO, Maybe, List, etcの計算の合成を統一的に扱えるってのが最大の利点なんではないかと。
単に使うだけなら主に慣れの問題だと思う。
いろんな例を見て慣れていけば少しずつ理解もできていくんではないかと。
0502デフォルトの名無しさん
2008/08/17(日) 20:09:490503デフォルトの名無しさん
2008/08/17(日) 20:33:06レス有難うです
慣れの他に密度の問題もあるかもしれないと思ったり。
他の言語より1行あたりの密度が濃いものになりやすい気がする。
というか濃縮されすぎてわけが分からなくなりやすい気がする。
0504デフォルトの名無しさん
2008/08/17(日) 20:38:12計算を統一的に扱うだけであれば、普通の型クラスでいいんですよね?
モナドは値ではなくて型コンストラクタに対するクラスなので、ちょっと違う
と思うんですが。
050536 ◆K0BqlCB3.k
2008/08/17(日) 20:39:51所詮はただの代数的データ型とそのデータ型に対して一貫性あるAPIのセットに過ぎないよ。
ところで、 データ型とAPIのセット のことをなんて呼べばいいの?
0506デフォルトの名無しさん
2008/08/17(日) 20:40:10型クラス(b,s) -> (a,s)に型bを部分適用したって考えれば意味は通るけど……
0507デフォルトの名無しさん
2008/08/17(日) 21:08:43それが「型クラス」、ではないのでしょうか?MonadやFunctorはちょっと
毛色が違うという認識は勘違いでしょうか?
0508デフォルトの名無しさん
2008/08/17(日) 21:17:01Ord、Eq、Show などの データ型とそのAPIのセット は「型クラス」
Functor、Monad、MonadPlus などの データ型の構築子とそのAPIのセット は「型構築子クラス」
0509デフォルトの名無しさん
2008/08/17(日) 21:31:22Functorの『類』は*->*みたいに引数をとる、って違いにしか見えない
分けて考えるのはおかしいと思う
0510デフォルトの名無しさん
2008/08/17(日) 21:37:45型クラスと型構成子クラスじゃ抽象度が違うよ。
0511デフォルトの名無しさん
2008/08/17(日) 21:49:13抽象度が違うのは理解できるが
0512507
2008/08/17(日) 21:58:16遷移を持つことが可能だ、という印象を持つんですけどどうなんでしょうか。
普通の計算を行う裏側で別の次元での計算が行われ、且つそれが
結合法則を満たしている、というのがモナドの定義と考えるのは
どうですか?自分は圏論などのこと全く無知なのでHaskellの構文
からの直感的な印象だけなんですけど。
0513デフォルトの名無しさん
2008/08/17(日) 21:59:06もっと抽象度が違うので別の名前が必要なのか?型構築子構築子クラスとか。
有名な人が書いてるから鵜呑みにしてるだけなんじゃないの?
0514デフォルトの名無しさん
2008/08/17(日) 22:31:24だいたいあってんじゃね?
見えてる部分で適当に処理を書いたら裏で適当に処理してくれる、
普通のプログラミング言語じゃfor文やif文みたいな処理構造、
あるいはマクロとして提供されるものと同等の処理ができるんだけど、
実態は単に型クラスでしかないので俺定義できるし、高階関数使えるし、表記もシンプルで、いろいろ小細工が利くのが利点。
たとえば、IOみたいにコンストラクタを隠したりすれば脱出不可な構造を作れるってわけ。
結合法則を満たしているってのは、まぁ別に特別なことじゃない。
EqやOrdにも反射律とか推移則とか守らないといけないルールがあるけど、
よっぽどのことがない限り変な実装はしないだろうから、一般のプログラミング言語ではそこまで突っ込まない
でもモナドって実態がよくわかんないから、ルールを明記してる。そんだけでしょう。
0515デフォルトの名無しさん
2008/08/17(日) 22:45:32>処理構造(略)同等の処理ができるんだけど
普通の言語では処理構造のものが、モナドが利用されてる例としてはErrorモナドとかContinuationモナドとかがあったね。
>よっぽどのことがない限り変な実装はしないだろうから、一般のプログラミング言語ではそこまで突っ込まない
浮動小数点の比較と等価性で違う実装がされてるとか、変な実装もあるけど。
個人的にはMonad則は、
値に関して順次実行できる何かで、値に対して何もしない処理もできる何かだ、というルールだと解釈してる。
0516デフォルトの名無しさん
2008/08/17(日) 22:50:03コンピュータのメモリ節約を考えれば生の浮動小数点型を使うのもまっとうな実装だわw
0517デフォルトの名無しさん
2008/08/17(日) 23:19:23>値に関して順次実行できる何か
これは実行順序じゃなくて値の計算する方向を言ってるだけだよ。
g.f x がxにfを適用してgを適用するってのと同じことだよ。
実行順序は普通のモナドもIOモナドも方向は決まってないよ。
0518初心者修業中
2008/08/17(日) 23:37:55実行順序を明確にするのがIOモナドの目的の一つ
と認識していますが。
そういう意味ではないのかな…
0519デフォルトの名無しさん
2008/08/17(日) 23:41:24他の言語に比べて内と外をわけすぎるようなそんな印象をもってる。
なんでだろ?
0520デフォルトの名無しさん
2008/08/17(日) 23:58:38たとえば、
1:2:3:[]は、
1:2:3:[] → 1:2:[3] → 1:[2, 3] → [1, 2, 3]と簡約されるかもしれないし、
1:2:3:[] → [1, 2:3:[]] → [1, 2, 3:[]] → [1, 2, 3]と簡約されるかもしれない。
でも結果は一緒でしょ?
同じように、
Hello, Worldって出力 >> 一文字入力 >>= 前の文字を出力
みたいなのは、まぁ言ってみれば(不正確だけど)
[Hello,Worldって出力, 一文字入力, 前の文字を出力]みたいな並びにされる(と思われる。実装はカプセル化されていて不明)。
この並びがプログラム終了後にコンパイラにわたって、コンパイラがこれを順番に処理していく。
実はこの並びをプログラム終了後以外に評価する方法があって、それがUnsafePerfomedIOって言う関数。
getContentとかは実はこれを使って実装されている。
Unsafeという名前が示すように、素人にはお勧めできない。(getContent自体は普通に使える。)
0521デフォルトの名無しさん
2008/08/18(月) 00:02:55052236 ◆K0BqlCB3.k
2008/08/18(月) 00:25:49世界的に全く元気がありません。
ちょこっと変なライブラリを書いたと思えばそれっきり離れていっている人も多数。
0523デフォルトの名無しさん
2008/08/18(月) 01:36:55後者の簡約は型がおかしいし、1:2:3:[]ではなく、
f x = (unsafePerformIO $ print x) `seq` xで
f 1:f 2:f 3:[]だった場合、前者と後者の簡約順序ではprintの順番が違ってくる。
前者は3,2,1で後者は1,2,3
一方で(>>=)は最左最外簡約でも最右最内簡約でも
左から順にしか値が定まらないようになってる。
putStr "Hello" >>= (\ _ -> getChar) >>= (\ c -> putChar c)
(>>=)の右辺が関数だから左辺の値が定まるまでa >>= bが最終的な値に簡約できないようになっている。
0524デフォルトの名無しさん
2008/08/18(月) 03:17:18元気無い理由って何でしょうか。他に元気ある言語ってあるのかな。
0525デフォルトの名無しさん
2008/08/18(月) 04:14:240526デフォルトの名無しさん
2008/08/18(月) 08:38:27> 1:2:3:[] → [1, 2:3:[]] → [1, 2, 3:[]] → [1, 2, 3]と簡約されるかもしれない。
型が滅茶苦茶だよ。
> この並びがプログラム終了後にコンパイラにわたって、コンパイラがこれを順番に処理していく。
意味不明。なぜプログラム終了後にコンパイラが出てくる。
ランタイムライブラリとごちゃまぜになているぞ。
0527デフォルトの名無しさん
2008/08/18(月) 10:05:000528デフォルトの名無しさん
2008/08/18(月) 10:21:37想像力の貧しい奴がこのスレに多いような気がする
0529デフォルトの名無しさん
2008/08/18(月) 13:36:03全部気のせいのような気がする
0530デフォルトの名無しさん
2008/08/18(月) 15:08:490531デフォルトの名無しさん
2008/08/18(月) 15:12:160532デフォルトの名無しさん
2008/08/18(月) 15:41:06つ座布団1枚
0533デフォルトの名無しさん
2008/08/18(月) 21:50:150534デフォルトの名無しさん
2008/08/18(月) 22:25:250535デフォルトの名無しさん
2008/08/19(火) 07:45:46/ つ つ つ
(_(_ ノ ノ ノ
し∪ ∪ ∪
0536デフォルトの名無しさん
2008/08/19(火) 10:10:53> ところで、 データ型とAPIのセット のことをなんて呼べばいいの?
プログラミング言語一般での話なら「抽象データ型」でしょうね。
0537デフォルトの名無しさん
2008/08/19(火) 11:50:46関数(->)とかタプル(,)とか
0538デフォルトの名無しさん
2008/08/20(水) 20:24:46それでなのです。 >ときどきの雑記帖の中の人
0539デフォルトの名無しさん
2008/08/21(木) 14:40:13MonadTrans は (* -> *) -> * -> * のクラス
0540デフォルトの名無しさん
2008/08/21(木) 21:20:37これの30章が消えてるんだけど・・・。
0541デフォルトの名無しさん
2008/08/21(木) 22:05:290542デフォルトの名無しさん
2008/08/21(木) 23:26:23ところで、HaskellでPetStoreってあるの?
054336 ◆K0BqlCB3.k
2008/08/21(木) 23:56:58横からすみませんが、
Pet Storeをよく知らないのでちょこっと検索したんですが、
これっていったい何が面白いんですか?
0544デフォルトの名無しさん
2008/08/22(金) 00:08:29面白くは無いんだけど、色んな言語やフレームワークで同じもの作る
ことで比較をするためのものでしょ。同じアプリがこんな感じで作れ
ちゃうぞ、という。
0545デフォルトの名無しさん
2008/08/22(金) 11:40:45054636 ◆K0BqlCB3.k
2008/08/22(金) 12:37:40ライトウェイト言語がブームみたいだね。
HaskellはライトウェイトではないからWEBアプリ向きとは全然思えないんだけど、
RubyでRubyOnRailsが考えられたみたいにHaskell独自のWEB向きキラーアプリが
出てこないとHaskellの人気はこれからもずっと平行線だと思うよ。
0547デフォルトの名無しさん
2008/08/22(金) 12:41:19WEBアプリが書きやすいっていうより、APIとかWEBコンテナが標準装備されてないとダメという感じがする。
Javaの功罪は大きい。
0548デフォルトの名無しさん
2008/08/22(金) 12:41:590549デフォルトの名無しさん
2008/08/22(金) 12:48:26ライトウェイトって何?動的に型を付ければライトウェイト?
それとwebとどういう関係があるの?
0550デフォルトの名無しさん
2008/08/22(金) 13:05:36ライトウェイトってことじゃないか?
web案件は短期だったりアジャイルだったりでライトウェイトに
開発できるのが求められてるってのはある
0551デフォルトの名無しさん
2008/08/22(金) 13:10:45だから、WEBアプリ開発者は、身体のどこかに、プログラミング言語のJavaかRubyに似てない部分に拒否反応を持ってる。
0552デフォルトの名無しさん
2008/08/22(金) 13:11:10考えが即座にコードにうつせるため開発期間が最短であると主張する人がどこからか登場
↓
0553デフォルトの名無しさん
2008/08/22(金) 13:23:23( ゚д゚ )↓
(⊃⌒*⌒⊂)
/__ノ''''ヽ__)
0554デフォルトの名無しさん
2008/08/22(金) 13:27:58それならHaskellもライトウェイトで良くね?
0555デフォルトの名無しさん
2008/08/22(金) 14:05:360556デフォルトの名無しさん
2008/08/22(金) 14:18:04だから普及しないとか、
どうでもよくねえ?
好きな事、楽しい事すればいい。
0557デフォルトの名無しさん
2008/08/22(金) 14:22:47runghcがあるじゃないか
もうちょっと速ければと思うことはあるけど
0558デフォルトの名無しさん
2008/08/22(金) 14:34:05そういう立場も理解できるけど、俺は普及してほしい
ライブラリのメンテとか人が足りてないじゃん
0559デフォルトの名無しさん
2008/08/22(金) 14:46:33Prologには負けるんじゃない。
056036 ◆K0BqlCB3.k
2008/08/22(金) 14:47:15$ cat hello.hs
main = putStrLn "hello"
$ time runghc6 hello.hs
hello
real 0m0.835s
user 0m0.780s
sys 0m0.052s
$ cat hello.rb
print "hello\n"
$ time ruby hello.rb
hello
real 0m0.015s
user 0m0.012s
sys 0m0.000s
056136 ◆K0BqlCB3.k
2008/08/22(金) 14:48:14print "hello\n"
$ time perl hello.pl
hello
real 0m0.007s
user 0m0.004s
sys 0m0.000s
$ cat hello.py
print "hello"
$ time python hello.py
hello
real 0m0.035s
user 0m0.020s
sys 0m0.016s
0562デフォルトの名無しさん
2008/08/22(金) 15:03:430563デフォルトの名無しさん
2008/08/22(金) 15:07:56Webアプリのかなり大部分は一般的にLLと呼ばれている言語で書かれているだろう。
そういう"LL"はテキスト処理がしやすいからってのがあるだろうな。
まあHaskellがそういう意味で人気にならなくても別にどうでもいいけど。
ここでmondic Parser Combinatorを持つHaskellが
最もテキスト処理に適した言語であると主張する人がどこからか登場。
↓
0564デフォルトの名無しさん
2008/08/22(金) 15:38:430565デフォルトの名無しさん
2008/08/22(金) 15:45:06ttp://happs.org/
0566デフォルトの名無しさん
2008/08/22(金) 16:09:31満足した?
0567デフォルトの名無しさん
2008/08/22(金) 17:42:48だがな、至高の存在で良いじゃないか。
haskellの性質上webプログラミングは不得意分野に思うんだが、mod haskellなんて生まれる
分けでもないし生まれたところで破壊的操作がほとんどできないし、ファイル操作は基本的に
苦手でしょ。webは動的言語の親玉が一番向いてるけどs式アレルギーな人が多いからLLに
なってるんでしょうね。
だから、無理にwebに擦り寄らずとも良いと思うんだけどね。むしろ、破壊的操作より安全性を
大切にされる金融などのところで目立つ存在になってくれたらいいんじゃないか?
056836 ◆K0BqlCB3.k
2008/08/22(金) 18:09:07もし金融などで使われることを想定するなら、
haskellの並列処理に関する部分も早く実装してほしいところですね。
(まだ未完成)
0569デフォルトの名無しさん
2008/08/22(金) 18:44:00>>567
> 破壊的操作がほとんどできない
なんで?
0570デフォルトの名無しさん
2008/08/22(金) 18:58:34>>567
コンパイルするならmod_haskellがあっても恩恵は小さいだろ
>破壊的操作がほとんどできないし
Haskellで入出力書いたことあるか?
>ファイル操作は基本的に苦手
これも良く分からん
flock使うのにわざわざライブラリを落としてこないといけないとか、そういうこと?
0571デフォルトの名無しさん
2008/08/22(金) 19:43:28既存のシステムを補強するのではなく全部作り直せというのは、ちょっとね
0572デフォルトの名無しさん
2008/08/22(金) 19:54:17Prologを事務処理に使うと、住所や氏名情報などで爆発的にアトムが
発生し、Heap領域を埋め尽くして、GCが頻発するという事態となる。
もちろん数百万レコードを越える処理単位の話だが。
Haskellの場合この問題は起きないの?
0573デフォルトの名無しさん
2008/08/22(金) 20:37:03まだ増殖するだろうから、そっちで使いやすいフレームワークやDSLが出ないと
使う人は頭打ちだと俺も思う。
研究者の論文レベルのものも面白いだろうけど、上から下までHaskellベースで
かかれたWebアプリとかで目立つものが出てほしいよ、個人的には。
0574デフォルトの名無しさん
2008/08/22(金) 20:53:32アトムの爆発ってのはPrologスレで言及されてる現象のことでいい?
そもそもPrologのアトムってのが良く分からんので何が問題なのか理解できん
Lispのシンボルみたいな物と思っていいのかな
それなら相当するものはHaskellにはないよ
0575デフォルトの名無しさん
2008/08/22(金) 21:35:41Lispのシンボルみたいな物、ですね。
記号をどう処理しているのですか。
0576デフォルトの名無しさん
2008/08/22(金) 21:53:0530章ってなんの章だったの?
0577デフォルトの名無しさん
2008/08/22(金) 22:12:26「記号」と言われてもいまいちピンと来ないんだが、何にせよ、
普通の手続き型言語が「記号」を処理するのと大差ない方法で処理してると思う
取り得る種類がコンパイル時に決まっているなら列挙型
そうでないなら整数とか文字列
文字列の比較のコストが問題になるなら自分でシンボルテーブルのようなものを用意する、とか
0578デフォルトの名無しさん
2008/08/22(金) 22:34:03>>310-314
0579デフォルトの名無しさん
2008/08/23(土) 09:45:26Prologでも、
1レコード512バイトをsub_atomで30項目に分解したり、更にsplitの
処理をしたりすると確かにアトムが大量発生するだろうが、
Stringとして読み込んで、終始String処理に徹すれば、アルファベットの
数、つまり高々数万のアトムで済むんじゃないの?
Stringすなわちリスト処理になると遅いから嫌なのかな。
0580デフォルトの名無しさん
2008/08/23(土) 10:00:27資源が十分にあると理屈では分かっていても、終わったら電源切っても大丈夫な処理じゃないと拒否反応がでる。
0581デフォルトの名無しさん
2008/08/23(土) 10:09:14処理速度もあるかも知れませんが、アトムだと、
foo([株式会社|R],R).
と書けるところが、Stringだと
foo(List,R) :- append("株式会社",R,List).
と書かなくてはならないということがあります。
appendを高速化する機構が欲しくなりますね。
0582デフォルトの名無しさん
2008/08/23(土) 10:35:10data Atom = Kabushiki | Dummy deriving (Show, Eq)
foo :: [Atom] -> [Atom]
foo (Kabushiki : r) = r
0583デフォルトの名無しさん
2008/08/23(土) 11:43:27http://pc11.2ch.net/test/read.cgi/tech/1193354806/
0584デフォルトの名無しさん
2008/08/23(土) 12:43:04この話おかしいよ。
foo([株式会社|R],R). の方は、
すでに株式会社というアトムが切り出されていて、リストの構成要素になっている。
一方、
foo(List,R) :- append("株式会社",R,List). のListはString。ここは、
foo(["株式会社"|R],R).
でなきゃ、フェアじゃない。
0585デフォルトの名無しさん
2008/08/23(土) 13:58:45> Prologを事務処理に使うと、住所や氏名情報などで爆発的にアトムが発生し
第五世代コンピュータプロジェクトの成果を是非参照下さい。
0587デフォルトの名無しさん
2008/08/23(土) 14:21:10058836 ◆K0BqlCB3.k
2008/08/23(土) 14:28:53それは短絡的な人たちの根拠のないうわさ。
第五は基礎研究なので企業の人たちが求めるような成果が出ないのは当たり前のこと。
0589デフォルトの名無しさん
2008/08/23(土) 14:31:33んで問題点を整理してまたいらっしゃい
059036 ◆K0BqlCB3.k
2008/08/23(土) 14:33:31述語論理による仕様記述を使った鉄道のプロジェクトが企業側で行われた例があったような。
なんだったっけ?
0591デフォルトの名無しさん
2008/08/23(土) 14:45:22開発する場合、何か問題になる点はないのか。
0592デフォルトの名無しさん
2008/08/23(土) 14:54:20必要なメモリサイズを予測しにくい点とか。full lazyな処理系全般に言えると思うけど。
0593デフォルトの名無しさん
2008/08/23(土) 14:57:02いいじゃん、Javaでつくるのが流行ならJavaで作らせれば。
どうせ枯れたシステムなんだから。
0594デフォルトの名無しさん
2008/08/23(土) 15:00:18full lazyな処理系って、よくわからない。
059536 ◆K0BqlCB3.k
2008/08/23(土) 15:11:430596デフォルトの名無しさん
2008/08/23(土) 15:17:460597デフォルトの名無しさん
2008/08/23(土) 15:26:42COBOLなんかは確定してると思うけど。
0598デフォルトの名無しさん
2008/08/23(土) 15:42:16してない。
SORTなどに内部的に使う記憶容量が不明。
0599デフォルトの名無しさん
2008/08/23(土) 15:43:11計算をできるかぎり遅延させようとするから、
下手な書き方するとすぐメモリリークする
Haskellのメモリリークは大抵の場合小規模な修正で直るけど、
どこを修正すべきか探すのに慣れとプロファイラが要る
>>596
GHC付属のプロファイラは優秀だと思う
060036 ◆K0BqlCB3.k
2008/08/23(土) 15:47:59profオプションをつけてコンパイルしたらランタイムシステムにプロファイラが組み込まれるよ。
詳しくはマニュアルで。
0601デフォルトの名無しさん
2008/08/23(土) 16:19:23ん?確定はしてなくても最大どれかけかかるかは確定してるでしょ。
グラフ簡約のヒープ消費は予測もつかんぞ。
0602デフォルトの名無しさん
2008/08/23(土) 16:27:11確定してるのかしてないのかどっちだw
0603初心者修業中
2008/08/23(土) 16:37:52ガベージコレクションにバグがない限り、
メモリーリークが起きるとは思えないのですが…。
FFIを使った場合の事でしょうか…。
0604デフォルトの名無しさん
2008/08/23(土) 17:15:44http://d.hatena.ne.jp/desumasu/20060909/1157800884
この場合のメモリーリークは単なるメモリの解放忘れって事ではなくて、
期待した解放タイミングと実際のそれとのギャップの事みたいだね。
0605初心者修業中
2008/08/23(土) 17:42:49*Main> foldr (+) 0 [0..1000000]
*** Exception: stack overflow
0606デフォルトの名無しさん
2008/08/23(土) 18:05:58しちゃってる、というのをリークに含めることもある。
0607デフォルトの名無しさん
2008/08/23(土) 18:34:57それは「マヌケ」と呼びます。
0608初心者修業中
2008/08/23(土) 18:57:56簡単にわかる場合は「マヌケ」
ちょっとわかりづらい場合は「メモリーリーク」
と呼ぶという認識でよろしいでしょうか?
0609デフォルトの名無しさん
2008/08/23(土) 19:14:20GCのある言語だと、>>606しか起こり得ない。
>>605の「溢れ」とは全然違う。
0610デフォルトの名無しさん
2008/08/23(土) 19:20:46それはスタックオーバフロの例外であって、エラーとは違う。
メモリリークしているわけではないよ。
0611デフォルトの名無しさん
2008/08/23(土) 19:22:12Haskellみたいに強い静的型付けされている言語にはメモリリークなんてありえないよー
0612デフォルトの名無しさん
2008/08/23(土) 19:26:56現象として全然違うと言う事ですね。
分かります。
0613デフォルトの名無しさん
2008/08/23(土) 19:53:14良く言われる「メモリーリーク」とは違う現象だな。
Haskellの場合、遅延評価がデフォーなので
うかつに再帰を使うと計算の途中結果が膨大な
ものになってヒープ領域が溢れてしまう。
Cの場合はただの確保したメモリの解放し忘れ。
Cでも再帰的なメモリー確保をすれば
Haskellみたいな事も起きうるはずだが。
0614デフォルトの名無しさん
2008/08/23(土) 20:06:48強い静的型付けとメモリーリークの有無はほとんど関係がありません。
GCの方がずっと関係が深いです。
0615デフォルトの名無しさん
2008/08/23(土) 20:09:24あれ考えれば分かるよな。
強い型付けでも簡単にメモリーリークは起きる。
0616デフォルトの名無しさん
2008/08/23(土) 20:56:45Data.List.foldl' 使えばいいんだけど。
0617デフォルトの名無しさん
2008/08/23(土) 21:35:430618デフォルトの名無しさん
2008/08/23(土) 21:48:31末尾再帰は最適化されるよ
0619初心者修業中
2008/08/23(土) 23:53:01遅延評価だからと認識しています。
↓参考
http://haskell.g.hatena.ne.jp/jmk/20060710/1152516465
0620617
2008/08/24(日) 00:40:37なるほど、非常によくわかりました。
(つーか前出のリンク読まずにレスして申し訳ない)
うーむ、しかし末尾再帰が最適化されることの旨みは、
・ローカルスコープの値をスタックに積む必要がなくなることと
・連続するreturnが省略されること
の2点だと思うけど、foldl のように結局は遅延評価のための
computation がスタックに積まれていて、後から順次簡約するなら
「最適化されている」とは言い難い気もするな・・・。
最適化するための然るべき変形は、一応してあるんだろうけど。
まあ seq 使うとか、回避の仕方がないわけじゃないからいいのかな?
0621デフォルトの名無しさん
2008/08/24(日) 00:54:46http://itpro.nikkeibp.co.jp/article/COLUMN/20070403/267180/?P=2
0622デフォルトの名無しさん
2008/08/24(日) 13:10:00VIP発でサイトを作ろうと思うんだ。(詳しくはWikiを見てくれ)
パートスレになるんでパー速(GEP)に移動している。
今スタッフを募集しているから、来てくれないか?
■Wiki
http://www36.atwiki.jp/vipvipschool/
■募集スタッフ
プログラム担当(特にErlang、Perl)
デザイナー(サイト上のアイコン、ロゴなど)
WEBデザイナー(サイトデザイン案に沿って、htmlやCSSを書ける)
他にも宣伝担当なども募集している。
■スレ
http://ex14.vip2ch.com/test/read.cgi/news4gep/1219068297/
0623デフォルトの名無しさん
2008/08/24(日) 16:41:26実用性でいうとやっぱErlangなのかな…
0624デフォルトの名無しさん
2008/08/24(日) 18:20:21大規模なWebサービスを構築するのに向いていると
考えたから企画者がErlangを採用したんだろうね。
0625デフォルトの名無しさん
2008/08/25(月) 09:10:25実情は単にDBのテーブルが大きいだけだったりするよな。
そもそもウェブアプリでDB以外どこが肥大化するよ?
0626デフォルトの名無しさん
2008/08/25(月) 09:11:280627デフォルトの名無しさん
2008/08/25(月) 09:20:29複数のwebサービスから情報集めたり、もしくはhttp以外のプロトコルで通信して情報を取得しなきゃいけなかったり、
別プロセスで並列キューに入れて処理しなきゃいけなかったり、システムそのものが大きくなるとこはあると思う。
それともデータサイズの規模に限定した話?
0628デフォルトの名無しさん
2008/08/25(月) 09:53:32とりあえずErlang + YAWSの事例くらいは、
念頭においてくれないと、話にならないのでは?
0629デフォルトの名無しさん
2008/08/25(月) 09:55:11> 複数のwebサービスから情報集めたり、
そういうのはAjaxでクライアント側がやるのが流行では?
まあサーバ側がやってもいいですが、HTTPセッションを入れ子にするのは
あまり筋がいい設計とは思えません。
> もしくはhttp以外のプロトコルで通信して情報を取得しなきゃいけなかったり、
まあDB接続なんかもそうですよね。
しかし「大規模になる」ような要因とはあまり考えられないのですが。
> 別プロセスで並列キューに入れて処理しなきゃいけなかったり、
fastcgiとかの話でしょうか?特段、だから大規模になるというものではないと思いますが。
> それともデータサイズの規模に限定した話?
コード自体はほとんどCMS系フレームワークをユーザ定義コンテナを定義する程度で
用が済むことが多いと思います。特に、>>622のような、いかにもCMSっぽいシステムでは。
0630デフォルトの名無しさん
2008/08/25(月) 10:00:08> コード自体はほとんどCMS系フレームワークをユーザ定義コンテナを定義する程度で
> 用が済むことが多いと思います。特に、>>622のような、いかにもCMSっぽいシステムでは。
よいCMS系フレームワークを、
容易に開発できるかどうかって話をしているんだと思いますよ。
0631デフォルトの名無しさん
2008/08/25(月) 10:54:21なるほど、わかりました。
格納するコンテンツの量は結局DBのサイズの問題になると思うので、
それ以外の「大規模」の要因というと、
・同時接続数(パフォーマンス)
・登録ユーザー数
ぐらいでしょうか。
それとも単純にコードサイズを指して「大規模」という話なんでしょうかね。
「学校」というドメインが明確になっているので、
一般のCMSフレームワークほど汎用化は要求されないし、
どのような要因でコードサイズが「大規模」化するのか興味があります。
0632デフォルトの名無しさん
2008/08/25(月) 12:22:00Apacheとか使わずErlangでサーバー構築するんじゃないの?
0633デフォルトの名無しさん
2008/08/25(月) 12:26:390634デフォルトの名無しさん
2008/08/25(月) 13:01:50マルチコアで何とかしようと考えていると見て間違いない。
Webだとすれば、WebServer以外考え難い。生徒数千でほぼ
同時にアクセスがあるとか。
0635デフォルトの名無しさん
2008/08/25(月) 13:13:150636デフォルトの名無しさん
2008/08/25(月) 13:16:410637デフォルトの名無しさん
2008/08/25(月) 13:16:520638デフォルトの名無しさん
2008/08/25(月) 13:42:02HaskellでもPerl使いを確保しておいて、単体の機能は専らCPANから取り出させて、
確保されているインターフェイスを介してHaskellで利用するというやり方は
多くなるんじゃないかな。短時間で開発する一手法としてね。
0639デフォルトの名無しさん
2008/08/25(月) 13:57:490640デフォルトの名無しさん
2008/08/25(月) 14:13:290641デフォルトの名無しさん
2008/08/26(火) 00:21:14Haskellに慣れてくるとこの実装が直感的に見えてくるんですか?
Haskellのパーサコンビネータ関連のペーパーを読んでいない状態でReadPを読んで、
data P a = Get (Char -> P a)
略
| Result a (P a)
略 なのを「え、一番直感的じゃん」
とか、
newtype ReadP a = R (forall b . (a -> P b) -> P b)
で
instance Monad ReadP where
return x = R (\k -> k x) ← これとか
fail _ = R (\_ -> Fail)
R m >>= f = R (\k -> m (\a -> let R m' = f a in m' k)) ← これとか
とか
get = R Get
ってなるを、「ああ、自明だなすげえ直感的」みたいに理解できるようになる物なんですかね。。難しすぎる。。。
0642デフォルトの名無しさん
2008/08/26(火) 00:29:58大規模になる要因なんていくらでもあるじゃん。
今時は単にUIがWebで、バックエンドが複雑化してるものも少なくないしね。
分散業務システムで多種類のプロセスを相手にすりゃ自然と規模は大きくなるかと。
何でもかんでもインターネット上でパブリックに利用可能な整理されたサービスばかりじゃないからね。
学校だって企業並みにシステムが複雑化してるとこもあるから、強ち単純とは言えないんじゃないかと。
まあ何はともあれ、ロジックが複雑になればなるほど、関数型の恩恵は大きくなるわな。
0643デフォルトの名無しさん
2008/08/26(火) 01:08:51googleを支える技術とか読んでもそんなに複雑とは思えないんだよなぁ。
台数は1台だけど自宅で似たようなことやってるもん。
0644デフォルトの名無しさん
2008/08/26(火) 08:11:38P のような再帰的な型のモナドを、
効率のために継続モナド(ReadP)で包むのは定石。
Haskell への慣れっていうより、
モナドや継続モナドへの慣れの問題な気がする。
P は問題によって様々だけど、
ReadP のとこは Control.Monad.Cont の
一般的な継続モナドと(型を除いて)同じなので、
それを理解しておくと問題に集中できていいかもよ。
0645デフォルトの名無しさん
2008/08/26(火) 08:13:320646デフォルトの名無しさん
2008/08/26(火) 08:21:08それはバックエンドで動いている他プロセスが複雑なのであって
ウェブアプリが複雑なわけではないのでは?
0647デフォルトの名無しさん
2008/08/26(火) 08:32:48機械翻訳とかではなくて?
0648デフォルトの名無しさん
2008/08/26(火) 18:38:57どうもレスありがとうございました。
>P のような再帰的な型のモナドを、
>効率のために継続モナド(ReadP)で包むのは定石。
これは初めて聞きました。どうもありがとうございます。
確かに
If we want to build monads on top of a continuation based programming paradigm,
such as stream processors or continuation based I/O in Haskell,
we need to build a monad around the continuation based operations.
って書いてあるペーパーを見付けました、その継続ベースの方法について考えながら考えていこうと思います。
0649デフォルトの名無しさん
2008/08/26(火) 18:52:430650デフォルトの名無しさん
2008/08/26(火) 19:00:04そうです、でもこれだけ読んでもこれで何がしたいのか俺には正直よく分かりませんな。。
例がなくても理論だけ聞けば全て分かるタイプの人なら大丈夫なのかもしれませんが。
0651デフォルトの名無しさん
2008/08/28(木) 06:47:20P みたいなのを継続ベースともいうけど、
ReadP を使うのは純粋に効率のためで、
そこに書いてあるのとは話が違うような。
0652デフォルトの名無しさん
2008/08/28(木) 11:12:38そう単純化されても…
0653デフォルトの名無しさん
2008/08/28(木) 14:48:420654デフォルトの名無しさん
2008/08/28(木) 21:41:23ReadPだと、PがReadPで包まれてるわけだけど、
get' = Get return
look' = Look return
sat' p = do a <- get' ; if p a then return a else Fail
char' c = sat' (c == )
string' s = do str <- look' ; scan s str
where scan [] _ = return s
scan (x:xs) (y:ys) | x == y = do get' ; scan xs ys
scan _ _ = Fail
みたいにReadPでくるまないバージョンも用意できて、それもrunで使える。
http://www.cs.chalmers.se/Cs/Grundutb/Kurser/afp/2006/Papers/parser-claessen.pdf
ここにも効率がって書いてあるけどどんな場合なのかさっぱりだ。。
0655デフォルトの名無しさん
2008/08/29(金) 14:13:46記述上は包まれた形になってるけど、実装では包みが外れた形になる。
参照: http://haskell.g.hatena.ne.jp/jmk/20061203/1165141002
Pは直接的にはうまく束ねることができないから、一旦仮想的なReadPで束ねてるって感じ?
0656デフォルトの名無しさん
2008/08/29(金) 15:53:54どうもありがとうございます。
実際にはReadPの所はR Get やR Lookなどが渡されることになりますよね。
そのあとすぐにrunで即Rはずしてますし。
>Pは直接的にはうまく束ねることができないから
これってどういう意味で仰ったんですか?
P を束ねてパーサとして使うことも、実際できる(>>654のget'など)のでわざわざどうしてReadPにするのか、
Pの>>=が左結合的に作用するのが問題らしいんですけどそれが問題になる具体的なケースについて
私にはサッパリ思い付かなかったので先人たる皆様にお聞きしたかった次第です。
0657デフォルトの名無しさん
2008/08/29(金) 17:28:28ReadP の計算で左結合になってる >>= がある場合でも、
内側の P の >>= をすべて右結合にすることで、
P の >>= の再帰が無くなって効率が良くなる。
9節の第1パラグラフに書いてある通りなんだけど。
左結合を右結合にってのは、>>= の結合則
(m >>= f) >>= g == m >>= (\a -> f a >>= g)
の左辺を右辺にするってな話。
例えば、string s >>= f でも string s の中で
>>= を使ってるので、左結合になってる。
つまりほとんど全ての場合に当てはまる。
0658デフォルトの名無しさん
2008/08/29(金) 17:29:19リストの ++ は左引数に関して再帰する。
[] ++ ys = ys
(x:xs) ++ ys = x : (xs ++ ys)
そのため (xs ++ ys) ++ zs は xs に関して二重に再帰することになる。
foldr (++) [] (map show [1..10000])
foldl (++) [] (map show [1..10000])
実際これらを実行してみると前者はすぐ終わるけど、後者は "1" を10000回結合、
"2" を9999回結合、... "10000" を1回結合、みたいになって遅い。加速してくけど。
遅いだけじゃなく、中間リストを生成するので無駄にメモリを使うことにもなる。
foldl は極端な例だけど、foldr も極端で、いつも無駄が無いようにはいかない。
0659デフォルトの名無しさん
2008/08/29(金) 17:30:18xs ++ ys は、xs の最後の [] を ys に置き換える。
それを効率よくやるには、最初っから [] なんか使わないで、
1:2:3:[] を \nil -> 1:2:3:nil みたいにしとけばいいじゃんという発想。
つまり [a] を [a] -> [a] に、xs を xs ++ に、++ を (.) にする。
こうしておくと、[] を与えてリストに戻すときには、
(.) が右結合になってなくても ++ は右結合になる。
(((xs ++) . (ys ++)) . (zs ++)) []
= ((xs ++) . (ys ++)) (zs ++ [])
= (xs ++) (ys ++ (zs ++ []))
= xs ++ (ys ++ (zs ++ []))
実際 String の ++ を頻繁に使う class Show あたりでは、
できるだけ type ShowS = String -> String を使うことになってる。
shows :: Show a => a -> ShowS を使ってさっきの
foldl (.) id (map shows [1..10000]) []
をやってみると、今度は問題無く速い。
0660デフォルトの名無しさん
2008/08/29(金) 17:31:29m >>= f (P の >>=)は、m の最後の return a を f a に置き換える。
それを効率よくやるには、最初っから return なんか使わないで、
Get (\c1 -> Get (\c2 -> return [c1,c2])) を
\k -> Get (\c1 -> Get (\c2 -> k [c1,c2])) みたいにしとけばいいじゃんという発想。
つまり P a を forall b. (a -> P b) -> P b に、
m を m >>= に、>>= を \m f k -> m (\a -> f a k) にする。
以下略。
0661デフォルトの名無しさん
2008/08/29(金) 17:32:22foldr c n xs は、xs の : を c に、[] を n に置き換える。
それを効率よくやるには、最初っから : や [] なんか使わないで、
1:2:3:[] を \c n -> 1 `c` 2 `c` 3 `c` n みたいにしとけばいいじゃんという発想。
つまり [a] を forall b. (a -> b -> b) -> b -> b にする。
リストに戻すときは build xs = xs (:) [] を使う。
すると foldr c n (build xs) ==> xs c n と変換できる。
map f xs <==> build (\c n -> foldr (c . f) n xs)
例えばこういう変換を定義すれば、
(map f . map g) xs = map f (map g xs)
==> build (\c n -> foldr (c . f) n (build (\c n -> foldr (c . g) n xs)))
==> build (\c n -> (\c n -> foldr (c . g) n xs) (c . f) n)
==> build (\c n -> foldr (c . f . g) n xs)
==> map (f . g) xs
のように map f . map g ==> map (f . g) という変換ができる。
map f . map g 以外にも、他のいろいろなリスト関数の
foldr/build を使った形への変換を定義しておけば、いろいろな変換ができる。
foldr/build による融合変換ってやつ。今の GHC もこれを使ってる。
詳しくは GHC User's Guide の 8.13. Rewrite rules あたりを見てくれ。
0662デフォルトの名無しさん
2008/08/29(金) 18:19:15とても分かりやすい解説どうもありがとうございます!
ちょっと解決の糸口がつかめた感じがします、これからじっくり考えてみたいと思います。
とてもご丁寧にありがとうございました。
流石だ。。。
0663デフォルトの名無しさん
2008/08/30(土) 18:34:320664デフォルトの名無しさん
2008/08/30(土) 18:44:45ごく自然発生的なものだと思うが?
0665デフォルトの名無しさん
2008/08/31(日) 00:07:29手続き型言語 = how(どうやるか)を記述
クロージャをいかに早めに潰すかに苦心するHaskellは後者ですな
0666デフォルトの名無しさん
2008/08/31(日) 00:38:36宣言型言語=述語論理を記述
と思ったらHaskellも述語論理の仕様記述言語に非常に近い特徴を持っていることに気づく。
0667デフォルトの名無しさん
2008/08/31(日) 03:38:00> クロージャをいかに早めに潰すかに苦心
ってどういうこと?
0668デフォルトの名無しさん
2008/08/31(日) 09:45:13関数のインライン展開のようなものじゃないか
よく分からんが
関数リテラルなら展開しやすいが高階関数の戻り値のクロージャは展開しにくい気がする
だからどう書くか (how) を工夫する
人間が問題を「宣言」するだけでコンパイラが問題を解いてくれる
というのは
素朴な解決策は簡単に見つかるのだが最適化が難しい (が機械的にできる) 問題に限定されるはず
0669デフォルトの名無しさん
2008/08/31(日) 15:47:120670デフォルトの名無しさん
2008/08/31(日) 15:59:09最適化は手続き型でもやってるから、非手続き型の人はwhatの部分を強調してみたりC/C++より速くなると言ってみたり。
LLの人は最適化にあまり拘らないし、テストさえ通ればhowを直接書いてもいいやって感じだけど。
0671デフォルトの名無しさん
2008/08/31(日) 17:18:22>>600前後の流れ参照
要するに未評価の式(これはクロージャで実装されてる)を溜め込まないように注意する必要がある
0672デフォルトの名無しさん
2008/08/31(日) 20:51:420673デフォルトの名無しさん
2008/08/31(日) 21:42:38人間の性格はA型B型O型AB型の4種類に分けることができる
とか思ってそうだよな。
0674デフォルトの名無しさん
2008/08/31(日) 23:36:24血液型と性格をろくな検証なしに簡単に結びつけてしまう短絡さ
どっちをさしてるのか紛らわしいので例としては不適
0675デフォルトの名無しさん
2008/09/01(月) 01:06:10おもしろおかしい
0676デフォルトの名無しさん
2008/09/01(月) 07:57:32書き終わったって。
0677デフォルトの名無しさん
2008/09/01(月) 15:40:490678デフォルトの名無しさん
2008/09/02(火) 14:15:50試しにZあたりの実行系でもつくってみればw
0679デフォルトの名無しさん
2008/09/02(火) 17:56:25何が言いたいのははっきり言え。
小馬鹿にするだけでは情報価値ゼロだぞ。
0680デフォルトの名無しさん
2008/09/03(水) 08:50:51せめてホーン論理に限定するとかじゃないと話にならんだろ。
0681デフォルトの名無しさん
2008/09/03(水) 23:53:100682デフォルトの名無しさん
2008/09/04(木) 00:04:13おお!でも英語疲れる。訳書出版の予定はないの?
0683デフォルトの名無しさん
2008/09/04(木) 01:25:52死滅しそうなのはHaskellだが、新しいHaskellのライブラリはほとんどArrowベースだよ。
0684デフォルトの名無しさん
2008/09/04(木) 11:41:240685デフォルトの名無しさん
2008/09/04(木) 12:00:02ってレス多いよな。
0686デフォルトの名無しさん
2008/09/04(木) 15:00:58東大 誰も吸っていない
京大 誰も吸っていない
同志社大 ちらほら
関西大 校舎内で吸っているやつがいる(!!!)
ありえないです、低ランク大・・・
やっぱりランクの低い大学出身のやつは信用できない・・・
0687デフォルトの名無しさん
2008/09/04(木) 15:19:000688デフォルトの名無しさん
2008/09/04(木) 15:20:04素人なのでどの変がうそなのか教えてください
0689デフォルトの名無しさん
2008/09/04(木) 15:45:52何しに来てるのかね?
0690デフォルトの名無しさん
2008/09/04(木) 15:50:35Haskellがどういうものだと思っているんですか?
0691デフォルトの名無しさん
2008/09/04(木) 17:36:250692デフォルトの名無しさん
2008/09/04(木) 19:33:03全角数字を見るといらっとくる人が使う言語
0693デフォルトの名無しさん
2008/09/04(木) 19:35:160694デフォルトの名無しさん
2008/09/04(木) 21:21:38それはカルシウム不足
0695デフォルトの名無しさん
2008/09/06(土) 23:15:53出来るだけ変数使わない方がいいとか、何が何でもポイントフリーにするとか、
あるいはそれ以外でも、何でも。
0696デフォルトの名無しさん
2008/09/06(土) 23:55:28y f = f (y f)
0697デフォルトの名無しさん
2008/09/07(日) 00:05:33haskellでは数学的にきれいなコードが「きれいなコード」と呼ばれます。
0698デフォルトの名無しさん
2008/09/07(日) 00:12:32意味のあるところでControl.*を使う
悪いコード:
ポイントフリーのためにControl.ApplicativeやControl.Arrowをimport
0699デフォルトの名無しさん
2008/09/07(日) 00:15:18>>687
ライブラリはそうだろうけど、普通のアプリを書くときは?
0700デフォルトの名無しさん
2008/09/07(日) 00:33:20複雑な場合には無理をしても分かりにくくなるだけだから悪い。
パターンマッチとは使いどころが違う。
0701デフォルトの名無しさん
2008/09/07(日) 00:34:19圧倒的に短く書けるからだよ。
それにポイントフリーだと関数の入出力の流れみたいなのがまっすぐ表せるから、処理の全貌が見通しやすい
0702デフォルトの名無しさん
2008/09/07(日) 00:41:52というわけで>>>使うのはやっぱダメ?逆なのに脳味噌合わせるべきなの?
0703デフォルトの名無しさん
2008/09/07(日) 00:46:480704デフォルトの名無しさん
2008/09/07(日) 00:59:26逆なの? y = f x より x f = y が脳味噌に合ってるの?
0705デフォルトの名無しさん
2008/09/07(日) 01:11:04なんでやねん。
unlines . take 10 . filter (> 10) . map read . lines
より、
lines >>> map read >>> filter (> 10) >>> take 10 >>> unlines
の方が、少なくとも俺は脳に優しく感じる。
で、こう書くと、map read と filter (> 10) を分けてるのが冗長でダサい気もするが、
(filter (> 10).read)みたいにした方が良いのか、かえってこっちの方がダサいのか、
あるいは、(filter (\x -> 10 > read x)) みたいにラムダにすべきなのか、綺麗の勘所が判らんのです。
0706デフォルトの名無しさん
2008/09/07(日) 01:12:53あ、前半がStringに戻してないのはご愛敬と言う事で、よろしく。
0707デフォルトの名無しさん
2008/09/07(日) 01:32:55String に戻さないといけないなら
filter ((10 <) . read) だろう。ラムダでもいいけど。
まあ、その辺はこだわるとこでもないかと。
> なんでやねん。
f (g x) と (f . g) x の向きは関係あるんですよ。
数学でも向き的事情から x^f という記法を使うこともある。
0708デフォルトの名無しさん
2008/09/07(日) 02:23:43左から右だろうが右から左だろうがどっちでも一緒だろ。
俺には違いが分からん。
0709デフォルトの名無しさん
2008/09/07(日) 02:27:05こういう反抗したい年頃のやつが言語を汚くしていくんだろうな。
なんでもないものを指差して「使いにくい」などと言ったり、まるでガキ。
0710デフォルトの名無しさん
2008/09/07(日) 03:31:39その方が自然に感じるのは当然と思います。
また、bind演算子が(>>=)で左結合である事を考えても
Haskellを設計した人もその方が自然と感じたのではないでしょうか?
慣れの問題かもしれませんが、
そんなにおかしな意見とは思えません。
0711デフォルトの名無しさん
2008/09/07(日) 07:34:520712デフォルトの名無しさん
2008/09/07(日) 21:48:37所詮バイクシェッド
乱用すれば読みにくいし、パズルみたいにポイントフリーするのは間違ってる
数学的に綺麗綺麗とか、圏論的に自然とかというけれど、誰でも圏論がわかるわけじゃないし。
しかし、いかにポイントフリーで書くか、という事を考えると確かにおもろいよ
0713デフォルトの名無しさん
2008/09/07(日) 21:56:43>>36
>FPGAとかのHDL記述とかに応用したりしてる人いないの?
Lavaがあるよ。並列性とか関係ないし、回路をそのまま関数で書くだけなんだけど。そしてVerilogより使いやすい、なんてこたーない。HDLよりましだが、副作用を書くのがまわりくどい
http://www.cs.chalmers.se/Cs/Grundutb/Kurser/svh/tools.html
0714デフォルトの名無しさん
2008/09/07(日) 22:31:520715デフォルトの名無しさん
2008/09/08(月) 21:55:12ArrowっぽいHDL作りたいな
0716デフォルトの名無しさん
2008/09/09(火) 18:48:21November 15, 2008
待ち遠しい。
0717デフォルトの名無しさん
2008/09/12(金) 22:50:22コスト削減の鍵は純粋関数型言語らしい
http://www.watch.impress.co.jp/game/docs/20080911/epic.htm
071836 ◆K0BqlCB3.k
2008/09/12(金) 22:54:50そうだろうね。
俺はずううっと前からそう論文に書いてたけど。
だんだんpi-calculusの人気が出てきたね。
0719デフォルトの名無しさん
2008/09/12(金) 23:58:55>将来的にゲームプログラミングはそういった処理系に移行していくべきだとした。
>Sweeney氏はそのひな形として言語“Haskel”を挙げているが、
>ゲーム開発のメインストリームたり得る言語はまだ登場しておらず、将来に期待しているという。
なんでHaskellは駄目なんだろう。
ライブラリ含めた開発環境の問題か処理系の最適化の問題か
それとも言語仕様レベルで本質的に向いていないのか。
0720デフォルトの名無しさん
2008/09/13(土) 00:06:190721デフォルトの名無しさん
2008/09/13(土) 00:09:070722デフォルトの名無しさん
2008/09/13(土) 00:48:51遅延評価って言ってみれば、後ろからの逐次でそ?
無限リスト使えないHaskellってHaskell?
0723デフォルトの名無しさん
2008/09/13(土) 07:07:420724デフォルトの名無しさん
2008/09/13(土) 08:23:12前方参照,where構文
0725デフォルトの名無しさん
2008/09/13(土) 09:32:44LETで何が不足よ?
0726デフォルトの名無しさん
2008/09/13(土) 10:42:160727デフォルトの名無しさん
2008/09/15(月) 18:14:08たとえばJavaなどではクラスのインスタンスをオブジェクトと呼びますが、
Haskellの代数的データ型に格納されたデータのことをなんと呼べば良いですか?
0728デフォルトの名無しさん
2008/09/15(月) 18:21:45関数
0729デフォルトの名無しさん
2008/09/15(月) 19:00:09「オブジェクト」に対応する用語は普通は「値」でいいんじゃないか
>Haskellの代数的データ型に格納されたデータ
これどういう意味?
型が代数的データ型であるような値のことならそのまま「代数的データ型の値」
代数的データ型の構築子に渡した値のことなら「フィールドの値」くらいか?
data Point = Pt Int Int
x = Pt 0 3
-- xはPoint型の値
-- xのフィールドの値は0と3
0730デフォルトの名無しさん
2008/09/15(月) 20:26:27ストリーム指向?
0731デフォルトの名無しさん
2008/09/15(月) 20:30:200732デフォルトの名無しさん
2008/09/16(火) 23:55:400734デフォルトの名無しさん
2008/09/17(水) 00:07:44HSHみたいなやつ
探してみた奴だとどれも開発止まってて…
0735デフォルトの名無しさん
2008/09/17(水) 00:09:070736デフォルトの名無しさん
2008/09/17(水) 00:15:110737デフォルトの名無しさん
2008/09/17(水) 00:22:13自然言語じゃないけど
0738デフォルトの名無しさん
2008/09/17(水) 15:52:290739デフォルトの名無しさん
2008/09/17(水) 17:56:300740デフォルトの名無しさん
2008/09/17(水) 18:20:560741デフォルトの名無しさん
2008/09/17(水) 18:31:27使ったこと無いなぁ。
0742デフォルトの名無しさん
2008/09/19(金) 17:29:49並行指向プログラミングというのかな?
このパラダイムはオブジェクト指向よりも現実志向のパラダイムのように思う。
Haskellでも並列化がうまくいけばerlangみたいな仕組みを実装できるかもしれない。
# erlangの構文は糞 糞 糞 糞杉
0743デフォルトの名無しさん
2008/09/19(金) 18:18:310744デフォルトの名無しさん
2008/09/19(金) 20:28:250745デフォルトの名無しさん
2008/09/19(金) 20:34:400746デフォルトの名無しさん
2008/09/20(土) 11:00:42私はProlog屋なので、erlangの構文のクソ部分に敏感でない。
お手数かけて恐縮だが、糞の部分を列挙していただけると有難いのだが。
0748デフォルトの名無しさん
2008/09/20(土) 13:08:030749デフォルトの名無しさん
2008/09/20(土) 13:29:190750デフォルトの名無しさん
2008/09/20(土) 13:56:48743ではないけど、
receive...endとか、カリー化できないとかではないですか?
0751デフォルトの名無しさん
2008/09/20(土) 14:52:33元記事ではSTMが挙げられてるけど、OCamlだと無くね?
>>749
綺麗って何が?Gtk2Hsを使ったコード?
それならあまり綺麗じゃないんじゃない。
GUIを綺麗に書くためのハイレベルなライブラリは
いろいろあるけど、どれも決定打にはなってないような。
0752デフォルトの名無しさん
2008/09/20(土) 15:23:340753デフォルトの名無しさん
2008/09/20(土) 15:27:39>>748な俺からでもそれはわかる。
0754デフォルトの名無しさん
2008/09/21(日) 00:46:57gtk_rc_parse_string相当の関数や、
gtk_widget_modify_cursor(これは新しいからか)相当の関数が見付からなくて諦めたことがあります。。
いや私の検索能力が低いだけだと思うんですが、かなり頑張ってもどうしても見つかりませんでした。。。
皆さんgtkやpango、gdkの関数を捜すときってやっぱり根性ですか?
大抵はキャメルケースにすれば大丈夫ですがそうでない時はかなり困りますよねー。。
0755デフォルトの名無しさん
2008/09/21(日) 12:17:25Gtk2Hsのソースgrepしてみて無かったら無いような。
0756デフォルトの名無しさん
2008/09/22(月) 08:20:06一週間やってもまだ終わらん
製本版はもう鈍器レベルだな
0757デフォルトの名無しさん
2008/09/22(月) 09:55:410758a36 ◆K0BqlCB3.k
2008/09/22(月) 15:02:13http://book.realworldhaskell.org/read/
0759デフォルトの名無しさん
2008/09/22(月) 16:29:270760a36 ◆K0BqlCB3.k
2008/09/22(月) 16:37:06たとえばデータベースと通信する方法とか、
GUIを作るときのライブラリとかツールとかの紹介とか、
どちらかというと「Haskell逆引きクイックリファレンス」
みたいな感じだね。
目新しいことは何もないけど、逆引きリファレンスとしてはいろんなライブラリとか紹介されていて便利かな。
0761a36 ◆K0BqlCB3.k
2008/09/22(月) 16:39:11文章の良よりコードの両方の方が多いから英語が苦手な人でもわかると思う。
0762a36 ◆K0BqlCB3.k
2008/09/22(月) 16:39:49コードの両方 → コードの量
0763デフォルトの名無しさん
2008/09/24(水) 11:57:39ERROR file:{Hugs}\packages\parsec\Text\ParserCombinators\Parsec\Token.hs:64 - Syntax error in data type declaration (unexpected `.')
とでて読み込めないのですがどうしたらいいのでしょうか
0764デフォルトの名無しさん
2008/09/24(水) 12:09:05Hugsを標準モードじゃなくて拡張モードで起動すればいい
hugs -98
0765デフォルトの名無しさん
2008/09/24(水) 12:51:18無事読み込めました。ありがとうございます
0766デフォルトの名無しさん
2008/09/24(水) 15:23:46.とか$とかの気の利いたバージョンない?
0767デフォルトの名無しさん
2008/09/24(水) 15:27:560768デフォルトの名無しさん
2008/09/24(水) 15:36:59do構文でモナドを「外す」ためだけに一時変数がやたら必要になるのがイヤって話。
つまるところ>>=になっちまいそうな気もするけど、
便利な演算子なり特殊なカッコなりで、無駄な変数使わずに何とかならんかなぁ、と。
0769デフォルトの名無しさん
2008/09/24(水) 16:11:240770デフォルトの名無しさん
2008/09/24(水) 16:18:02a <- v
b <- f a
は、aを使わずに
b <- v >>= f
と書ける
同様に、
a <- v
let b = f a
は、
b <- liftM f v
と書ける
こういう話?
>>=は普通にdo構文の内部で使えるよ
俺はこの場合=<<を使う方が好きだけど
0771デフォルトの名無しさん
2008/09/24(水) 16:26:30do ...; a <- m; f a; ...
を
do ...; f =<< m; ... -- m >>= f でも同じだけど...
とか
do ...; a <- m; let b = f a; ...; g b; ...; h b; ...
を
do ...; b <- liftM f m; ...; g b; ...; h b; ...
とかすればいいって話じゃなくて?
って書き込もうとしたんだけどその前に新着レス見たら>>770被りすぎ。
0772デフォルトの名無しさん
2008/09/24(水) 16:44:57a <- n
を
a <- join m
にするパターンもあるかも。
n <- m
o <- n
a <- o
を
a <- join (join m)
とか。
0773デフォルトの名無しさん
2008/09/24(水) 16:48:50do args <- getArgs
cnt <- getContents
now <- getClockTime
return someFunc args cnt now
を、
do return soumeFunc #getArgs #getContents #getClockTime
とかこんな感じに書けないかと。(#が架空のモナド外し演算子とか)
0774デフォルトの名無しさん
2008/09/24(水) 16:53:15ありがとう。特にjoinは使った事なかった。
俺がアホでした。
0775デフォルトの名無しさん
2008/09/24(水) 16:56:540776デフォルトの名無しさん
2008/09/24(水) 17:01:370777デフォルトの名無しさん
2008/09/24(水) 17:21:21do args <- getArgs
cnt <- getContents
return otherFunc args True cnt
だったら?
0778デフォルトの名無しさん
2008/09/24(水) 17:27:31このスレで前に同じことを書いた記憶がある
Template Haskellを使えばなんとかなるかな
>>777
liftM3 otherFunc getArgs (return True) getContents
不恰好だけど
0779デフォルトの名無しさん
2008/09/24(水) 18:03:09soumeFunc <$> getArgs <*> getContents <*> getClockTime
や
return sumFunc <*> getArgs <*> getContents <*> getClockTime
って書ける。infixl 4 # ; (#)=(<*>) とすればあのままいける。
っていうのは
(return soumeFunc) #getArgs #getContents #getClockTime
じゃなくて
return (soumeFunc #getArgs #getContents #getClockTime)
のつもりだろうから嘘だけど。
ただ、IO は Applicative のインスタンスになってるけど、
一般のモナドは WrappedMonad って型が用意されてるだけなので、ちょっと面倒。
でも Control.Monad に <*> と同じ意味の ap ってのがあってこれはどのモナドにも使える。
<$> とかの Control.Applicative にあるいろいろな関数がないけど。
あと Control.Applicative には f (a -> b) -> a -> f b な関数が無いけど
それを f *$ x = f <*> pure x とか定義すれば
liftM3 otherFunc getArgs (return True) getContents は
otherFunc <$> getArgs *$ True <*> getContents と書ける。さすがにキモイ。
0780デフォルトの名無しさん
2008/09/24(水) 18:18:11俺の見る程度の範囲じゃ<*>とかはあんま見ないけど、そういえばapは見るな。
まあ、>>698とか見ると、>>778の書き方が普通は落とし所って所かも知れんけど、調べてみます。
0781デフォルトの名無しさん
2008/09/24(水) 23:29:43私の環境では以下のエラーを吐いてbuildに失敗します。
compiling dist\build\System\Posix\DynamicLinker\Module_hsc_make.c failed
command was: C:\ghc\ghc-6.8.3\bin\ghc.exe -c -package base-3.0.2.0 -package directory-1.0.0.1 -Iinclude dist\b
uild\System\Posix\DynamicLinker\Module_hsc_make.c -o dist\build\System\Posix\DynamicLinker\Module_hsc_make.o
どなたか知恵をお貸しください
--unix.cabal
>The package is not supported under Windows (except under Cygwin).
Windowsは基本的に非サポート、
Cygwin環境下はOKという意味だと思ったんですが違いますか?
0782デフォルトの名無しさん
2008/09/24(水) 23:58:13cygwinのフォルダにあるheaderファイルの発見に失敗しているようでした。
終電の時間が近いので、検索パスの追加をした所で今日は帰ります
0783デフォルトの名無しさん
2008/09/25(木) 00:01:220784デフォルトの名無しさん
2008/09/25(木) 01:25:450785デフォルトの名無しさん
2008/09/25(木) 03:02:050786デフォルトの名無しさん
2008/09/25(木) 03:18:09そんなんじゃ社会に出てからもたんぞ。
0787デフォルトの名無しさん
2008/09/25(木) 03:51:42case でマッチング無しガードのみにすればとりあえず出来るけど、dummyや_が冗長。
case dummy of
_ | conditionA -> bar
| conditionB -> foo
otherwise -> baz
0788デフォルトの名無しさん
2008/09/25(木) 04:41:080789デフォルトの名無しさん
2008/09/25(木) 12:37:19何という優しさ。
0790デフォルトの名無しさん
2008/09/25(木) 19:56:07data X = A | B | C | D
case x of
A | B -> 1
C | D -> 2
0791デフォルトの名無しさん
2008/09/25(木) 19:58:51でも縦線だとガードに見えるから別の記号が要るな
0792781
2008/09/25(木) 20:53:49定義されていない型、定義されていない関数のエラーは
HsUnix.hに手を加えてなんとかしましたが(includeするファイルを追記)
↓結果
dist/build/System/Posix/DynamicLinker/Module_hsc_make.o(.text+0x49):Module_hsc_make.c: undefined reference to
`_impure_ptr'
dist/build/System/Posix/DynamicLinker/Module_hsc_make.o(.text+0x8d):Module_hsc_make.c: undefined reference to
`_impure_ptr'
dist/build/System/Posix/DynamicLinker/Module_hsc_make.o(.text+0xb5):Module_hsc_make.c: undefined reference to
`_impure_ptr'
dist/build/System/Posix/DynamicLinker/Module_hsc_make.o(.text+0xe9):Module_hsc_make.c: undefined reference to
`_impure_ptr'
collect2: ld returned 1 exit status
linking dist\build\System\Posix\DynamicLinker\Module_hsc_make.o failed
それはともかく、今夜はwww.haskell.orgに繋がりにくいですね
0793デフォルトの名無しさん
2008/09/26(金) 13:22:23そういう、かゆいところに手が届くのは、やっぱりLISP系最強なんだろうか。
0794デフォルトの名無しさん
2008/10/01(水) 23:03:38int numFloat;
int numInt;
float floats[numFloat];
int ints[numInt];
C的な擬似コードで書くとこんな感じのバイナリファイルに対して、
floatsとintsのデータを取ってきて文字列でフォーマット化して表示してみよう、と思っています。
hFile <- openFile filepath ReadMode
cs <- hGetContents hFile
ひとまずこれで[Char]を持ってきて、そこからnumFloatとnumIntを切り出せばよいか、
と思ってるのですが、じゃあそれってどうするんだろう、ってところで詰まってます。
(numFloat,numInt,残り) = hogeFunction cs
みたいな感じで切り出すのが関数型的な感じなのかな、と思っているのですが、
そもそもこの辺の考え方からして駄目っぽいですか?
0795初心者修業中
2008/10/01(水) 23:29:57バイナリモードじゃないとダメなんじゃないでしょうか?
こんなのがありました
↓
ttp://ha6.seikyou.ne.jp/home/yamanose/haskell/wave2.html
0796デフォルトの名無しさん
2008/10/01(水) 23:38:17ありがとうございます。
BinaryModeって付けないと駄目なのと、
あとPtrを経由してデータを取ってくるんですね。
これで勝つる!
0797デフォルトの名無しさん
2008/10/02(木) 00:03:06効率を気にするなら別だけど
0798デフォルトの名無しさん
2008/10/02(木) 00:27:22HaskellのFloatを得る手段が難しいよ。
http://thread.gmane.org/gmane.comp.lang.haskell.cafe/44845/focus=44927
0799初心者修業中
2008/10/02(木) 00:56:54テキストモードの場合、、
control-ZをEOFと認識したり、CRLFを LFに変換すると
GHCのマニュアルにありますが、
問題ないのでしょうか?
0800デフォルトの名無しさん
2008/10/02(木) 01:06:55問題ある
>>797は、バイナリモードで開いた上でgetContentsすればいい、という意味で言った
>>798
確かにそうだな
ちゃんとテストしてないけど一応こんなんでいけるみたいだ
import Data.Bits
import Data.Word
w32ToFloat :: Word32 -> Float
w32ToFloat w
| ep == 255 && sf /= 0 = 0 / 0
| sf == 255 = sign / 0
| sf == 0 && ep == 0 = sign * 0
| otherwise = sign * encodeFloat r e
where
sn = shiftR w 31
ep = shiftR w 23 .&. 0xff
sf = w .&. 0x7fffff
sign = if sn == 1 then -1 else 1
e = fromIntegral ep - 127 - 23
r = fromIntegral sf + 0x800000
0801デフォルトの名無しさん
2008/10/02(木) 01:37:29必要なのは Word32 -> Float じゃなくて [Word8] -> Float なんじゃなかろうか。
というわけでPtr経由だけど書いてみた。
import Foreign
fromBytes :: Storable a => [Word8] -> a
fromBytes bs = unsafePerformIO $ allocaArray (length bs) $ \ p -> pokeArray p bs >> peek (castPtr p)
toBytes :: Storable a => a -> [Word8]
toBytes x = unsafePerformIO $ alloca $ \ p -> poke p x >> peekArray (sizeOf x) (castPtr p)
toBytes (0.5 :: Float) => [0,0,0,63]
fromBytes [0,0,0,63] :: Float => 0.5
0802デフォルトの名無しさん
2008/10/02(木) 09:32:320803デフォルトの名無しさん
2008/10/02(木) 10:50:10システムのendian判定はこんな感じ?
isLittleEndian = (1 :: Int) == fromBytes [1,0,0,0]
isBigEndian = (1 :: Int) == fromBytes [0,0,0,1]
0804デフォルトの名無しさん
2008/10/02(木) 13:03:52- | sf == 255 = sign / 0
+ | ep == 255 = sign / 0
>>802
[Word8]からWord32を作って、そこからFloatにすればシステムのendiannessを気にする必要ないよ
この場合PtrやUArrayを経由するのでもencodeFloatでも良い
0805デフォルトの名無しさん
2008/10/02(木) 17:35:05-- import Test.QuickCheck
(f `eq` g) x = Result (Just (f x == g x)) [] [show (f x), show (g x)]
forAllBinaryFloat :: (Testable b) => ([Word8] -> b) -> Property
forAllBinaryFloat t =
forAll (choose (0,1)) $ \s ->
forAll (oneof [elements [0,255], choose (1,254)]) $ \e ->
forAll (oneof [elements [0], choose (1,2^23-1)]) $ \f ->
t (sefToBytes s e f)
sefToBytes :: Int -> Int -> Int -> [Word8]
sefToBytes s e f = endian [shiftL s' 7 .|. shiftR e' 1, shiftL e' 7 .|. f1, f2, f3]
where
[_,f1,f2,f3] = endian (toBytes f)
[s',e'] = map fromIntegral [s,e]
endian = if head (toBytes (1 :: Word32)) == 1 then reverse else id
prop_float :: (Float -> Float) -> Property
prop_float fl2fl = forAll (oneof fls) (id `eq` fl2fl)
where fls = [elements [0,{-0/0,-}1/0,-1/0], fmap (/ 2^127) arbitrary, arbitrary]
prop_bytes :: ([Word8] -> [Word8]) -> Property
prop_bytes bs2bs = forAllBinaryFloat (id `eq` bs2bs)
0806デフォルトの名無しさん
2008/10/02(木) 17:36:01test1 = prop_float (fromBytes . toBytes)
test2 = prop_float (w32ToFloat . fromBytes . toBytes)
test3 = prop_float (uncurry encodeFloat . decodeFloat)
test4 = prop_bytes (\bs -> toBytes (fromBytes bs :: Float))
test5 = prop_bytes (toBytes . w32ToFloat . fromBytes)
test6 = forAllBinaryFloat $ \bs -> not (isNaN (fromBytes bs :: Float)) ==>
(fromBytes `eq` (w32ToFloat . fromBytes)) bs
{- 1, 3 は通った。最初 NaN/=NaN をうっかりした。
w32ToFloat は非正規化数を無視してるので、2, 5, 6 が通らなかった。
4 は NaN のときに、仮数部の最上位ビットがおかしくなった。
5 は w32ToFloat は NaN を全て 0/0 にするのもあって通らなかった。
NaN の表現が変わるのは Float を解釈する場面
(つまりコピーとかじゃない)なら問題無いだろうけど。-}
0807デフォルトの名無しさん
2008/10/02(木) 21:41:10盲目的なランダムテストだけじゃないのな
概念的には、(ieee754で表現される)外部フォーマットのデータを読んで、
ネイティブのFloatに変換して使いたいのか、
それともieee754データとしてそのまま扱いたいのかでやることが変わってくるな
実際にはどうせieee754を採用してるアーキテクチャでしか動かさないから、ショートカットが効くわけだけど
0808デフォルトの名無しさん
2008/10/03(金) 01:51:57テストが元実装と結局ほとんど同じにならない?
元実装は仕様をすでに表してるわけで、その仕様にあってるか確認するコードは、
結局同じになるのは必然だと思うんだけど。
仕様から演繹出来る他の事を確認しろって事かな?
でも、演繹で導かれる事が、元仕様とは別の理由で成り立つ事もあるよね?
0809デフォルトの名無しさん
2008/10/03(金) 03:06:21ならない。>>805-806を見れば分かる通り
>元実装は仕様をすでに表してるわけで、その仕様にあってるか確認するコードは、
>結局同じになるのは必然だと思うんだけど。
そういう場合もあるし、そうでない場合もあるから、決して必然じゃない
たとえば、ソート関数が正しいかどうか確認するコードと、
実際にマージソートやクイックソートをするコードは全然違うものになる
さらに「マージソートでもクイックソートでも結果が同じになる」みたいなのもテストになるし
>でも、演繹で導かれる事が、元仕様とは別の理由で成り立つ事もあるよね?
もちろん
だれもテストで全ての誤りを発見できるとは思ってない
0810デフォルトの名無しさん
2008/10/03(金) 14:26:34>>805-806はあまりランダムである必要が無いかも。
きわどいケース(上の場合だと0、非正規化数、無限大、NaN)を
並べ上げにくい場合にランダムテストが有効な気がする。
0811デフォルトの名無しさん
2008/10/03(金) 14:35:10「正しくマージソート出来てるか」じゃなくて
「正しくソート出来てるか」のテストになるからか。
前者はQuickCheckに関わらず外部テストでは確かめようがないから、
「ソートする」じゃなくて「マージソートする」という仕様はソースレビューするしかないのか。
0812デフォルトの名無しさん
2008/10/03(金) 16:36:28結果としてのアウトプットが特徴的で綺麗な性質を持ち、
かつ、その性質自体が目的である場合に威力を発揮するって感じか。
その類の物は、性能が競われる事が多い気がするから、その辺りのサポートもあると良いかも。
0813デフォルトの名無しさん
2008/10/03(金) 18:38:09f :: A -> B のテストは
・B (or A) の == を使う場合
・一般の場合
・h :: A -> B を用意して f x == h x をテスト
・逆関数 g :: B -> A がある場合
・x == g (f x) をテスト
・y == f (g y) をテスト
・使わない場合
・r :: A -> B -> Bool をうまく用意して r x (f x) をテスト
(テストはランダムな x :: A, y :: B に対して)
大概こんな感じ。
元実装とほとんど同じテストってのは、
g やうまい r が無くて、f x == h x というテストしか無いんだけど、
f と違う h も無くて、でも f x == f x じゃバカ丸出しなので、
== を明示的には使わないで実質的に f x == f x と同じことをやる、
みたいな感じじゃないかな。
0814デフォルトの名無しさん
2008/10/03(金) 18:39:530815デフォルトの名無しさん
2008/10/03(金) 19:31:090816デフォルトの名無しさん
2008/10/08(水) 12:19:55cabal configure と runhaskell Setup.hs configure、
cabal build と runhaskell Setup.hs build、
cabal install と runhaskell Setup.hs install、
って何か違うんでしょうか。
同じだとしたらなんのために両方あるんでしょうか。
0817初心者修業中
2008/10/08(水) 15:33:21・runhaskell はHaskellのソースプログラムを実行するコマンド
・cabal はパッケージをインストールするコマンド
…と認識しています。
参考
↓
ttp://haskell.g.hatena.ne.jp/illillli/20080224
0818デフォルトの名無しさん
2008/10/08(水) 23:08:470819デフォルトの名無しさん
2008/10/09(木) 00:31:08あるとしたら runghc Setup と打つより楽だからじゃ?
0820初心者修業中
2008/10/09(木) 01:00:41参考
↓
ttp://haskell.g.hatena.ne.jp/illillli/20080224
cabal-installというパッケージにcabalというユーティリティがあった。
パッケージのダウンロードからインストールまでを自動化してくれるようだ。
0821デフォルトの名無しさん
2008/10/09(木) 04:00:42最終的にSetup.hsはなくなるかオプショナルになってcabalコマンドに統一されるんじゃない?
http://page.freett.com/shelarcy/log/2007/diary_03.html#when_we_can_use_caball-install
http://hackage.haskell.org/trac/hackage/wiki/RubyGems
現時点でのそれら重複してるコマンドの詳細は判らないけど、installについては、
cabal install monadius
monadius
で遊べるってのは、Setup.hsでは無理だろう。
0822デフォルトの名無しさん
2008/10/09(木) 04:20:27RubyGemsなんて目指されると非常に困る。
0823デフォルトの名無しさん
2008/10/09(木) 12:13:240824デフォルトの名無しさん
2008/10/09(木) 18:45:20Haskellにて、二次元配列を時計回りに90度回転させるには、どうすればいいでしょうか?
今あるコードが
rot90 list = reverse (map (head) list) : rest
where rest = if length (concat taillist) == 0 then []
else rot90 taillist
where taillist = map tail list
ですが、ものすごく非効率的だと思います。
0825デフォルトの名無しさん
2008/10/09(木) 19:03:11length (concat taillist) == 0
の部分を
all null taillist
にでもすれば別に非効率的でもない気がする
俺ならtransposeを使うな
rot90 = transpose . reverse
0826デフォルトの名無しさん
2008/10/09(木) 19:24:00素早い回答ありがとうございます。
実は、transposeも定義しないといけなく、transposeでrot90を使っているので…。
transpose list = rot90 (hflip list)
hflip list = reverse list
というふうになっております。
0827デフォルトの名無しさん
2008/10/09(木) 19:39:20そうでなくて単にtransposeが必要ってだけならその定義は捨てて
import Data.Listしてtransposeを使えば良いんじゃない?
0828デフォルトの名無しさん
2008/10/09(木) 19:45:380829デフォルトの名無しさん
2008/10/09(木) 19:53:59課題では、自分でtransposeを定義しろ、とのことでした。
0830デフォルトの名無しさん
2008/10/09(木) 20:20:13Prelude関数ではないのでData.Listをインポートしないと使えない。
>>829
だったら >>825 が最初に言ってる変更をするか、rot90を使わずにtransposeを定義すれば。
0831デフォルトの名無しさん
2008/10/09(木) 21:12:45transpose :: [[a]] -> [[a]]
transpose [] = []
transpose ([] : xss) = transpose xss
transpose ((x:xs) : xss) = (x : [h | (h:t) <- xss]) : transpose (xs : [ t | (h:t) <- xss])
0832デフォルトの名無しさん
2008/10/10(金) 06:57:02連続した半角スペースはjavascriptモードで書き込むときに置換されるらしい。
>>824-825
長方形じゃないときに、all だとエラー、any だと長方形になるように切り落とす。
filter 使えば>>831の transpose に map reverse . したような感じになる。
([<h or t> | h:t<-xss] = map <head or tail> (filter (not.null) xss))
違ったやり方なら
rot90 = foldl c []
where
c yss [] = yss
c [] xs = [[x] | x<-xs]
c (ys:yss) (x:xs) = (x:ys) : c yss xs
とか。
0833デフォルトの名無しさん
2008/10/10(金) 07:01:540834デフォルトの名無しさん
2008/10/11(土) 00:49:41パッケージの管理方法にいろいろと問題がある。
0835デフォルトの名無しさん
2008/10/11(土) 01:26:24具体的に言ってくれよ。そして開発者達にも。
0836デフォルトの名無しさん
2008/10/27(月) 20:53:56るのですが、遅延評価が効くようなコードが書けません。
type FileTree = Tree FilePathとして、以下のような関数を作ってみたのですが。
recursiveFileTree :: FilePath -> IO FileTree
recursiveFileTree name = do
contents <- catch (getDirectoryContents name) (\e -> return [])
children <- let
filtered = filter filterDots contents
pathadd = map (\x -> name </> x) filtered
mapped = map recursiveFileTree pathadd
in sequence mapped
return (Node (takeFileName name) children)
where filterDots :: FilePath -> Bool
filterDots "." = False
filterDots ".." =
filterDots _ = True
(インデントしてるように見せるために全角スペースを入れています。見えますか?)
おそらくsequenceで[IO FileTree] -> IO [FileTree]としているあたりが問題なのだと思いますが、解決策が分かりません。
0837デフォルトの名無しさん
2008/10/27(月) 22:14:59・Data.Treeを使うのをやめて、明示的なIOを伴う木を定義して使う
好きな方を選んでくれ
0838デフォルトの名無しさん
2008/10/27(月) 22:22:13IOは実行順が重要なことが多く、遅延させて順番をうやむやにすると厄介なことになりやすい
それだとどうしても不便というときのためにunsafeInterleaveIOがある
0839デフォルトの名無しさん
2008/10/30(木) 10:12:080840デフォルトの名無しさん
2008/10/30(木) 11:26:170841デフォルトの名無しさん
2008/10/30(木) 17:56:420842デフォルトの名無しさん
2008/10/30(木) 18:02:48flip (flip f b) c → 17文字
0843デフォルトの名無しさん
2008/10/30(木) 19:39:380844デフォルトの名無しさん
2008/10/30(木) 19:45:59(flip.(flip f)) b c
3引数flip
http://haskell.g.hatena.ne.jp/mr_konn/20061223/1166869265
0845デフォルトの名無しさん
2008/10/30(木) 19:54:21あと、内側の括弧は無くてもOK
0846デフォルトの名無しさん
2008/10/30(木) 21:45:300847デフォルトの名無しさん
2008/10/30(木) 23:03:150848デフォルトの名無しさん
2008/10/30(木) 23:47:190849デフォルトの名無しさん
2008/10/31(金) 08:29:54>>839
0850デフォルトの名無しさん
2008/10/31(金) 11:19:22それだと
f # b c -- \a -> f a b cと同等
と
(f #) b c -- (\a -> f a) b cと同等
を区別する必要が出てきて面倒だな
0851デフォルトの名無しさん
2008/11/02(日) 13:03:16ブログ持ってないのでここで。酒井さんのパクリ。
{-# OPTIONS -fglasgow-exts #-}
import Control.Monad (liftM2)
import Data.Either
import Test.QuickCheck
infix 4 :<->:
type a :<->: b = (a -> b, b -> a)
(.>) :: a:<->:b -> b:<->:c -> a:<->:c
(f1,g1) .> (f2,g2) = (f2 . f1, g1 . g2)
un :: a:<->:b -> b:<->:a
un (f,g) = (g,f)
type a :+: b = Either a b
infixr 5 :+:
alt :: a:+:b :<->: b:+:a
alt = (f,f) where f = either Right Left
swap :: a:+:b:+:c :<->: b:+:a:+:c
swap = (f,f) where f = either (Right . Left) (either Left (Right . Right))
rt :: b :<->: c -> a:+:b :<->: a:+:c
rt (f,g) = (r f, r g) where r = either Left . (Right .)
0852デフォルトの名無しさん
2008/11/02(日) 13:04:16fold :: a:+:(T,(T,a)) :<->: (T,a)
fold = (f,g)
where
f (Left a) = (L,a)
f (Right (t1,(t2,a))) = (N t1 t2,a)
g (L,a) = Left a
g (N t1 t2,a) = Right (t1,(t2,a))
h :: (T,a) :<->: a:+:(T,a):+:(T,(T,(T,a)))
h = un fold .> rt (un fold)
s :: a:+:(T,(T,(T,a))) :<->: (T,a):+:(T,(T,(T,(T,a))))
s = rt (un fold .> alt) .> swap .> rt fold .> alt
0853デフォルトの名無しさん
2008/11/02(日) 13:05:44st =
-- T
h
-- 1 + T + T^3
.> swap
-- T + 1 + T^3
.> rt (s .> s .> s .> s
-- T + T^4 + T^7
.> alt)
-- T + T^7 + T^4
.> swap
-- T^7 + T + T^4
.> rt (s .> s .> s .> s .> s)
-- T^7 + T^6 + T^9
.> swap
-- T^6 + T^7 + T^9
.> un h
-- T^7
0854デフォルトの名無しさん
2008/11/02(日) 13:08:02arbitrary = oneof [return L, liftM2 N arbitrary arbitrary]
main :: IO ()
main = do
quickCheck $ \x -> x == (snd st (fst st x) :: (T,()))
quickCheck $ \x -> x == fst st (snd st x :: (T,()))
型検査で漏れてるのは fold の定義ぐらいで、QuickCheck 意味ないのかも。
0855デフォルトの名無しさん
2008/11/03(月) 11:50:000856デフォルトの名無しさん
2008/11/05(水) 07:40:020857デフォルトの名無しさん
2008/11/05(水) 08:34:43みたいなテクニックが沢山載ってるようなページを教えてください
0858デフォルトの名無しさん
2008/11/05(水) 12:06:08unsafeInterleaveIO (IO m)
= IO ( \ s -> let
r = case m s of (# _, res #) -> res
in
(# s, r #))
この#って何なんですか?ghc6.8.2ではエラーになりますし…
0859デフォルトの名無しさん
2008/11/05(水) 12:38:02unboxed tupleってやつだね。
http://itpro.nikkeibp.co.jp/article/COLUMN/20070206/260872/?ST=develop&P=2
>>856
Windows版を入れてみたんだけど、ライブラリの置き場所がキモイな。
6.8だと$topdir/lib以下に入ってたのが6.10.1だと$topdirに入ってる。
キモイし$topdirの見通しも悪いので6.8と同じように$topdir/libの中に移動して
package.confの中の$topdir\\を$topdir/lib\\に全置換した。
0860デフォルトの名無しさん
2008/11/05(水) 14:29:51ありがとうございました
拡張構文なんですね
0861デフォルトの名無しさん
2008/11/06(木) 23:45:000862デフォルトの名無しさん
2008/11/08(土) 00:10:49Haskellの処理系だけを使って、prologみたいなことができないか調べています。
↓でprologのタプル parent(tom, bob). のような感じにすると、
parent::[Char]->[Char]->Bool
parent "tom" "bob" = True
parent "liz" "bob" = True
parent "mike" "liz" = True
parent _ _ = False
とりあえず、
main = print $ parent "tom" "bob"
main = print $ parent "mike" "bob"
で True や False が出て、prologっぽくなります。
そこで、
parent X "bob"
という質問に対し、
X=tom
X=liz
みたいに変数にユニファイするような定数を手に入れるような仕組みってあるでしょうか?
入門書に、コンパイル時に内部でグラフを作るみたいな話が書いてあったので、
そのグラフを参照できるようなことができれば実現できると思うのですが、無理でしょうか?
0863デフォルトの名無しさん
2008/11/08(土) 00:23:23無理
Haskellの関数は文字通り関数なので、引数を放り込んで結果を観察する他に使い道は無い
0864デフォルトの名無しさん
2008/11/08(土) 00:43:200865デフォルトの名無しさん
2008/11/08(土) 01:15:29グラフ簡約のことを言ってるのなら、グラフが作られるのは実行時だし、
要するに「未評価の式」を表してるだけだから、それを見ても>>862みたいなことをする助けにはならんよ
0866デフォルトの名無しさん
2008/11/08(土) 01:27:35Haskellって厳格な言語で、その手の変なことは基本的にできないよ。
何をやりたいのか知らないけど、インタプリタ的なものを書いて、
それをライブラリとして使えば?
0867デフォルトの名無しさん
2008/11/08(土) 01:38:050868デフォルトの名無しさん
2008/11/08(土) 02:16:43先にグラフを作って、実行時に、そこにデータを流し込むような感じの説明があったから、
処理系をそのまま利用して、かなり高速なデータベースが作れると思ったんですけどダメですかね。
実現できればprologよりも表現能力が高いから面白そうだと思ったんですが。
0869デフォルトの名無しさん
2008/11/08(土) 03:27:38これはその通り
>先にグラフを作って、実行時に、そこにデータを流し込む
これはぜんぜん違う
多分どこかで誤読してると思う
0870デフォルトの名無しさん
2008/11/08(土) 11:40:05zs <- everything
append [1..100] [1..100] zs
こういうやり方じゃ生きてるうちに終わらないかもよ。
Listモナドは、もちろんユニフィケーションや制約伝播なんて無くて、
総当りで解を求めようとする非決定性計算ってだけなんで。
0871デフォルトの名無しさん
2008/11/08(土) 11:50:02http://okmij.org/ftp/Prolog/Arithm/DefinitionTree.hs
いまいち使い方はわからんけど、ググったら見つかったので貼っておく。
0872デフォルトの名無しさん
2008/11/08(土) 20:48:35failや[]で枝狩り
0873デフォルトの名無しさん
2008/11/09(日) 00:44:22変数をどう表現して、何をどう枝刈るの?
0874デフォルトの名無しさん
2008/11/22(土) 08:25:24Real World Haskellは糞本だと思う
0875デフォルトの名無しさん
2008/11/23(日) 12:49:160876デフォルトの名無しさん
2008/11/25(火) 23:01:38ttp://d.hatena.ne.jp/mokehehe/20081124/rwh
0877デフォルトの名無しさん
2008/11/25(火) 23:27:230878デフォルトの名無しさん
2008/11/25(火) 23:41:58マイナーな言語だけど、微妙にブームになってるし
来年ぐらいに出版されたりするかなあ?
0879デフォルトの名無しさん
2008/11/25(火) 23:48:260880a36 ◆K0BqlCB3.k
2008/11/25(火) 23:50:52最近は沈静化したように見せかけて、ジワジワきてるよ。
各大学の卒研レベルではHaskellやったりしてるところが増えてきてる。
0881デフォルトの名無しさん
2008/11/26(水) 00:04:130882a36 ◆K0BqlCB3.k
2008/11/26(水) 00:08:270883デフォルトの名無しさん
2008/11/26(水) 00:12:16ふつケルの次くらいに読む分には悪くないと思う>RWH
タダだし
0884デフォルトの名無しさん
2008/11/26(水) 00:17:39翻訳本が出るまでそれですまそうかなw
0885デフォルトの名無しさん
2008/11/26(水) 00:19:3411章からはページを増やすためにネタを書きましたって
レベルのオナねたのオンパレードだぞ
0886デフォルトの名無しさん
2008/11/26(水) 00:36:340887デフォルトの名無しさん
2008/11/26(水) 00:45:560888デフォルトの名無しさん
2008/11/26(水) 00:49:090889デフォルトの名無しさん
2008/11/26(水) 01:23:560890デフォルトの名無しさん
2008/11/26(水) 01:48:330891デフォルトの名無しさん
2008/11/26(水) 07:48:38Cardelli読め
0892デフォルトの名無しさん
2008/11/26(水) 13:02:02と
Programming in Haskell
のどちらがお勧めですか?ふつけるの次くらい。
0893デフォルトの名無しさん
2008/11/26(水) 21:24:32下手糞な翻訳の恐れ大。最近多いね、いや昔からか
0894デフォルトの名無しさん
2008/11/26(水) 22:52:490895デフォルトの名無しさん
2008/11/27(木) 19:14:12自分はふつけるの後にCraftでした。というか、その間にSICPが
あるので、あんまり参考にならないかな。ふつける読んでも
ちょっとピンとこなかったんですね、よくまとまってるとは思うのですが。
自分は普通の文系プログラマで、関数型プログラミングの世界とは
無縁だったので、SICPをくぐる必要があったと感じてます。
0896デフォルトの名無しさん
2008/11/27(木) 19:30:500897デフォルトの名無しさん
2008/11/27(木) 19:55:34あとはReal Worldみたいな実用面を書いたものになりますかね。
0898デフォルトの名無しさん
2008/11/27(木) 20:02:060899デフォルトの名無しさん
2008/11/28(金) 20:17:320900デフォルトの名無しさん
2008/11/28(金) 22:32:120901デフォルトの名無しさん
2008/11/28(金) 23:59:300902デフォルトの名無しさん
2008/11/29(土) 00:04:26ってのをやってますが、練習問題の回答とかどっかに転がってますでしょうか。
0903デフォルトの名無しさん
2008/11/29(土) 11:25:49著者本人が公開してる。あとは自分で探せクズ。
0904デフォルトの名無しさん
2008/11/29(土) 11:27:36おめーがクズだろ
この引きこもりw
0905デフォルトの名無しさん
2008/11/29(土) 21:15:400906デフォルトの名無しさん
2008/11/29(土) 22:05:13maximaと比べると
言語から直接利用するときの利用しやすさは、どんな感じなのでしょうか?
0907デフォルトの名無しさん
2008/11/30(日) 09:20:370908902
2008/11/30(日) 09:56:28自分では探してみましたが、部分的なコードだけしか見つけられませんでした。
ちなみに、自分は学生ではないんです。輪読の場があったりしたら入りたい
ですけど、ちょっと今は時間的に厳しいかな。ネットでやってたりするといいん
ですが。
0909デフォルトの名無しさん
2008/11/30(日) 16:00:410910デフォルトの名無しさん
2008/11/30(日) 21:28:442021年4月19日に出るみたいです。
まだ相当先ですね。
0911デフォルトの名無しさん
2008/12/01(月) 20:25:35今度はありえないくらいに延ばしたな・・・
0912デフォルトの名無しさん
2008/12/07(日) 12:54:19Linux 上だとちゃんと動いて便利だったのでショックです。
ネット探してみると rlwrap 使えとかあったけど
rlwrap って動的な補完(スコープ内の関数一覧等)
って可能なんでしょうか。
0913デフォルトの名無しさん
2008/12/07(日) 13:54:210914デフォルトの名無しさん
2008/12/07(日) 13:56:280915902
2008/12/07(日) 20:05:48書いてありました。これって個人でも送ってくれるのでしょうかね。
ただ、まだ半分ぐらいなんですけど、問題簡単なので別に解答不要
になりそうです。ありがとうございました。
0916デフォルトの名無しさん
2008/12/13(土) 18:52:49do;putStr "a\n";putStr "b\n";putStr "c\n";
≡
putStr "a\n" >>= (\_->putStr "b\n" >>= (\_-> putStr "c\n"))
なんですかね?
右結合的になったり匿名関数に変換されたりと難しいです
0917a36 ◆K0BqlCB3.k
2008/12/13(土) 19:06:24一緒です。
でも
putStr "a\n">>putStr "b\n">>putStr "c\n"
と書いた方がきれいですよ。
0918a36 ◆K0BqlCB3.k
2008/12/13(土) 19:06:570919デフォルトの名無しさん
2008/12/14(日) 10:36:09ありがとうございました
0920デフォルトの名無しさん
2008/12/14(日) 15:42:38fold/undold、flip とかを使った関数合成がすげえ苦手なんですが
このあたりに特化した書籍とかってないでしょうか
モナドとか継続とかはわりとどうでもいいんですが
0921デフォルトの名無しさん
2008/12/14(日) 16:19:34birdがそういうの得意な人だから、
Introduction to Functional Programming using Haskell
http://www.amazon.com/Introduction-Functional-Programming-using-Haskell/dp/0134843460/
"Using Haskell"じゃない前の版の方がその辺は内容が濃かった。
The Algebra of Programming
http://www.amazon.com/Algebra-Programming-Prentice-Hall-International-Computer/dp/013507245X/
は関数合成、変形ドリルみたいな内容だった。
たしかparserを必要な機能を持つように変形する論文もあったはず。
0922デフォルトの名無しさん
2008/12/14(日) 17:06:400924デフォルトの名無しさん
2008/12/15(月) 17:13:13cfold' f z [] = z
cfold' f z (x:xs) = f x z (\y -> cfold' f y xs)
という継続fの与え方次第でfoldlにもfoldrにもなるものが出てきたんですが
普通のfoldlやfoldrの定義からこれを導きだす手順のようなものがあるなら知りたいです
また「なんでも再帰」流に一つ引数増やして、最後にそれを必ず呼び出すようにして
末尾再帰の形に直していく…ってやり方で書こうとしてますがさっぱりです
0925デフォルトの名無しさん
2008/12/16(火) 12:48:15fac 0 = 1
fac n = n * fac (n-1) なのか
fac n = fac (n-1) * n なのかってことだから、
fac n = ((n *) . fac) (n-1)あるいは、
fac n = ((* n) . fac) (n-1)
fac n = (((\m ->(m *)) n) . fac) (n-1)あるいは、
fac n = (((\m ->(* m)) n) . fac) (n-1)
fac0 f n = ((f n) . (fac0 f)) (n-1)で
fac0 (\m ->(m *)) nあるいはfac0 (\m ->(* m)) n
\m ->(m *)と\m ->(* m)は、
fac(n-1)を計算した後にすべき計算、つまり継続になっています。
0926デフォルトの名無しさん
2008/12/16(火) 12:51:01その累積演算を関数に独立させると、foldの性質上、継続的になるのです。
mapだとこうはなりません。
0927デフォルトの名無しさん
2008/12/16(火) 22:40:24ところがどっこい、この説明のすぐ後で、
「CPSを使ってmapとfilterを書け」なんて演習問題が出されてるわけですよ。
それを考えると、foldlの定義からcfold'へ持っていってあげたほうが
親切かもしれません。
0928デフォルトの名無しさん
2008/12/16(火) 22:53:36「yet another haskell tutorial の cfold' の説明」のことね。
0929デフォルトの名無しさん
2008/12/16(火) 23:38:03cfold'は、元のfold*の引数に渡す演算自体が継続的になるのに対して、
mapでは引数に渡す演算ではなくて、:が継続的になるわけです。
だからYAHTでは微妙に表現を変えています。
map f = foldr (\x -> ((f x) :)) []
ですから当たり前ですけども。
0930デフォルトの名無しさん
2008/12/19(金) 19:38:36すまん、「継続的」という言葉の意味がさっぱり分からん。
CPSにしたときに最後に行われる計算、という意味なら、
foldlは「foldl」自体が継続的、
foldrは引数として渡す関数「f」が継続的ということになるので、
fold*で継続的となる関数が同じになるとは思えない。
0931デフォルトの名無しさん
2008/12/21(日) 19:58:16Charの仕様からして、 >>5の「i. CharをUnicodeとして扱う」が筋と思いますが、
リテラルはともかく、IOでの変換のスタンダードな方法はもう固まってきてるでしょうか。
http://blog.kfish.org/2007/10/survey-haskell-unicode-support.html によると、
メジャーな方法が3つあるらしいですが、どれか、もしくはどれかがdefactoになっているでしょうか。
Haskell'でも使えるのがいいですが…。
0932デフォルトの名無しさん
2008/12/21(日) 22:14:480933デフォルトの名無しさん
2008/12/24(水) 03:05:00本人ではないが、
fが継続的(serial):
どのxに対してもあるyが存在してf x yという関係が成り立つ。
クリプキの様相論理で出てくる、でも多分、その意味で使っている
わけではないと思うけど。
0934デフォルトの名無しさん
2008/12/24(水) 21:30:39・空でない集合W(要素は可能世界)と、W中の二項関係(到達可能性関係)Rの組をフレームと呼び、F=<W,R>と表す
・そこから到達可能な世界が一つもない世界を dead end と呼ぶ
・Rがserialである⇔∀w∃w'(wRw') = そのフレームには dead end が存在しない
とすると
「必然的にAならAは可能である (□A->◇A)」がフレームFで妥当 ⇔ Rがserialである
…学生の頃のノート読み返してみたがわけわかんね('A`)
0935デフォルトの名無しさん
2008/12/25(木) 02:07:28ある世界で□Aが成立するとは、そこから到達可能な世界全てでAが成立することで
ある世界で◇Aが成立するとは、そこから到達可能な世界のなかに、Aが成立する世界があること
という認識でいいのかな。
ある世界で、任意の論理式Aについて『□A→◇A』が成り立つなら、『(◇A)∨(◇¬A)』。
つまり、その世界から到達可能な世界のなかに、Aが成立するものかあるか、¬Aが成立するものがある。
結局、『□A→◇A』は「到達可能な世界が少なくとも1つあり、その世界でのAの成否には言及しない。」と言っているんだろう。
で、全ての世界で『□A→◇A』が成立するなら、全ての世界が「次の世界」を持ち、dead endが存在しない、と。
0936デフォルトの名無しさん
2008/12/25(木) 15:44:560937デフォルトの名無しさん
2008/12/26(金) 15:26:050938デフォルトの名無しさん
2008/12/26(金) 21:21:340939デフォルトの名無しさん
2008/12/26(金) 21:46:540940デフォルトの名無しさん
2008/12/26(金) 23:20:060941デフォルトの名無しさん
2008/12/27(土) 15:24:26むしろHaskell的にどう解釈すればStringとIO Stringの区別がつくの?
0942デフォルトの名無しさん
2008/12/27(土) 15:39:30例えば、ファイル全体を文字列にして返すreadFileは、
readFile :: FilePath -> IO String
0943デフォルトの名無しさん
2008/12/27(土) 16:22:29newtype IO a = IO (State# RealWorld -> (# State# RealWorld, a #))
IOの実体は現実世界の状態をとって、IO動作実行後の状態と型aをもつ値の組を返す関数
と読めるけどいまいち釈然としないなー
まともに理解するには圏論や時相論理とかの知識がいるのかな?
0944デフォルトの名無しさん
2008/12/27(土) 16:48:09エラーが起きたかどうかとか、
readLineだと、どこまで読んだかとか、
writeFileだと、書き込んだファイルとか、
そんなのがIOの「状態」。
0945デフォルトの名無しさん
2008/12/27(土) 17:36:07Stateモナドの一種だけど runState を書かなくてもいい特別
扱いされたものだと理解している。
0946デフォルトの名無しさん
2008/12/27(土) 22:26:090947デフォルトの名無しさん
2008/12/28(日) 19:54:43そういうものと認識していればいいのね
で、IO StringからStringってどうやって取り出せるの?
入門書嫁ですねわかりました
0948デフォルトの名無しさん
2008/12/28(日) 20:23:310949デフォルトの名無しさん
2008/12/29(月) 11:11:320950デフォルトの名無しさん
2008/12/29(月) 12:19:22トップレベルで扱っていると思っているのはStringじゃなくてIO String。
0952デフォルトの名無しさん
2008/12/29(月) 12:27:41しかしそういうCUIインターフェースを作るフレームワークって既に誰か作ってそうな気もする
0953デフォルトの名無しさん
2008/12/29(月) 12:38:020954デフォルトの名無しさん
2008/12/29(月) 12:38:38つ $(GHC)/compiler/ghci/InteractiveUI.hs
0955デフォルトの名無しさん
2008/12/29(月) 14:08:02つ>>=
0956デフォルトの名無しさん
2008/12/30(火) 00:58:13どんな式からexpectedやgotが算出されたかとか、
このテストケースが書かれたのはソースのn行目、m項目であるとかを表示できるんだねぇ
これ使えばHUnitもRspecとかみたいにテスト結果をもっとkwsk表示するようになるんだろうか
0957デフォルトの名無しさん
2008/12/30(火) 11:12:180958デフォルトの名無しさん
2009/01/01(木) 13:00:08使い方が全然わからねぇ…
Q [Dec]を要求するtestsって何!?
0959デフォルトの名無しさん
2009/01/01(木) 14:45:43GHC-6.10 + OpenGL + GLUT の環境で
renderPrimitive LineLoop $ mapM_ vertex [Vertex2 (-0.9) (-0.9), Vertex2 0.9 (-0.9), Vertex2 0.9 0.9, Vertex2 (-0.9) 0.9]
↑これをGHCiで入力すると IO () として正常に扱ってくれるんだが
GHCでソース中に書くと
「Ambiguous type variable `a' in the constraints: `VertexComponent a' arising from a use of `vertex'」
「Probable fix: add a type signature that fixes these type variable(s)」
とか怒られるんだが…
どこでどうダウンキャスト(?)すればいいのかわからない
エロいひとご教示おねがいします
0960デフォルトの名無しさん
2009/01/01(木) 15:39:19renderPrimitive LineLoop $ mapM_ vertex [Vertex2 (-0.9 :: Float) (-0.9), Vertex2 0.9 (-0.9), Vertex2 0.9 0.9, Vertex2 (-0.9) 0.9]
~~~~~~~
しょぼくてごめん^^
0961デフォルトの名無しさん
2009/01/09(金) 13:20:33正直、みんな引いてると思うんだよね。
新規参入者が減るからHaskellの話と圏論の話は別のMLに分けた方が良いと思うんだ。
0962デフォルトの名無しさん
2009/01/09(金) 14:02:50直接そのMLで家よバカ
0963デフォルトの名無しさん
2009/01/09(金) 14:09:20代わりに言ってよ
俺は他人の反感買いたくないんだ
0964デフォルトの名無しさん
2009/01/09(金) 14:16:030965デフォルトの名無しさん
2009/01/09(金) 14:43:460966デフォルトの名無しさん
2009/01/09(金) 14:51:32単にモナドが圏論チックなだけ。
圏論の議論は圏論のメーリングリストでやればいい。
0967デフォルトの名無しさん
2009/01/09(金) 15:12:020968デフォルトの名無しさん
2009/01/09(金) 15:44:39そんなことで剣呑するより圏論する方がいいじゃないか。
0969デフォルトの名無しさん
2009/01/09(金) 15:58:050970デフォルトの名無しさん
2009/01/09(金) 15:59:56数学じゃ普通に使う。
HaskellのMLに来てるやつは数学系のMLについて行けなかった奴らだろうな。
0971デフォルトの名無しさん
2009/01/09(金) 16:03:330972デフォルトの名無しさん
2009/01/09(金) 16:34:230973デフォルトの名無しさん
2009/01/09(金) 19:32:17ベスト11に入ってる。配下のProgrammingでは5位。
すごいな。Haskellってこんなに流行ってるのか…
0974デフォルトの名無しさん
2009/01/10(土) 08:49:400975デフォルトの名無しさん
2009/01/10(土) 09:28:000976デフォルトの名無しさん
2009/01/10(土) 12:42:47尼の情報操作
0977デフォルトの名無しさん
2009/01/10(土) 12:45:490978デフォルトの名無しさん
2009/01/11(日) 22:07:350979デフォルトの名無しさん
2009/01/12(月) 06:03:33これはHaskell初心者向けかな?
schemeとocamlの基本は理解してる程度。
0980デフォルトの名無しさん
2009/01/12(月) 06:15:480981デフォルトの名無しさん
2009/01/12(月) 06:43:10レス数が950を超えています。1000を超えると書き込みができなくなります。