我想定义一个适用于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
(...) = (>=>)
是否有可能使用所有最近的 GHC 扩展来定义第二个实例而无需newtype
类似的包装器Control.Arrow.Kleisli
?
另一个问题是实例重叠,因此对于Just ... Just
两个同样合理的实例是可能的。是否有可能重新设计多态类型,所以两者...
都是有效的类型?Just ... Just
a -> Maybe (Maybe a)
a -> Maybe a
如果不可能,也许可以以某种方式推迟实现选择。例如
data Comp a b = Comp a b
(...) = Comp
($$$) =
($$$)
将通用组合(可以是任何东西 - 不一定是函数)提升到函数。然后Just ... Just $$$ (fromJust . fromJust)