gpt4 book ai didi

haskell - 具有歧义检测的通用组合

转载 作者:行者123 更新时间:2023-12-02 03:55:57 24 4
gpt4 key购买 nike

我想定义一个通用组合,它适用于 a -> ba -> 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 扩展来定义第二个实例,而无需类似于 Control.Arrow.Kleislinewtype 包装器?

另一个问题是实例重叠,所以对于 Just ... Just 两个同样合理的实例是可能的。是否可以重新设计 ... 以便 Just ... Just 具有多态类型,因此 a -> Maybe (Maybe a)a -> 也许 a 是它的有效类型?

如果不可能,也许可以通过某种方式推迟实现选择。例如

data Comp a b = Comp a b

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

($$$) 将通用组合(可以是任何东西 - 不一定是函数)提升为函数。然后 Just ... Just $$$ (fromJust . fromJust)

最佳答案

这可能不是您想要的,但它将允许定义实例。通常需要显式类型注释来选择适当的实例。使用您的示例,Just ... Just 的类型为 Comp (->) a (Maybe a) b (Maybe b) => a -> Maybe bFunctionalDependencies可能有助于减少需要显式类型注释的时间,但也会将可能的实例限制为少于您想要的。

{-# 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
(...) = (>=>)

关于haskell - 具有歧义检测的通用组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12652784/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com