[過去ログ] 関数型プログラミング言語Haskell Part4 (1001レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
440
(1): 2006/04/16(日)19:55 AAS
ありがとう。
やってみたけど、正格性解析されて一気に評価されちゃいました。。。
441: 2006/04/16(日)20:00 AAS
>>440
そりゃ、あなたが解析しやすい、単純な女だからさ。
442: 2006/04/16(日)20:42 AAS
ネタはネタスレで
443: 2006/04/16(日)20:46 AAS
ネタはネタスレで
444: 2006/04/16(日)20:46 AAS
ネタはネタスレで
445: 2006/04/16(日)20:50 AAS
ネタはネタスレで?
446
(1): 2006/04/16(日)21:04 AAS
このスレのPart1の過去ログは読んで役に立った。
今のスレは役に立たない。
447
(2): 2006/04/16(日)21:15 AAS
>>432 2.は状態がないということに関連するの?
448: 2006/04/16(日)21:19 AAS
>>446
自分が役に立とうという気はないらしいな
449
(6): 2006/04/16(日)21:21 AAS
>>432
これ読んだか? 外部リンク[html]:www.sampou.org

なんで 1.はほぼ同等なんだ?C++で持ち運んで代入したりできるものといったらプリミティブぐらいだろ?
もっと高位の抽象化の話ならBASICやアセンブラでもできるぞ?

比較するんならC++みたいなメモリリークが起こるバキーな言語じゃなくてJavaとかの方がまだましだと思うんだが。
450: 2006/04/16(日)21:30 AAS
>>447
新しいインスタンスを得るのにわざわざnewしたり、既存のものをcopyしたりするのは面倒。
それから、Haskellのコードが簡潔になる傾向がある原因の一つとして、
Haskellでは繰り返しを表現するのに明示的な再帰ではなくリスト操作を使うことが多いんだが、
そういうときリストをサクサク使い捨てることができないととても不便。
451: 2006/04/16(日)21:33 AAS
>>449
>なんで 1.はほぼ同等なんだ?C++で持ち運んで代入したりできるものといったらプリミティブぐらいだろ?
ユーザー定義型を持ち運んだり代入したりできる。
書き忘れてたけど、>>432で「C++」と言ってるのは
Boost(や、場合によってはFC++)などのライブラリを十分活用した場合の話。
452: 2006/04/16(日)21:40 AAS
Boostには、例えば次のものが含まれている。
function 第一級の関数
optional Maybeに相当
variant 代数的データ型に相当
lambda 無名関数を構築するためのコンビネータライブラリ 関数の部分適用もできる
tuple タプル
iterator 遅延リストのようなもの
省2
453
(1): 2006/04/16(日)21:45 AAS
なんか賑わってますね。
ようやくhaskellの真の実力が世間に認知され始めたのかな?
454: 2006/04/16(日)21:50 AAS
>>449 C#ならどう?
455: 2006/04/16(日)22:11 AAS
あんな本でも、日本語の本の影響は大きいんだな。
むしろ、あんな本だから影響が大きいのか。
456: 2006/04/16(日)22:24 AAS
>>453
ごめんなさい。
はじめの方で自演していました。
あまりに人が少なかったから。
457
(1): 449 2006/04/16(日)22:25 AAS
真面目なスレですね。通りすがりで後ろのほうだけ読んだせいで煽り気味の文章を書いてしまったのでフォローします。

C++でアルゴリズムや型を抽象化するには必ずクラスやテンプレートを定義しなければならない。

関数型言語の場合は、とりあえず書き始めてアルゴリズムができてきたらその部分をコピーしたり必要ならクロージャに入れて外で使うなり関数内で移動するなり割と簡単にできる。

関数の引数が増えた、とかローカル変数を共有したくなったりしたら、その時点で型を作るなり言語の抽象化機能を使う。(これ自体はC++でもできる)

型の実装を変更しても、ML以降の関数型ならアルゴリズムの実装の変更に対して型を推論させながら修正できるから、わりとスムーズに移行できる。インタプリタがあることが多いのでその場合はリターンも早い。
省1
458: 449 2006/04/16(日)22:26 AAS
(つづき)
カリー化その他の抽象化能力の話もいろいろありますが、こういう感じで関数型言語は書きながら抽象化を進めていくのが容易だ、と言えると思います。
この話はC、C++(Boost含む)、Java、C#、Basic、その他手続き型言語とML以降の関数型言語との比較に於て言える内容でしょう。

>比較するんならC++みたいなメモリリークが起こるバキーな言語じゃなくて
これがまずかったみたいですね。煽るつもりはありませんので。
459
(1): 449 2006/04/16(日)22:29 AAS
読み返したら口調が変わりすぎて気持悪いから自分でツッコミ入れとく
460: 2006/04/16(日)22:32 AAS
AA省
461: 2006/04/16(日)22:37 AAS
こっちみんな
462: 2006/04/16(日)23:05 AAS
AA省
463
(1): 432=451=452 2006/04/16(日)23:07 AAS
>>457
結論は分かったけど、例が全然理解できない。
特に、関数型言語でできてC++で出来ないことと、
型推論がコードの修正にどう影響するかがわからない。
良かったら解説してもらえないだろうか。あるいは参考文献でも。
464
(2): 2006/04/16(日)23:34 AAS
使ってみりゃわかるよ。
465: 2006/04/16(日)23:46 AAS
5000行位は書いたんだが…
466: 2006/04/17(月)00:05 AAS
50000行ぐらい書いてみろ。
467
(2): 2006/04/17(月)00:12 AAS
違いという話では、C++には
パターンマッチは流石にねーだろ。
468: 2006/04/17(月)00:13 AAS
>>464 ちょっと興味はあるんだけど、使ってみていじくるまで今元気じゃない・・・orz
469: 2006/04/17(月)00:14 AAS
>>467
そういう話をすると、どうせBoostでどうのとか信者が言い出すんだろ。
470: 2006/04/17(月)00:27 AAS
>>467
boost::variantにapply_visitorってのがある。

すごく面倒だが。
471: 2006/04/17(月)00:44 AAS
HaskellはHaskellコンパイラーを書くための言語(ニヤリ
472: 2006/04/17(月)01:47 AAS
ム板でこれだけコードの出ないスレも珍しい。
473: 2006/04/17(月)02:08 AAS
コード要りません。理論だけで十分です。
474
(1): 449 2006/04/17(月)02:24 AAS
>>463
ライブラリで関数型言語をエミュレートできることと、関数型言語であるということには遥かにへだたりがあります。
Boostで関数型の振舞いができても、C++のコアに関する細かい知識が無いと結局使いこなすことはできないでしょう。
Boost氏の意見は自分でクラスやテンプレートを定義しないという前提でしか成り立たないのではないでしょうか。

>>464を言わないために言葉で説明してみたけど、これ以上言葉だけの説明は無理に思えます。私も464に同意です。

449はMLの人間でC++ vs 関数型言語にレス付けただけなのでこれで消滅します。すんません。

参考書が示せないので、何かプログラムのテーマを考えておいてください。Haskell初心者で参加します。
475: 2006/04/17(月)02:36 AAS
名無しに戻りました。
>>474
木を使うアルゴリズムが分りやすいんでないだろうか。
そんでBoost氏がC++で書いてくれるのか?
プログラムの過程を示すってコードに文字数が要りそうだけど・・・
476: 2006/04/17(月)05:51 AAS
>>399
このスレよりもここの作者にメール投げた方が早いよ
外部リンク[html]:homepage3.nifty.com
477
(4): 2006/04/17(月)22:14 AAS
木を使うアルゴリズムなんてほとんど知らないんだが…
いちおうこんなのを考えてみた。
data Bound a = Inclusive a | Exclusive a | Unbounded -- 範囲の境界
type Range a = (Bound a, Bound a) -- (下限、上限)
data RangeMap k a =... -- kの範囲にaの値を対応させる写像。木で表現される。平衡木だとなおよい。
empty :: (Ord k) => RangeMap k a -- 空の写像
insert :: (Ord k) => Range k -> RangeMap k a -> RangeMap k a --既存の写像を部分的に上書き
省5
478
(2): 2006/04/17(月)22:17 AAS
ネタ: DOM風の木を走査する

・ノードはテキストもしくはエレメント
・エレメントはタグ文字列と子ノードからなる

とりあえず型を定義
data Node = Text String | Element(String,[Node])
deriving (Eq,Show)

・再帰型の中にリスト(子ノード)があると適度に複雑な気がした。
省12
479
(2): 2006/04/17(月)22:39 AAS
>>447
もう皆どうでもよくなったんじゃないかと思ってたら被ってしまった。
447を見てもすぐには理解できません。Haskell文法のAAの出現を予感。
BoundのInclusive/Exclusiveはどういう意味ですか?
Boost初めて覗いたけど面白そう。
Boostでも再帰型が定義できるんですか?かなり見てみたいです。

でも478でインデントされなかったのは何故だろう?
480: 2006/04/17(月)22:43 AAS
>>479
>>477
481
(1): 2006/04/17(月)22:48 AAS
>>479
>BoundのInclusive/Exclusiveはどういう意味ですか?
半開区間(0, 4]を(Exclusive 0, Inclusive 4)と書けるといいな、と。

>でも478でインデントされなかったのは何故だろう?
HTMLの仕様と思われる。 を半角スペースの代わりに使うといいかと。
482: 2006/04/17(月)22:52 AAS
もしかして半角はインデントされないってこと?

  全角インデント
半角インデント

kita使ってるけど プレビューでもインデントされない。
kitaと板とどっちがおかしいんだろ
483: 2006/04/17(月)22:53 AAS
>>481
ありがとう
484
(1): 2006/04/17(月)22:56 AAS
firefoxで試してみる。
  半角インデント
485: 2006/04/17(月)22:58 AAS
        残念でした。
486: 2006/04/17(月)22:59 AAS
>>484
プレビューと間違えた。しっかり 入ってます
487: 2006/04/17(月)22:59 AAS
パチンコ&スロット解析用ソケット

メイン基盤上のチップLE2080,2280,4280のプログラムが
市販品のロムライターで読み込みできます。
確率や連チャンの仕組みが一目瞭然!
攻略法はあなた自身で見つける時代です。

外部リンク:www.3-you.com
488: 2006/04/17(月)23:08 AAS
>でも478でインデントされなかったのは何故だろう?
タコな2chスクリプトがインデントを展開してくれないから
 と書くか全角スペースでインデント汁
489: 2006/04/18(火)00:29 AAS
>>477
ツォルンの補題まで行ってきました。
なんでそうなったかは自分でもよくわかりません。
明日のナゾナゾにしてもう寝ます。
490: 2006/04/18(火)08:50 AAS
Haskell書いてると疲れるのは何故?
491: 2006/04/18(火)09:26 AAS
慣れてないから
492
(3): 2006/04/18(火)11:46 AAS
Schemeみたいな言語になれちゃって,Haskellではいつも型宣言を書かずにプログラムを書いてしまう。そしてインタプリタに読み込ませて型が何かをチェック。

俺ってHaskell向いてないかな?
493: 2006/04/18(火)13:49 AAS
>>492
自分で書いているように、慣れの問題
494: 2006/04/18(火)15:40 AAS
よく自分の書いた型宣言よりもさらに抽象度の高い型宣言を型推論さんが教えてくれるのですが,Haskellerの皆さんはこのようなときはどうしているのでしょうか?それともこのようなギャップはあまり生じない?
495
(1): 2006/04/18(火)17:07 AAS
>>477
a<b<c<d のとき(a,c)<(b,d)ということでしょうか?
でも(a,d)と(b,c)の比較がやっぱり分りません。(a,d)>(b,c)なんだろうか・・・

RangeMapはこういう解釈でいいんでしょうか?

・RangeMap型のオブジェクトは次の写像と同値である。
 r(1),r(2)...r(n)のn個の整列された範囲が与えられているとき、
 範囲rを自然数iに対応させる写像であって、rをr(i)とr(i+1)との間に挿入すると
省2
496: 2006/04/18(火)20:13 AAS
>>495
説明不足だった。申し訳ない。
意図としては、RangeMapはk型の値からa型の値への写像。
例えば、
a0, a1 :: RangeMap Integer String
a0 = insert (Unbounded, Unbounded) "foo" empty
a1 = insert (Inclusive 0, Inclusive 10) "bar" a0
省3
497
(3): 2006/04/18(火)21:05 AAS
>>478
やってみた。
一応、「書きながらの抽象化」の意味は分かったような気もするけど、
C++で書いた場合との本質的な違いのようなものは分からなかった。
コードの修正に型推論を活用するというのもよくわからなかった。
(これは修正自体をあまりしていないせいかも。)

満足できる結果じゃないけど、いろいろ勉強になった。
省3
498: 2006/04/18(火)21:07 AAS
本物のプログラマは型推論に頼らない
499: 2006/04/18(火)21:09 AAS
本物のプログラマはそもそも型に頼らないだろ
500: 2006/04/18(火)21:10 AAS
確かに本物のプログラマはHaskellで書かれているからな
501: 2006/04/18(火)21:16 AAS
本物のプログラマはuniversal domainを使う
502: 2006/04/18(火)21:26 AAS
一方ロシアはJavaを使った。
503: 2006/04/18(火)21:40 AAS
>>492
型に慣れてないなんて時代遅れだね。
504: 2006/04/18(火)21:42 AAS
型がないと、ある種のパラドックスに陥る。
それは容易にバグに結びつく。
強い型付きの言語というのは、そういう意味で安全なんだよ。
505: [俺ってオモスレーwwwsage] 2006/04/18(火)21:43 AAS
型型うるせえな!!
506
(1): 2006/04/18(火)22:12 AAS
>>497
reading A Gentle Introduction to Haskell Version 98 ... done
reading Twe Dozen Short Lessons in Haskell ... (Interrupt)
reading Yet Another Haskell Tutorial ... (Interrupt)
error: unresolved keywords: class instance deriving monad '...' '>>=' ...

やっと477が普通に見えてきたところです。
相互再帰は普通にできるんですね。
省5
507: 2006/04/18(火)22:17 AAS
型推論はなるべく使わないほうが良い。初心者なら特に。
508: 2006/04/18(火)22:23 AAS
>>497
そういえば以前MLでfoldを使わずに相互再帰で走査していくときに型推論が役に立ったことがあります。
509
(1): 2006/04/18(火)22:53 AAS
>>497
478はXML文書をPythonのElementTreeのように手軽に扱えるライブラリはないかと思って、Haskellに限らずいろいろ探しているときに考えていたことの一部です。
ElementTreeで日本語を読み込むにはかなり細工が必要で、またテキストをエレメントと対等に扱わないので検索がやりにくかったです。

外部リンク:haskell.orgによるとGHC6.6からUnicodeがHaXmlでも普通に扱えるように読めるんですが、ご存知ありませんか?
510
(1): 2006/04/18(火)23:23 AAS
>>509
現在のGHCは入出力の際にエンコーディングをiso-8859-1と仮定するので、
日本語を正しく扱うことは出来ません。
ただし、情報が失われる変換ではないので、文字列をブラックボックスとして操作する限りでは
問題は起こらないかも知れません。
実際、私はHaXmlを日本語を含む文書を操作するのに使っています。

上記の問題はGHC付属のIOライブラリの欠陥であって、プログラムからUnicodeの文字を扱うこと自体は正しく出来ます。
省6
511: 2006/04/18(火)23:24 AAS
>>492
関数を書いたあと推論を固定したいときはコピペして宣言、気にくわなければ型に手を加える、で十分だと思います。
512
(2): 2006/04/18(火)23:27 AAS
関数型言語、特にHaskellのようなpureな言語では、型を見るだけでどういう関数なのかほぼ解る。
a -> a 型の関数はまず間違いなく id だし、a -> b -> b 型は、第二引数をそのまま返すものであろう。
a -> Int とかなら、何を適用してもIntの定数を返す関数と推測される。
(a -> b) -> [a] -> [b] なんていう型の関数があったら、返値の要素は、第一引数である関数で
もって第二引数の要素から作ったものである。
自分で書いた関数が (a -> b) -> a -> a とか推論されたら、第一引数の関数またはその返値を
どこかで捨ててしまっている。
省1
513: 2006/04/19(水)00:30 AAS
>>512
>自分で書いた関数が (a -> b) -> a -> a とか推論されたら、第一引数の関数またはその返値を
>どこかで捨ててしまっている。
> 型推論を活用しながらコーディングってつまりこういうことだと思っているが、違う?
だいたいそう。

1) 予想した型と推論された型が一致しなければ、実装か、そもそもアルゴリズが間違っていた
2) 予定の型を書いておいて型エラーが無くなるようにコーディグする
省8
514
(1): 2006/04/19(水)01:04 AAS
>>506
外部リンク[cpp]:hs.or.tp
C++版。
C++には関数的なリストが用意されていないので、vectorと副作用でごまかした。
もちろん、自分で定義すればいいんだけど、面倒だったので。
515: 2006/04/19(水)01:07 AAS
>>510
参考になりました。ありがとう。

fptoolsでHaXmlをダウンロードしてあるのにghc6.4には何故かインストールされてませんでした。libraries/以下だけを再ビルドする方法も思い出せません。そもそもできたかどうか。トップからビルドし直すとまた信じられないような時間かかるし。
ghcはインストールがうっとうしいです。FFIもいっぱいあって、バージョン間の互換性も低いし。Makefileを書きかえてライブラリを追加したりとか。

インストールが成功したころには全然別の所に行ってしまってることが多いのでもうしばらくして試してみます。

reading 2ch/code321.txt(continued) Yet Another Haskell Tutorial(continued)...
516: 2006/04/19(水)01:16 AAS
>>514
わざわざありがとう。
これがHaskellと同じように読み書きできるんですね。恐れ入りました。
ちょっと頭のリソースが足りないので、今度Boostを試してみるときに参考にします。
517: 2006/04/19(水)13:49 AAS
ghcのコンパイルに 100時間以上かかってるんですがこんなもんですか?
前は半日くらいでできてたはずなのに。
518: 2006/04/19(水)17:33 AAS
いくらなんでも時間かかりすぎ
どんなコンピュータだよ
519
(1): 2006/04/19(水)20:58 AAS
GHC 6.4.2来たよ
520: 2006/04/19(水)22:22 AAS
いつもソースからビルドしてるんだけど、バイナリよりどれだけ速いか比べたことある人いませんか?
1-
あと 481 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.031s