Haskell で可変長引数を扱う方法

一口に可変長引数と言っても色々あります。限られた範囲でのオプション引数が欲しいこともありますし、多相的な本物の可変長引数が欲しいこともあります。また、可変長引数を型安全に使いたいのか、型安全性を無視してでも使いたいのか、という話もあります。このようにどういうことをしたいかによって、可変長引数を実現するために採用するべき手段は異なってきます。ここにある程度情報をまとめておきましたので、是非参考にしてみてください。
20
shelarcy(しぇらーしぃ) @shelarcy

Polyvariadic function = 多相的(polymorphic) かつ 可変長(variadic) な関数ですか。 http://okmij.org/ftp/Haskell/polyvariadic.html#polyvar-fn

2010-10-15 14:50:45
shelarcy(しぇらーしぃ) @shelarcy

で、Monoid クラスのインスタンスとなる型の値に対し、polyvariadic に振舞う Monoid を提供するのが polyToMonoid の役割だそうです。 http://hackage.haskell.org/package/polyToMonoid

2010-10-15 14:54:25
shelarcy(しぇらーしぃ) @shelarcy

Data.PolyToMonoid のドキュメントConceptやExamplesを見てみると、ptm (polyToMonoid) 関数が polyvariadic な mappend 関数として振舞っているのが良く分かると思います。 http://bit.ly/9dQFE6

2010-10-15 14:59:43
shelarcy(しぇらーしぃ) @shelarcy

いや、このパッケージが提供するのは、やっぱり polyvariadic に振舞う Monoid でいいかな、とサンプルを見て思いました。 RT @shelarcy: s/Monoid/mappend/

2010-10-15 15:03:59

型クラスで polyvariadic かつ型安全なものを目指すと、型エラーが大変なことに……

shelarcy(しぇらーしぃ) @shelarcy

XML/HTML の作成 (Haskell as a markup language) http://t.co/soko0w4t http://t.co/fNsha9AD QT @sbwhitecap: 急募 Haskellの用途

2011-10-19 14:50:32
shelarcy(しぇらーしぃ) @shelarcy

@sbwhitecap .。oO(ただ、polyvariadic (可変長(variadic) かつ 多相的(polymorphic)) な関数を実現するために使われているテクニックのせいで型エラーが凄いことになるので、初心者にはお勧めしません……)

2011-10-19 14:58:45

型安全な printf/scanf

文字列をパースしない仕様

shelarcy(しぇらーしぃ) @shelarcy

文字列をパースしなくてよければ、型安全で Coq で正しさが証明されている printf の実装もあります。 http://t.co/B1I3GvR

2011-08-20 13:07:45
shelarcy(しぇらーしぃ) @shelarcy

@ranha あれっ? @ranha さんは "Fun with Type Functions" を読みませんでしたか? 確か、GADT で型を作って型族(Type Families)で return type を計算する、というやり方が紹介されていたと思いますが。

2009-09-18 01:09:09
shelarcy(しぇらーしぃ) @shelarcy

@ranha まあ……元となったアイデアは、まさに oleg さんの継続を使って printf の GADT 版だったりするわけですが。 http://article.gmane.org/gmane.comp.lang.haskell.general/16405

2009-09-18 01:12:01

なお、(liboleg に収録されている) oleg さんによる型安全な printf/scanf の実装は他にも色々とあります。 http://okmij.org/ftp/typed-formatting/FPrintScan.html

文字列をパースする仕様なら Template Haskell や将来の型拡張が必要

shelarcy(しぇらーしぃ) @shelarcy

#LLplanets やっているみたいなので、流しておきましょう。Template Haskell 版 printf http://t.co/ptgDZ1yhttp://t.co/XpbCBfE の Text.Printf.Mauke.TH

2011-08-20 12:59:40
shelarcy(しぇらーしぃ) @shelarcy

あと、将来的に文字列を型レベルに持ち上げることができるようになれば、Template Haskell なしでも文字列をパースして型安全に振舞うような printf が書けるようになるかもしれません。 http://t.co/h4veMPD

2011-08-20 13:12:52
shelarcy(しぇらーしぃ) @shelarcy

@xyx_is 将来の GHC では、Template Haskell なしでもソースコード上の文字列をその文字に対応する型として扱えるようになるという噂が c.f. http://t.co/PE1BKI4p http://t.co/aotUYnAS の 8.3 > printf

2011-11-15 21:51:58

GHC 7.4.1 で入る PolyKinds 言語拡張では、Bool や [] のような Haskell で定義されたデータ型を型レベルに昇格させることはできますが、まだ 1 のような数値や "foo" のような文字列などの組み込みの型を型レベルに昇格させることはできません。

おまけ:種多相

Haskell 98/2010 では種(型の型)を単相的に扱わなければならず、型の引数の数が違うと、型クラスのインスタンスを別に用意しなえければなりませんでした。GHC 7.4.1 に入る PolyKinds という言語拡張では、多相種を利用できるようになり、引数の数ごとに別のインスタンスを用意しなくても良くなります。

shelarcy(しぇらーしぃ) @shelarcy

GHC HEAD にて、ユーザーガイドに PolyKinds 言語拡張で有効になる種多相(kind polymorphism)と、データ型を型レベルに昇格する(promote)機能に対する説明が加わりました。 http://t.co/e4EiEB4Q

2011-11-26 02:28:24