gpt4 book ai didi

带有 GADT 的 Haskell 类型推断和类型变量的类型类约束

转载 作者:行者123 更新时间:2023-12-04 14:05:56 26 4
gpt4 key购买 nike

我定义了一个自定义 GADT,其中类型构造函数对类型变量具有类型类约束,如下所示:

data MyGadt x where
Sample :: Show a => a -> MyGadt a

现在,如果我定义以下两个函数:

foo (Sample a) = show a

bar a = Sample a

GHC 为它们推断类型让我有点恼火。foo::MyGadt x -> [Char] 没有提到 xShow 约束,而 bar::Show a => a -> MyGadt a 确实需要明确提及约束。

我假设我不必提及约束,因为它是在 GADT 定义中声明的。我唯一能想到的部分原因是 GADT 在函数中的位置。我不是很深入,但据我了解,MyGadtfoo 中处于正向位置,在 bar 中处于负向位置.

我什么时候必须明确提及类型类约束,GHC 什么时候根据 GADT 类型构造函数的约束自行解决?

最佳答案

使用 GADT 的重点是您希望约束显示在 bar 的签名中,而不是 foo。如果您想要那样,那么您可以使用普通的旧newtype 代替:

newtype MyAdt = Sample a

foo :: Show a => MyAdt a -> String
foo (Sample a) = show a

bar :: a -> MyAdt a
bar = Sample

既不 foo 也不在 bar 中设置约束显然是行不通的,因为这样您就可以例如

showFunction :: (Integer -> Integer) -> String
showFunction = foo . bar

关于带有 GADT 的 Haskell 类型推断和类型变量的类型类约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68527748/

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