gpt4 book ai didi

Haskell 类型族错误

转载 作者:行者123 更新时间:2023-12-03 14:09:05 25 4
gpt4 key购买 nike

很抱歉用这个简单的问题打扰您。我正在尝试了解类型系列扩展的工作原理。当我玩弄它时,我遇到了一个错误,我不知道为什么。

class Foo a b c where
data T a b c :: *

f :: a -> T a b c

g :: T a b c -> b

h :: c -> a -> b
h c a = g $ f a

错误信息:
    Could not deduce (Foo a b c0) arising from a use of ‘g’
from the context (Foo a b c)
bound by the class declaration for ‘Foo’
at DB/Internal/Typecast.hs:(17,1)-(25,19)
The type variable ‘c0’ is ambiguous
Relevant bindings include
a :: a (bound at DB/Internal/Typecast.hs:25:9)
h :: c -> a -> b (bound at DB/Internal/Typecast.hs:25:5)
In the expression: g
In the expression: g $ f a
In an equation for ‘h’: h c a = g $ f a

我不明白 T a b c 中的 c 是如何模棱两可的为 g .编译器不能得到 c的类型吗?来自 T a b cf ?

我只想要 g . f 的组合

最佳答案

注意在定义中

h :: c -> a -> b
h c a = g $ f a
f没有限制和 g引用您正在定义的同一个实例 h为了。 (而且这种灵活性对于定义实例通常很有用。)

从类型推断, g的结果仅限于同一类型 b ,以及 f 的参数仅限于类型 a ,但没有什么说的 T a b c从一个传递到另一个使用相同的 c !

要在这种情况下解决此问题,您可以启用 ScopedTypeVariables并做
    h c a = g (f a :: T a b c)

请注意,这是有效的,因为数据族是“内射的”(数据族的类型参数可以从最终类型中推导出来)。如果您改用类型系列,即使这样也行不通,从那时起 T a b c不一定确定 c根本。

关于Haskell 类型族错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32213649/

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