2016-05-04 8 views
4

aにはFoldableの容器があります。 BasicPreludeの型名でFoldableが提供するメソッドの1つはelem :: (Eq a) => a -> t a -> Boolです。さて、私のコンテナでは、aOrdインスタンスである場合のデフォルトよりも効率的にelemを実装できますが、その場合にのみです。aの型クラスに基づいてFoldableインスタンスメソッドを特殊化できますか?

可能であれば、より効率的にelemを利用したいと考えています。好ましくは、同じ署名(つまり、「透過的」)を使用します。しかし、私はこれを行う1つの方法しか見ることができません。これは、コンテナのインスタンスで(Ord a)という制約を必要とすることです。これは一般的な意味では意味がありません。

aOrdで、何とか他のものが一般的にの場合にのみ、私は特殊なelemを使用できますか? GHCの拡張機能を使用しても問題ありません。

+3

おそらくGHC 'RULES'プラグマを使用して、あまりにも特定のタイプを特化することはおそらくありません。これは...確かな賭けではありません。 – dfeuer

答えて

4

いいえ標準型のクラスは、制限されたパラメータを必要とする型と互換性がありません。

monotraversable libraryをご確認ください。特にMonofoldableOrd classをご利用ください。お役に立ちましたか?​​ライブラリは、ByteStringまたはTextと考えるか、またはクラスが制限された要素タイプ(Setと考える)を持つコンテナで動作するように書かれたFoldable/Traversableクラスの代替バージョンです。

ライブラリーはTypeFamilies extensionの大量のユーザーであるため、少し勉強しなければならないかもしれませんが、ライブラリーのソースコードでは、エクステンションの使用方法に関する豊富な例が示されています。

+1

私はまだ 'MonoFoldable'が特定の問題にもっと自然に当てはまるような、基底関数を持つMPTCの代わりにタイプファミリを使用する理由を理解していません。 – dfeuer

関連する問題