haskell - 嵌套参数化类型的实例

标签 haskell typeclass

鉴于我有数据类型

data A a = A a
data B b = B b

和类型类

class C c where
    f :: c a -> a

现在类 C 需要一种 * -> * 类型,所以我可以这样做

instance C A where
    f (A a) = a

instance C B where
    f (B b) = b

现在给出一个函数,例如:

ab :: b -> A (B b)
ab = A . B

如何为结果类型声明 C 实例?

我首先可能能够使用 TypeSynonymInstances 的类型同义词,如下所示:

type AB b = A (B b)
class C AB where
    f (A (B b)) = b

特别是因为 ghci 报告了正确的类型:

*Main> :k AB
AB :: * -> *

但是,您似乎无法在实例声明中(或任何地方)使用部分应用的类型同义词。

是否有某种方法可以像构造构造函数一样构造类型 AB ,或者使用其他语法来声明此类嵌套类型的实例?

最佳答案

最简单的可能是定义

newtype AB a = AB { unAB :: A (B a) }

GHC 应该能够为此派生一个 C 实例。

您还可以使用 TypeCompose为了实现这一点,

type AB = A :. B

instance C AB where
  f = f . f . unO

关于haskell - 嵌套参数化类型的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7320646/

相关文章:

haskell - 了解何时使用类型类或 GADT?

haskell - 实例电感作为约束

haskell - 仅在类型构造函数上实例多态有什么意义?

haskell - 双向加法约束

haskell - 是否存在与 Bifunctor 等价的 Monoid?

队列的 Haskell 类型类

haskell - 如何在 Morte 中输入 zipWith?

list - 使用 `take` 实现 Haskell 的 `foldl` 函数

haskell - Cabal中的变量(Haskell)

http - 如何使用 Haskell 的 Network.HTTP.Req 库执行 GET?