[過去ログ]
関数型プログラミング言語Haskell Part16 (978レス)
関数型プログラミング言語Haskell Part16 http://echo.5ch.net/test/read.cgi/tech/1317958045/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
299: デフォルトの名無しさん [sage] 2011/10/27(木) 23:47:18.79 >>298 「できない」アプローチが「ある」っていう概念が理解できないから説明してくれろ http://echo.5ch.net/test/read.cgi/tech/1317958045/299
300: デフォルトの名無しさん [sage] 2011/10/28(金) 00:14:33.39 >>295 >全部一緒なんじゃなかろうな 284〜296まで一人で自演乙 でも、こんな過疎スレで一時間ちょいで十レス以上とか、 もうちょっとリアリティってヤツを考えたほうがいいね。 http://echo.5ch.net/test/read.cgi/tech/1317958045/300
301: デフォルトの名無しさん [sage] 2011/10/28(金) 02:56:26.22 Haskellでプロトタイピングをするとき、ここから作ってく、こうやって作っておけば後からの変更に強い、 みたいな作法って持ってます? ある組成式を受けとったら、その分子の平均質量とかマススペクトルとかを返してくれるような プログラムを書いてみようかと思ったんだけど、まず基本となる原子のデータ型から作っていって、 data Atom = Atom { abbr::Char, abundance::Distributions } type Distributions = [(Int,Double)] とか定義しておいて、average :: Atom -> Doubleやspectrum :: Atom -> (Int -> Double) みたいな関数を作り、組成式はtype Molecule = [(Atom,Int)]としてみようか、と考えています。 で、Atomを拡張してname::Stringみたいな値も格納しておこうか、と思いついたとき、 Atom型の値の中身をパターンマッチで分解している部分は全て書き直さなければならなくなります。 変更に弱いから、手探りでコーディングをしているときはパターンマッチによる分解は使うべきじゃない、ということで良いのでしょうか。 http://echo.5ch.net/test/read.cgi/tech/1317958045/301
302: デフォルトの名無しさん [sage] 2011/10/28(金) 03:18:36.06 >>301 とりあえず、その個別の問題に対しては、 data T1 = T1 { c :: Char } data T2 = T2 { d :: Char, s :: String} f T1{c = 'a' } = "c is 'a'" f T1{c = c } = "c is not 'a': " ++ show c g T2{d = 'a' } = "d is 'a'" g T2{d = d } = "d is not 'a': " ++ show d 以上のパターンを用いることによって対処できる さらに、 h t2@T2{d = 'b' } = t2{d = 'c', s ="foo" } のようにasパターンと組み合わせることものできるから、かなりの柔軟性が確保できるはず。 http://echo.5ch.net/test/read.cgi/tech/1317958045/302
303: 302 [sage] 2011/10/28(金) 03:20:39.58 ごめん。捕捉。 T1とT2は、別の型というよりも、変更前の型と変更後の型をシミュレートしていると考えて。 だから、このコードではcとdは別の識別子だけど、変更前と変更後で同じ識別子にすることができる。 http://echo.5ch.net/test/read.cgi/tech/1317958045/303
304: デフォルトの名無しさん [sage] 2011/10/28(金) 07:47:46.60 >>301 > Atom型の値の中身をパターンマッチで分解している部分 ここが元凶じゃないかな Atom型の値の中身をパターンマッチで分解するのなら、 何の為に abbr 関数や abundance 関数を定義したの? パターンマッチで分解するんじゃなく、 これらの関数を使って中身を取得すべきじゃないの? パターンマッチだと型の構成を固めちゃうよ ちなみに、見た目よく似た問題に Expression Problem というのがある data X = A | B という型をパターンマッチで A B 仕分けしている関数が多くあり、 そこに新たに C という値構築子を追加したいが、修正すべき関数が多くて大変 なんとか楽にしたい、ついでにできれば再コンパイルしたくない そういう場合なら、たとえばこことか日本語で分かりやすい http://d.hatena.ne.jp/maoe/20101214/1292337923 http://echo.5ch.net/test/read.cgi/tech/1317958045/304
305: デフォルトの名無しさん [sage] 2011/10/28(金) 08:16:42.39 >>301 普通はデータ構築子をmodule外に非公開にすることで 内部構造を隠匿する よくあるOOP言語ではclassが抽象データ型の単位だけど Haskellだとmoduleになる http://echo.5ch.net/test/read.cgi/tech/1317958045/305
306: 301 [sage] 2011/10/28(金) 09:25:56.34 >>302すいません、パターンマッチでの分解に、record syntaxを含めていませんでした。 haskellの入門書などではdata X = MkX Int Double Charなどとしておいて、 f (X i d c) = ...と記述することが「できる」とあったのですが、これって便利なのか?と疑問に思ったのです。 >>304確かにアクセッサ関数を定義しているので、型に何かを追加する可能性がある場合は 柔軟性を保てるのですが、例えば存在比を(Int,Double)のリストで表すよりもData.Mapで表す方がベターだと思った場合、 やっぱり変更先が多くなりそうになって嫌だなあと思った次第でして。 >>304のリンク先の方法がスマートに見えるので試してみたいと思います。 最終的には原子に限らず、平均値と分布を出せるようになりたいので、averageやspectrumをAtomだけに制限するのは良い手じゃなさそうです。 http://echo.5ch.net/test/read.cgi/tech/1317958045/306
307: デフォルトの名無しさん [sage] 2011/10/28(金) 12:53:34.49 >>306 > 例えば存在比を(Int,Double)のリストで表すよりもData.Mapで表す方がベターだと思った場合 そういう場合は、Data.Map 型を使ったコンテナに対するアクセス関数を公開して、 そのコンテナ内部で Data.Map 型を使っていることは隠蔽しておく >>305 も同じ様なことをアドバイスしている こうやって、データとそのユーザとの間にインターフェースを設けるのは、 Haskell に限らず、まず間違いなく全ての言語で共通する考え方 CICP 的に言えば「抽象の壁」だ ちなみに、>>304 の後半で紹介した Expression Problem は、 少なくとも >>301 から読み取れる問題とは別ものと思われる (応用できるかどうかは分からないけど) http://echo.5ch.net/test/read.cgi/tech/1317958045/307
308: デフォルトの名無しさん [sage] 2011/10/28(金) 12:54:58.72 >>307 すまん 誤) CICP 的に言えば 正) SICP 的に言えば http://echo.5ch.net/test/read.cgi/tech/1317958045/308
309: デフォルトの名無しさん [sage] 2011/10/28(金) 18:25:33.57 ようやく少しモナドの感覚がつかめた。あれって世界を分けてて、その世界の中 で作業をしていくための工夫という感じだな。ってね。安全な作業をするには必 要なんだってのもようやくわかった。 同時に感覚的なイメージでモナドを上手に例えて伝えるようなものがあまりない のかもとも思ったかな。水中で普通のデジカメで撮影をするには防水ケースの中 に入れて使うけど、あの防水ケースっぽい働きなんだなってね。そんなアナロジー を想像してしまったかな。 http://echo.5ch.net/test/read.cgi/tech/1317958045/309
310: デフォルトの名無しさん [sage] 2011/10/28(金) 19:10:16.64 >>309 > 同時に感覚的なイメージでモナドを上手に例えて伝えるようなものがあまりない > のかもとも思ったかな。 確かにね hage :: [Int] hage = do x <- [1..5] when (x == 3) (fail "discard") return x こういうのだと、どの世界とどの世界に分けてるのか曖昧だし 明確に分けられたとしても、その世界に何かを閉じ込めているのとも違う気がする http://echo.5ch.net/test/read.cgi/tech/1317958045/310
311: デフォルトの名無しさん [sage] 2011/10/28(金) 20:14:47.39 リストモナド自体が分岐した世界を表現してるからな http://echo.5ch.net/test/read.cgi/tech/1317958045/311
312: デフォルトの名無しさん [sage] 2011/10/28(金) 20:59:44.73 >>311 いや、たがら、そのリストモナドが分けた2つの世界は何と何か という辺りが自分では上手く説明できないなぁと http://echo.5ch.net/test/read.cgi/tech/1317958045/312
313: デフォルトの名無しさん [sage] 2011/10/28(金) 21:06:31.22 do内の世界はdoの流儀に従ってる。だけど、do外の世界はdo内のことには 結果を渡される以外無関係ってと事だろう? http://echo.5ch.net/test/read.cgi/tech/1317958045/313
314: デフォルトの名無しさん [sage] 2011/10/28(金) 21:31:03.44 do ってただの糖衣構文じゃん、世界の構成要素ではないでしょ >>310 のは実質これ hage :: [Int] hage = [1..5] >>= \x -> when (x == 3) (fail "discard") >> return x >>313 の言う流儀というのは、結局 Monad クラスのインスタンスの定義方法、だよね (>>= 関数をどう定義するか、return 関数をどう定義するか、など) でもそれは、たとえばアローでも同じ事が言えて、 proc do内の世界はproc doの流儀に従ってる・・・ つまり Arrow クラスのインスタンスの定義方法がその流儀となる じゃあ、アローもモナドと同じように、世界を2つに分けているのかな 分けているのなら、モナドが分ける世界とアローが分ける世界は何が違う? そこまで考えて初めて、モナドが何をどう分けているのか、 ということの理解に繋がると思う http://echo.5ch.net/test/read.cgi/tech/1317958045/314
315: デフォルトの名無しさん [sage] 2011/10/28(金) 21:46:35.52 むしろ分けてるんじゃなくて繋げてる http://echo.5ch.net/test/read.cgi/tech/1317958045/315
316: デフォルトの名無しさん [sage] 2011/10/28(金) 21:47:25.84 床下配線 http://echo.5ch.net/test/read.cgi/tech/1317958045/316
317: デフォルトの名無しさん [sage] 2011/10/29(土) 00:06:08.58 いろんな意見ありがとうございます。アローのことはそもそも知らないくらい なので、また探ってみたい。やっと面白いと思うことが増えてきた感じです。 arrowのことは他の理解を終えてから取っかかるよ。 実はRWHをようやく半分まで消化したところ http://echo.5ch.net/test/read.cgi/tech/1317958045/317
318: デフォルトの名無しさん [sage] 2011/10/29(土) 10:48:25.49 core言語のパーサーを作ろうとしているのですが、 他にこれは読んでおけ、このページは見ておけというものはありますか? http://echo.5ch.net/test/read.cgi/tech/1317958045/318
319: 318 [sage] 2011/10/29(土) 10:50:44.72 >>318 書き忘れていました 今は Haskell Platform 内のドキュメントを読んでいます http://echo.5ch.net/test/read.cgi/tech/1317958045/319
320: デフォルトの名無しさん [sage] 2011/10/29(土) 11:06:24.93 >>318 Haskell Report http://echo.5ch.net/test/read.cgi/tech/1317958045/320
321: デフォルトの名無しさん [sage] 2011/10/29(土) 12:31:01.72 >>320 ありがとうございます そうですね、元の Haskell の仕様を読んでおくのは当然ですね 熟読します http://echo.5ch.net/test/read.cgi/tech/1317958045/321
322: デフォルトの名無しさん [sage] 2011/10/29(土) 14:25:06.17 extcoreパッケージのソースコード http://echo.5ch.net/test/read.cgi/tech/1317958045/322
323: デフォルトの名無しさん [sage] 2011/10/29(土) 14:44:46.62 >>322 ありがとうございます Webサイトや README をざっと見た感じ、自分でパーサーを作らなくても extcore 自体を使って目的が達成できそうな気配なので、ちょっと試してみます http://echo.5ch.net/test/read.cgi/tech/1317958045/323
324: デフォルトの名無しさん [sage] 2011/10/29(土) 19:04:56.33 >>318 core言語って何? http://echo.5ch.net/test/read.cgi/tech/1317958045/324
325: デフォルトの名無しさん [sage] 2011/10/29(土) 19:05:53.18 ごめん、ぐぐったら出てきたわ>core language http://echo.5ch.net/test/read.cgi/tech/1317958045/325
326: デフォルトの名無しさん [sage] 2011/10/29(土) 21:13:07.97 確か標準では形式的な定義は与えてなかったんじゃなかったっけ http://echo.5ch.net/test/read.cgi/tech/1317958045/326
327: デフォルトの名無しさん [sage] 2011/10/29(土) 21:18:07.01 そうだが どうした、いきなり http://echo.5ch.net/test/read.cgi/tech/1317958045/327
328: デフォルトの名無しさん [] 2011/10/30(日) 22:46:14.15 windowsでHaskellを使う場合、文字コード変換はuconvしか選択肢無い? http://echo.5ch.net/test/read.cgi/tech/1317958045/328
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 650 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.012s