週に一回は書きますよ 月に4つ記事を書けばノルマは満たされます。
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

以前のHaskellの例外の記事を書いたときから考えていたことなのですが、ある値の要素をすべて正則評価する関数は書けるのでしょうか。値がただのIntやDoubleなどならそのままseqで評価して、タプルやリストならその要素をすべて評価するというようなものです。コードにすると次のようになります。

xがIntやDoubleなど、構造を持たない型なら
seqAll x y = seq x y
リストを引数にすると、次のようにリストの中身を正則評価します。タプルも同様。
seqAll [] y = y
seqAll (x:xs) y = x `seqAll` xs `seqAll` y
さらに、複雑なデータ型を分解します。
Data Tree a = TreeLeaf | TreeNode (Tree a) (Tree a)
seqAll TreeLeaf y = y
seqAll (TreeNode a b) y = a `seqAll` b `seqAll` y

注目してほしいのは、リストを引数としたときの右辺はseqAllになっていること。このため、リストのリストがきたときも、その中身をすべて正則評価します。

明らかに無茶なのが最後の例です。Haskellではそんな無茶なコード生成はサポートされてません。最後の例以外は何とかなるでしょうか?

スポンサーサイト
コメント
この記事へのコメント
はじめまして、Otter_Oというものです。

タプルやリストやツリーなどの色々な形のコンテナ型に入っているデータを順番にトラバースするにはData.Genericsが使えます。http://ja.doukaku.org/comment/6280/に勉強をかねてやってみたコードがあります。しばらく前にやったことなので詳細は忘れてしまったのですが、scrap your boilerplateとい言う論文が参考になりました。
2008/09/27(土) 16:39 | URL | Otter_O #-[ 編集]
はじめまして。

scrap your boilerplateですか。かなり前に読んだだけで忘れてしまいましたがちょっと調べてみます。

ちなみにこの件についてはほかの方からも解決策をいただいています。評価戦略を扱うための機構があるとのことでした。http://gusmachine.blog49.fc2.com/blog-entry-302.html#comment_list
2008/09/29(月) 23:37 | URL | Gus #-[ 編集]
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
http://gusmachine.blog49.fc2.com/tb.php/298-59bd7df0
この記事にトラックバックする(FC2ブログユーザー)
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。