[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 05/09 11:45 / Filesize : 259 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

関数型プログラミング言語Haskell Part3



1 名前:デフォルトの名無しさん [04/02/10 22:16]
Haskellの公式HP
www.haskell.org/
日本語サイト
www.sampou.org/cgi-bin/haskell.cgi
www.teu.ac.jp/kougi/koshida/Prog6/index.html

過去ログ、関連スレは>>2-5

720 名前:デフォルトの名無しさん mailto:sage [2005/09/29(木) 20:46:48 ]
>719
少し前(200311_1)には
Prelude>
だったが、今は確かに
Hugs.Base>
になってるね。


721 名前:デフォルトの名無しさん mailto:sage [2005/09/29(木) 22:28:13 ]
Haskell 使おうっと思ってんだけど、サンプルプログラムがなきゃ分からん。

いきなり Pugs, Rtype, Monadius だと手ごわすぎるので、もうちょい下のレベルで、
おすすめを教えて頂戴。

ウェブアプリを作ることがほとんどなので、Wiki, Blog(Diary), BBS 辺りが理想なんだけど。

722 名前:デフォルトの名無しさん mailto:sage [2005/09/29(木) 22:57:36 ]
>>721
俺は特に何かをお薦めする程わかっちゃいないが、取り合えず
www.haskell.org/practice.html
を紹介しとく。

723 名前:デフォルトの名無しさん mailto:sage [2005/09/29(木) 23:04:55 ]
>>722
さんきゅ。

とりあえず、

Flippi: a Wiki clone written in Haskell
www.flippac.org/projects/flippi/

でも見てみるよ。

724 名前:デフォルトの名無しさん [2005/09/30(金) 11:39:06 ]
「連載: Haskellプログラミング」のメモ化のところがよーわからん。
State s t、withState、bindStateのところで詰まってしまった。
誰か日本語でわかりやすく説明して!


725 名前:デフォルトの名無しさん mailto:sage [2005/09/30(金) 17:42:10 ]
Stateモナドの知識がないと難解だと思う。

type State s t = s -> (t, s)
というのは、現在の状態を受け取って新しい状態とさらに何かを返す関数。
だから、State s t型の値を「状態を変更してついでに値を生み出す仕掛け」と見ることができる。
ここで、「状態を変更せずに常に決められた値xを生み出す仕掛け」は

\state -> (x, state)

と書ける。これがwithState x。
一方、「起動されたとき仕掛けxと仕掛けyが順に起動されたかのように振る舞う仕掛けthenState x y」は
次のように定義できる。

thenState :: State s a -> State s b -> State s b
thenState x y = \s0 ->
  let (_, s1) = x s0 in -- xに初期状態s0を与えて起動、中間状態s1を得る。xによって生成された値は無視。
  y s1 -- yに中間状態s1を与えて起動、終状態と値の組を得る。これはそのまま合成されたしかけの戻り値となる。

thenStateではxによって生成された値を無視したが、この値に基づいて
次に何をするか決めることができないと面白くない。そこで、yとして単なる仕掛けではなく、
「xによって生成された値を受け取って仕掛けを返す関数」を渡すことにする。

bindState :: State s a -> (a -> State s b) -> State s b
bindState x y = \s0 ->
  let (result, s1) = x s0 in -- xを起動し…
  (y result) s1 -- …次に(y result)を起動

726 名前:デフォルトの名無しさん mailto:sage [2005/09/30(金) 22:49:12 ]
すごくわかりやすい! あなたとても賢いね。
どうもありがとうございました。

State s t を状態遷移図での状態aから状態bへの矢印とイメージしました。
withState x は、状態遷移図で状態aから同じ状態aへ戻る矢印(出力x)ですね。


727 名前:デフォルトの名無しさん mailto:sage [2005/10/01(土) 11:13:33 ]
Haskell はなかなか自分の思い通りにかけるようにならない orz

728 名前:デフォルトの名無しさん mailto:sage [2005/10/01(土) 14:23:21 ]
Cとかと違ってプログラマのほうに能力がないと何もできんよな……



729 名前:デフォルトの名無しさん mailto:sage [2005/10/01(土) 20:48:54 ]
Haskellで書くとバグがなくなると聞いたんですが本当ですか?

730 名前:デフォルトの名無しさん mailto:sage [2005/10/01(土) 22:48:41 ]
バグは出にくいが慣れないうちは普通にコンパイルを通すだけで苦労する。

731 名前:デフォルトの名無しさん mailto:sage [2005/10/01(土) 23:21:49 ]
>>729
俺も最初はランタイムエラーは絶対出ないものと思ってたけど
guardとかの場合わけ漏れとか
パターンマッチの不整合エラーがたまにある、、、

ぬるぽとかと比べて感覚的に頻度少ないけどね。

732 名前:デフォルトの名無しさん mailto:sage [2005/10/01(土) 23:59:39 ]
>>729
いいえ

733 名前:デフォルトの名無しさん mailto:sage [2005/10/02(日) 00:42:37 ]
整数をゼロで割ると実行時エラーになるし。

完全でないパターンマッチは、ghcなら警告を出させることもできるから、
あとはプログラマの問題という気がするが。


734 名前:724 mailto:sage [2005/10/02(日) 05:03:11 ]
「連載: Haskellプログラミング」の9月号分を読んで
なんとなく理解したところでは
Haskellで評価の順序を強制するためにはCPSのように書くことが必要で、
Monadは継続に付加情報を(連続的にというか玉突き的にというか)持ち回る道具、
do構文はそれを手続き型のように書く構文、
というところだろうか?


735 名前:デフォルトの名無しさん mailto:sage [2005/10/02(日) 08:35:39 ]
Monadは全てを記号論的に処理する枠組み
doは状態遷移を隠蔽するモナド関数
で合ってる?


736 名前:デフォルトの名無しさん mailto:sage [2005/10/02(日) 09:44:07 ]
>>734
Stateモナドについてならその理解でいいと思う。
ただし、モナドの意味論は個々のモナドでかわる。モナドそのものは
「do記法で書くことのできるひとまとまりの計算の構成を支援するもの」くらいではないかな。
たとえばIOモナドは副作用が存在しうるような場合の計算の順序の保証する。
Maybeモナドは途中でNothingになるかもしれない計算のまとまりを構成する。
などなど。

あとは「モナドのすべて」を読むといいと思うよ。
www.sampou.org/haskell/a-a-monads/html/index.html


737 名前:デフォルトの名無しさん mailto:sage [2005/10/03(月) 20:52:08 ]
      /\
    /   \  今このとき,モナドは立ち上がる
   /∧_∧ \    
 /( ´∀`)  /\
 \(    ) /  \    
   \    /       \
    \/         \
          ∧∧∧∧\
         (  ´/) ))ヽ∧
         /   /  / ´∀) ∧∧
       ○(   イ○  (   ,つ, ,゚Д゚)  
       /ヽ  )) ヽ  )ヽ )と  , イ
       (_/(_/(_/(_/ノ(_/⊂ノ> )J
   / ̄Y ̄`|/ ̄^Y ̄ヽ/ ̄ ̄Y

738 名前:デフォルトの名無しさん mailto:sage [2005/11/01(火) 01:17:46 ]
純粋関数型言語を業務で使ってみたい。



739 名前:デフォルトの名無しさん mailto:sage [2005/11/01(火) 01:23:35 ]
ぜひ使ってくれ

740 名前:デフォルトの名無しさん mailto:sage [2005/11/02(水) 01:11:11 ]
あなたの業務が研究・教育ならいくらでも…

741 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 10:35:10 ]
hasktags って使える?
誰か、 GHCmacs でも作ってくえ。

742 名前:デフォルトの名無しさん mailto:sage [2005/11/12(土) 10:24:33 ]
行列をhaskellで実装する場合、単位元ってモナドで表現する?

743 名前:デフォルトの名無しさん mailto:sage [2005/11/12(土) 19:00:45 ]
連載 Hakellプログラミングの8月号にのってる
両替問題の最初でつまづいてしまいました。

cc ::Amount -> [Coin] -> Count
という関数を
a < 0でないとき
cc a (c:cs) = cc (a-c) (c:cs) + cc a cs
と定義してますが、なぜこれで指定した金額aの両替の組み合わせ個数になるんですか?

初歩的な質問で済みませんが教えてください。

744 名前:デフォルトの名無しさん mailto:sage [2005/11/12(土) 19:11:23 ]
>>743
貨幣cを一つ以上使う場合の数は、cを一つ使った後の両替を考えて、cc (a-c) (c:cs)
貨幣cを一つも使わない場合の数は、cc a cs
この和が求めるものになる。

745 名前:デフォルトの名無しさん mailto:sage [2005/11/12(土) 19:30:54 ]
>>744
なるほど。
うまく考えるものですね。
ありがとうございました。

746 名前:デフォルトの名無しさん mailto:sage [2005/11/12(土) 20:31:08 ]
簡単な例を作るといいよ
10円 を 5円 と 1円 で両替して樹形図を書く

747 名前:デフォルトの名無しさん mailto:sage [2005/11/12(土) 21:27:57 ]
高校でやったろ? 順列と組み合わせ。

748 名前:デフォルトの名無しさん mailto:sage [2005/11/12(土) 21:38:52 ]
>>747
お前がいまやってるんだろ?ww



749 名前:デフォルトの名無しさん mailto:sage [2005/11/13(日) 02:16:56 ]
母関数を使えば簡単に計算できるのに

750 名前:デフォルトの名無しさん mailto:sage [2005/11/13(日) 09:14:43 ]
>>748
今頃やってるとしたら遅すぎると思うんだが。
夏頃やってたような。昔の記憶だが。

751 名前:デフォルトの名無しさん mailto:sage [2005/11/13(日) 22:17:02 ]
>>749
母関数から特定の項を取り出す手間とボトムアップに解を構成する手間はいっしょ

752 名前:デフォルトの名無しさん mailto:sage [2005/11/14(月) 06:49:45 ]
>>751
母関数から特定の項を取り出すのは紙と鉛筆で簡単にできるでしょ。
わざわざプログラムなんて書く必要もない。


753 名前:デフォルトの名無しさん mailto:sage [2005/11/14(月) 20:09:53 ]
>>752
詳しく頼む。

俺は Polya の本にその母関数の一般項の計算には DP を使うと書いてあったので、無理だと思ってたんだが。

754 名前:デフォルトの名無しさん mailto:sage [2005/11/14(月) 23:45:35 ]
>>753
組み合わせ論の入門書やConcrete Mathに出てるようなんじゃだめなの?

755 名前:752 mailto:sage [2005/11/15(火) 00:16:35 ]
>>754
Concrete Math の p.331 から 2 ページくらいで計算されてるやつ?

この例の最初のところに「一般の効果の場合に計算するのはとても難しい」とあるし,
その下で計算されてる {1, 5, 10, 25, 50} の特殊例においても「trick」と称される
計算をしないといけないし,さらに,最終結果に残ってる A_k は多項式を実際に展開しないと求まらない.

というわけで,これは一般性が無いという意味で >>744 が母函数から簡単に出るという
説明にはなってないし,特殊例を含めても >>752 の「簡単」ってのはどうかと思う.


コレじゃないならポインタください.

756 名前:デフォルトの名無しさん mailto:sage [2005/11/15(火) 21:19:55 ]
Haskellのデータ構築子が非正格なのは便利なんだけど、
一般の関数が非正格で嬉しいことってある?
デフォルトで正格でも良いような気がするんだが。

757 名前:デフォルトの名無しさん mailto:sage [2005/11/15(火) 21:44:13 ]
以下の二つが大きいそうだ
・相等性についての議論が楽になる(単純に置換するだけでOK).
・制御構造を自分で設計できる.
 cond p x y | p         = x
            | otherwise = y           
 recip x = cond (x == 0) 0 (1/x)
 は正格なら recip 0 = bot, 非正格なら recip 0 = 0.

758 名前:デフォルトの名無しさん mailto:sage [2005/11/15(火) 22:37:48 ]
>>757
反応ありがとう。

>・相等性についての議論が楽になる(単純に置換するだけでOK).
なるほど。気付かなかった。
でも、現状だとIntのaccumulator引数付きのちょっとした末尾再帰関数なんかを書くたびに
明示的に正格評価を指定しないとパフォーマンスに打撃があるわけで、
「議論が楽になる」って利点はこのコストに見合うんだろうか。

…などと思うのは俺が言語を使うだけの立場だからかな。

>・制御構造を自分で設計できる.
これはどちらかというと特殊なケースだから、非正格をデフォルトにする理由としては弱いと思う。



759 名前:デフォルトの名無しさん mailto:sage [2005/11/15(火) 22:56:10 ]
もともとは研究者の研究者による研究者のための言語だから、
コストパフォーマンスより性質を重視してるんじゃない?
ていうか、非正格の言語を統一する目的で作られた言語だしね。

正格がデフォルトの言語はMLを始めすでにいっぱいあるから
そっちを使ったらどうかな。

760 名前:757 mailto:sage [2005/11/15(火) 23:37:37 ]
>>758
俺は前者も後者も重要と思ってるんだけどね。まあとりあえず前者について少し強く推しておく。

「three x = 3 」 と定義したときに、「 2 + three x == 5 」 が成立するかどうかを判定することを考える。
これを非正格に評価するとthree x を単純に 3 に置き換えて 2 + 3 == 5 にして、成立する、と結論が出るんだけど、
正格評価だと、x が絶対 bot にならないなら成立、そうでないなら不成立、というようにドメインまで考えないと駄目になる。

特に函数が複雑に組み合わさってる場合に、どこかで bot になる可能性があるとかそういうことを考えるのはしんどいし、
上の函数でもそうだけど、 bot 以外で成立、とかいうのは本質的に成立にしちゃったほうが有意なケースが多いんだわ。

761 名前:デフォルトの名無しさん mailto:sage [2005/11/16(水) 00:02:49 ]
相等性?(0.6 + 0.000000000000000041) == 0.6
浮動小数は代数的ではないとはいえ、言語的にこれでいいでしょうか?



762 名前:デフォルトの名無しさん mailto:sage [2005/11/16(水) 11:02:44 ]
>>756
バックトラックが、普通に全数探索するようなコードを書くだけで実装できてしまうとことか。

763 名前:デフォルトの名無しさん mailto:sage [2005/11/18(金) 20:07:17 ]
どうでもいいこと。

>>757
>  recip x = cond (x == 0) 0 (1/x)

(x == 0) ? 0 : (1/x)

ちゃんとしたコンパイラなら動くきがす。

764 名前:デフォルトの名無しさん mailto:sage [2005/11/19(土) 22:59:06 ]
え、だから?
煽りじゃなく本気で意味がわからん。


765 名前:デフォルトの名無しさん mailto:sage [2005/11/20(日) 16:33:55 ]
Hugs.Base> let n C r = product [n-r+1..n] `div` product [1..r] in 5 C 3
10

766 名前:デフォルトの名無しさん mailto:sage [2005/11/24(木) 22:06:26 ]
なんとなくtak関数を書いてみたらCより速くてびっくりした。
thunkの絡まない計算は速いんだな。

767 名前:デフォルトの名無しさん mailto:sage [2005/11/27(日) 20:34:53 ]
Cのコンパイラオプションは?

768 名前:デフォルトの名無しさん mailto:sage [2005/11/27(日) 21:57:49 ]
>>767
-O2。
言われて気づいたけど、-O2 -fomit-frame-pointerとしたらCの方が速かった。



769 名前:デフォルトの名無しさん mailto:sage [2005/11/27(日) 22:44:24 ]
haskellには実行速度を求めないで美しいライブラリを書いて欲しいんだよね。

770 名前:デフォルトの名無しさん mailto:sage [2005/11/27(日) 22:51:32 ]
Cとかと違って本質的な速度向上がありうるしね.
簡単な記述のほうがプログラム変換に持ち込みやすいし.

771 名前:デフォルトの名無しさん mailto:sage [2005/11/28(月) 00:09:59 ]
贅沢を言うが、美しいコードが速いコードにコンパイルされて欲しい。
fac n = product [1..n]が末尾再帰のfacと同等なコードにコンパイルされる日は
来るんだろうか…

772 名前:デフォルトの名無しさん mailto:sage [2005/11/28(月) 01:39:57 ]
つ Clean (速いコード)
import StdEnv, BigInt
factB :: Int -> BigInt
factB n = foldr (\x y =y *% x) one [1..n]
//factB n = foldr (%*) one [1..n] // %* がないから


773 名前:デフォルトの名無しさん mailto:sage [2005/11/28(月) 06:03:30 ]
>>771
product は foldl で書けてるわけだから,もう末尾再帰になってると思うが.

774 名前:デフォルトの名無しさん mailto:sage [2005/11/28(月) 11:51:06 ]
乗算が全部遅延されるから末尾再帰の意味があんまりない。

775 名前:デフォルトの名無しさん mailto:sage [2005/11/28(月) 13:49:20 ]
コンパイラが正格性解析して最適化するから問題無し。

776 名前:デフォルトの名無しさん mailto:sage [2005/11/28(月) 20:37:04 ]
>>772
多倍長演算に時間をとられる階乗は例が悪かったかも。
興味があったのは、リストを作って壊すオーバーヘッドをなくすような最適化。

>>773
ごめん。明示的な再帰で書かれたfacのことを言いたかった。
fac = iter 1 where iter a 1 = a; iter a n = iter (a*n) (n-1)

777 名前:デフォルトの名無しさん mailto:sage [2005/11/28(月) 23:57:12 ]
>>774
標準 Prelude では sum とか product の fold は積極評価のオペレータを
導入して実装されてるんじゃなかったっけ.

>>776
リストを作って壊しているとは限らない.というか普通はそんなことしてない.
product n = foldl (*) 1 (take n (enumFrom 1)) で定義したとき,
product n
= foldl (*) 1 (take n (enumFrom 1))
= foldl (*) 1 (take (n-1) (enumFrom 2))
= foldl (*) 2 (take (n-2) (enumFrom 3))
...
= foldl (*) n! (take 0 (enumFrom n))
= foldl (*) n! []
= n!
みたいに評価されるから,陽に空リスト以外のリストを作る部分は無い.

778 名前:デフォルトの名無しさん mailto:sage [2005/11/29(火) 00:46:37 ]
>777
少し前にメーリングリストで「sumはfoldl'を使うべき」という議論があったね。
いま見直したら、議論は「可算は常にstrictと言えるか」とかいう方向にシフトしちゃってたけど。
んで、型クラスを使っている以上、+演算子が常に strict に評価可能である保証はできないので、ということで議論は終結してしまっていた。
実際、 GHC では sum とか product では普通の遅延評価版を使っているよ。

実際問題としては strict 版の sum' と product' が(Listにでも)用意されていればいいと思うんだけど。

ちなみに仕様上も、
www.sampou.org/haskell/report-revised-j/standard-prelude.html
foldl を使うことになっているので、仕様が変わるまでは積極評価版にはならないと考えた方がいい気がする。




779 名前:デフォルトの名無しさん mailto:sage [2005/11/29(火) 09:25:21 ]
>>778
そかー…….

まあ product [-10000..1] とかを一回の乗算で終わらせられる可能性があるから
戦略上絶対に悪いというわけじゃないんだろうけど癪だなあ.

780 名前:デフォルトの名無しさん mailto:sage [2005/11/29(火) 11:46:33 ]
>>777
>リストを作って壊しているとは限らない.というか普通はそんなことしてない.
その過程は、細かく言うと(foldlの代わりにfoldl'を使って)
...
= foldl' (*) 1 (take (n-1) (enumFrom 2))
= foldl' (*) 1 (take (n-1) (2:enumFrom (2+1))
= foldl' (*) 1 (2:take (n-2) (enumFrom (2+1)))
= foldl' (*) 2 (take (n-2) (enumFrom (2+1)))
...
のように進むから、1ステップごとにconsを作っては壊す必要があると理解してたんだけど、違う?

>>778
>実際、 GHC では sum とか product では普通の遅延評価版を使っているよ。
IntとIntegerについては正格な版が使われると明言されてる。
www.haskell.org//pipermail/haskell/2005-November/016727.html
といってもDoubleやWord32やRationalは遅延評価版だけど。

781 名前:デフォルトの名無しさん mailto:sage [2005/11/29(火) 21:24:51 ]
『ふつうの Haskell プログラミング』2005 年度内発売予定
ttp://i.loveruby.net/d/20051129.html#p01

782 名前:デフォルトの名無しさん mailto:sage [2005/11/29(火) 23:27:32 ]
>>781
ネ、ネタにしかみえねぇ……
マジなのか?

783 名前:デフォルトの名無しさん mailto:sage [2005/11/30(水) 02:16:17 ]
ふつうの人は、Haskellでプログラミングしない。

784 名前:デフォルトの名無しさん mailto:sage [2005/11/30(水) 03:23:53 ]
>>781
年内ではなく、年度内かよ。

ホントでたら買わせていただきます。
それよりも誰か The Craft of Functional Programming  を訳してください。英語で挫折してしまいました。

785 名前:デフォルトの名無しさん mailto:sage [2005/11/30(水) 17:10:48 ]
世界よ、ありがとう

786 名前:デフォルトの名無しさん mailto:sage [2005/12/06(火) 08:44:52 ]
出版も遅延評価で行なわれます。
宣言はされても評価はされません。

787 名前:デフォルトの名無しさん mailto:sage [2005/12/06(火) 10:42:49 ]
参照透明性の関係で版ごとにタイトルが違うか、IOモナドに包まれて出版されます。
後者の場合、読者もIOモナドに包まれないと読めません。

788 名前:デフォルトの名無しさん mailto:sage [2005/12/06(火) 11:12:00 ]
つまり必要が生じたときにその箇所だけ読まれるわけじゃなくて前から順番に読まれることが保証されているといいたいのか



789 名前:デフォルトの名無しさん mailto:sage [2005/12/06(火) 11:45:40 ]
読んだ知識をIOモナドの外で活用したい場合はどうしたらいいですか?

790 名前:デフォルトの名無しさん mailto:sage [2005/12/06(火) 14:43:53 ]
unsafePerformIO

791 名前:デフォルトの名無しさん mailto:sage [2005/12/06(火) 17:22:33 ]
年度内って、来年の四月までってこと?

792 名前:デフォルトの名無しさん mailto:sage [2005/12/06(火) 20:00:58 ]
i.loveruby.net/d/20051129.html#c04

12月内ってことじゃない?

793 名前:デフォルトの名無しさん mailto:sage [2005/12/06(火) 20:06:08 ]
出版前に査読してもらうってことだろ。

794 名前:デフォルトの名無しさん mailto:sage [2005/12/06(火) 20:11:14 ]
>>793
ごめん。reviewの意味を勘違いしていた。

795 名前:デフォルトの名無しさん mailto:sage [2005/12/17(土) 10:02:29 ]
ごめん、以下のプログラムが読み解けないです
「addの戻り値型は引数型の関数となっている、と指定している」
ということらしいのですが、誰か解説してくれまへんか

class Add a b c | a b -> c where
add :: a -> b -> c


796 名前:デフォルトの名無しさん mailto:sage [2005/12/17(土) 10:41:58 ]
functional dependency ってヤツだよ。
それは関数ではなくて、「aとbからcの型は一意に定まる」ことを示している。
www.cse.ogi.edu/~mpj/pubs/fundeps-esop2000.pdf


797 名前:デフォルトの名無しさん [2005/12/18(日) 04:23:05 ]
"100" から 100 を取り出すような関数はどうやりますか

798 名前:デフォルトの名無しさん mailto:sage [2005/12/18(日) 08:25:32 ]
readの作り方?



799 名前:デフォルトの名無しさん mailto:sage [2005/12/18(日) 08:52:39 ]
>>797
read "100" :: Int

800 名前:デフォルトの名無しさん mailto:sage [2005/12/18(日) 09:26:10 ]
>>798
そうです。

>>799
言葉足らずですみません。

801 名前:デフォルトの名無しさん mailto:sage [2005/12/18(日) 11:11:46 ]
foldl (\x y->10 * x + (ord y - ord '0')) 0

802 名前:デフォルトの名無しさん mailto:sage [2005/12/18(日) 14:55:27 ]
浮動小数の桁数指定で最後の桁の次を四捨五入の場合は?


803 名前:デフォルトの名無しさん mailto:sage [2005/12/18(日) 15:29:40 ]
何の話?

804 名前:デフォルトの名無しさん mailto:sage [2005/12/19(月) 15:50:32 ]
roundN :: (RealFrac a, Integral b) => a -> b -> a
roundN x n =
(frac (round (x * b))) / b
where b = 10 ^^ n
frac = fromRational . toRational


805 名前:797 mailto:sage [2005/12/20(火) 01:34:36 ]
>>800
誰だ君…

>>798
そうです。

>>799
言葉足らずですいみません。

806 名前:デフォルトの名無しさん mailto:sage [2005/12/20(火) 08:55:38 ]
Webで以下のような定義を見かけたのですが、

data List a = Nil | Cons a (List a)

instance Eq (List a) where
Nil == Nil = True
Cons x xs == Cons y ys = xs == ys
_ == _ = False

Cons x xs == Cons y ys = xs == ys
の部分って正しいの?
このままだと (Cons 1 (Cons 2 Nil)) == (Cons 1 (Cons 3 Nil))
が True になるんだけど・・・
かといって
Cons x xs == Cons y ys = x==y && xs == ys
とかすると、最初のほうの x==y で
「add (Eq a) to the class or instance method `=='」
とか怒られるんだけど、じゃーどう定義したらよいのか
わかりまへん

807 名前:デフォルトの名無しさん mailto:sage [2005/12/20(火) 09:00:55 ]
>>796
ありがとうございます。まだよくわかってないですが
読んでみます。

808 名前:デフォルトの名無しさん mailto:sage [2005/12/20(火) 10:37:50 ]
>>806
リストという構造自体の等価性の問題ですから
中身は関係ない(というか見ちゃいけない)のです

add (Eq a) to the class or instance method `=='
とあるように,
中身の等価性まで考えようとしたら,List に格納できるデータ型
が Eq クラスのインスタンスに制限されてしまうのです.



809 名前:デフォルトの名無しさん mailto:sage [2005/12/20(火) 10:47:45 ]
>>797じゃないですがReadのインスタンスの作り方わからない…
readsPrecとreadListの作り方のチュートリアルか何かないでしょうか(できればShowの方も)
Haskell98Report読んでもサッパリです

810 名前:デフォルトの名無しさん mailto:sage [2005/12/20(火) 13:02:57 ]
instance Eq a => Eq (List a) where
 Nil == Nil = True
 Cons x xs == Cons y ys = x == y && xs == ys
 _ == _ = False


811 名前:デフォルトの名無しさん mailto:sage [2005/12/20(火) 18:59:40 ]
>>808
なるほど。納得です。

>>810
こうすると出来ますね。
Eq クラスのインスタンスに制限されるってこういうことだったのですね
有難うございました。

812 名前:デフォルトの名無しさん mailto:sage [2005/12/21(水) 23:26:59 ]
>>809
チュートリアルじゃないけど、GHC.Readにいくつかinstanceの例がある。
cvs.haskell.org/cgi-bin/cvsweb.cgi/fptools/libraries/base/GHC/Read.lhs?rev=1.29;content-type=text%2Fplain

理解したら、是非チュートリアルを書いてくれ。

813 名前: ◆SaiTAMaVxg [2006/01/09(月) 08:32:36 ]
                  ミ  (  ノ
                      / ̄\   ♪ 
                   〜(゚ ∀ 。 )⌒    
                 ♪   \_/  彡
                     ノ ι  ヽ

              ♪  .ハ
            ,ヘ    ((
            )ノ    .))
            (( ∧∧//
               \(゚∀゚ )      
              )  ノ         ヾ     ♪
          ミ シ´ /            ,γ 
         ミ r´  (          ∧∧//   
           ヽ、  ヽ  彡 ♪   ( ゚∀゚)'   
             )  ノ 彡       .,/   ヽ ミ
            ノ ,、(       ノ ノヽ   l
           r´/ ) )   ミ (´/  ノ ノ
          ( (  ( (         γ´ (´
           ヽ)  ヽ\       ノ ハ ヽ   ♪
               ノ  ) .   / ,,/ (,,ノ 彡
         ♪    (__ノ     (_,,ノ


814 名前:デフォルトの名無しさん mailto:sage [2006/01/22(日) 22:44:58 ]
shootout.alioth.debian.org/gp4/benchmark.php?test=all&lang=all
パフォーマンスが凄いことになってる。

815 名前:デフォルトの名無しさん mailto:sage [2006/01/23(月) 00:03:09 ]
shootoutって、普通のプログラマが見ても
「Cはやっぱり速いなあ」とか「インタプリタはやっぱり遅いなあ」とか
「Javaはやっぱりメモリ喰いだなあ」とか思うだけで、
「関数型言語頑張ってるな。ちょっと使ってみるか」とは全く思ってくれない罠。

816 名前:デフォルトの名無しさん mailto:sage [2006/02/02(木) 21:41:39 ]
複数の関数の挙動に影響を与える「オプション」を外部(コマンドラインとか)から指定したいとき
C++みたいな言語の「thisの省略」がすごく羨ましいんだけど、
似たようなことをHaskellっぽく書けないものだろうか。

implicit parameterでそれなりに書けそうだけど、
使われてるのを見たことがない。

みんな明示的に引数を持ち回るのが苦痛じゃないのか?

817 名前:デフォルトの名無しさん mailto:sage [2006/02/02(木) 23:15:17 ]
>>816
そんな君にReaderT。
StateTでもいいぞ。


818 名前:デフォルトの名無しさん mailto:sage [2006/02/02(木) 23:46:36 ]
>>817
おー、ありがとう。
この目的のためにReaderモナドで計算順序を導入するのには抵抗があったけど、
既にもなでぃっくなコードにReaderTを混ぜ込むなら面倒が少ないな。



819 名前:デフォルトの名無しさん [2006/02/05(日) 07:29:06 ]
この言語は素晴らしいですか?

820 名前:デフォルトの名無しさん mailto:sage [2006/02/05(日) 07:47:59 ]
最高ですかー!






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<259KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef