2013-07-17 12 views
5

私は、いくつかのコンテナに非常に似た機能セットがあることを知りました。 List、Set、Sequence、Text、およびBytestringなどがあります。私はなぜ彼らが1つ以上の一般的なタイプメーターを使用しないのだろうかと思います。コンテナ型のtypeclassがないのはなぜですか?

+1

実際にはそうです。しかし、 "一般的なタイプメス"のリストは、通常、 "Monoid"、 "Functor"、そして時には "ListLike"に限られています。私はそれが他のクラスが存在しないか、十分に一般的でないためだと思います。 – Yuras

+3

ところで、それらのすべてを抽象化する方法を見つけたライブラリの 'lens'パッケージを見てください。しかし、それは新しいタイプキャスティングでは、あなたが考えるかもしれない方法ではありません。 – Carl

+2

@Yuras - コンテナはTraversableとFoldableをサポートしている必要があります。 –

答えて

7

実際には、質問Making a single function work on lists, ByteStrings and Texts (and perhaps other similar representations)がありますが、それはあなたのものとほぼ同じです。

別のパッケージに含まれている主な理由は、関数の依存関係や型のファミリのいずれかの言語拡張が必要な​​ことが考えられます。 TextにはCharが含まれ、ByteStringにはWord8が含まれ、[]には任意のタイプを含めることができ、SetにはOrdのインスタンスのみを含めることができます。リストのような

9

共通の機能セットは何ですか? AFAICSは、複数のコンテナを1つのコンテナに結合し、空のコンテナを生成する機能のみをサポートします。そして確かに、彼らはすべて正確にそのインターフェイスを提供するMonoidです!

いくつかは多型であるため、これらのすべてでは何もできません。

3

多形コンテナ、SequenceMaybeMapFunctorFoldableTraversable型クラスのインスタンスです。 Setについては

オードインスタンスは、それは不可能(あなたがファンクタの法則に従うでしょうfmapData.Set.map)を定義することができますが、それの署名は引数にオードインスタンスを必要とする)他の人を定義することを可能にするよう、あなたは、唯一のFoldableを持っています。

前述のように、TextとBytestringは同じような型定義のインスタンスにすることができますが、関数の依存関係や型のファミリが必要になります。

+0

[Set _is_ monoid](http://hackage.haskell.org/packages/archive/containers/0.5.2.1/doc/html/src/Data-Set-Base.html#line-231):そのクラスはポリモーフィック関数/含まれている型はインスタンスの頭に固定されていますが、そこに単相性のコンテナとして動作します。 - ちなみに、[Functor/Applicative/Monad](http://copilotco.com/mail-archives/haskell-cafe.2007/msg00051.html)も同様に賢明な方法があります。 Ord'インスタンスをGADTにバインドする必要があります。 – leftaroundabout

+0

真実、良い点。 – phadej

+1

Set and Functorの詳細:http://dorchard.wordpress.com/2011/10/18/subcategories-in-haskell-exofunctors/ – phadej

関連する問題