3

a -> bと の両方で機能する一般的な構成を定義したいa -> Maybe b:

class Comp m where
    (...) :: m a b -> m b c -> m a c

instance Comp (->) where
    (...) = (>>>)

instance Comp (a -> Maybe b) where
    (...) = (>=>)

newtype最近のすべてのGHC拡張機能で、のようなラッパーなしで2番目のインスタンスを定義することは可能Control.Arrow.Kleisliですか?

もう 1 つの問題は、インスタンスが重複しているため、Just ... Just2 つの同等のインスタンスが存在する可能性があることです。再設計することは可能な...ので、Just ... Justポリモーフィック型を持っているので、両方が有効な型付けですか?a -> Maybe (Maybe a)a -> Maybe a

それが不可能な場合は、何らかの方法で実装の選択を延期することが可能です。例えば

data Comp a b = Comp a b

(...) = Comp
($$$) = 

($$$)一般的な構成 (何でもかまいません - 必ずしも関数ではありません) を関数に持ち上げます。それでJust ... Just $$$ (fromJust . fromJust)

4

1 に答える 1

1

これはおそらく探しているものではありませんが、インスタンスを定義できるようになります。適切なインスタンスを選択するには、多くの場合、明示的な型注釈が必要になります。あなたの例を使用すると、次のようにJust ... Just入力されComp (->) a (Maybe a) b (Maybe b) => a -> Maybe bます。 明示的な型注釈が必要な場合に削減するのに役立つFunctionalDependencies かもしれませんが、可能なインスタンスを希望するものよりも少なく制限することにもなります。

{-# LANGUAGE MultiParamTypeClasses #-}
import Control.Category
import Control.Monad

class Comp m a b b' c where
  (...) :: m a b -> m b' c -> m a c

instance Comp (->) a b b c where
  (...) = (>>>)

instance Monad m => Comp (->) a (m b) b (m c) where
  (...) = (>=>)
于 2013-04-10T18:08:42.810 に答える