gpt4 book ai didi

haskell - 具有 Haskell 函数依赖性的不明确类型变量

转载 作者:行者123 更新时间:2023-12-03 01:41:57 26 4
gpt4 key购买 nike

我正在研究 Haskell 的 FunctionDependency-Extension 以及 MultiParamTypeClasses。我定义了以下内容:

class Add a b c | a b -> c where
(~+) :: a -> b -> c
(~-) :: a -> b -> c
neg :: a -> a
zero :: a

效果很好(我尝试过 Int 和 Double 的实例,最终目标是无需显式转换即可添加 Int 和 Double)。

当我尝试像这样定义 neg 或 (~-) 的默认实现时:

class Add ...
...
neg n = zero ~- n

GHCi (7.0.4) 告诉我以下内容:

Ambiguous type variables `a0', `b0', `c0' in the constraint:
(Add a0 b0 c0) arising from a use of `zero'
Probable fix: add a type signature that fixes these type variable(s)
In the first argument of `(~-)', namely `zero'
In the expression: zero ~- n
In an equation for `neg': neg n = zero ~- n

Ambiguous type variable `a0' in the constraint:
(Add a0 a a) arising from a use of `~-'
Probable fix: add a type signature that fixes these type variable(s)
In the expression: zero ~- n
In an equation for `neg': neg n = zero ~- n

我想我确实理解这里的问题。 GHC 不知道要使用哪个零,因为它可以是任何零,产生任何东西,然后将其输入到我们只知道的 ~- 中,它有一个a 位于其正确参数中并产生 a

那么我如何指定它应该是来自同一个实例的零,即我如何表达类似的内容:

neg n = (zero :: Add a b c) ~- n

我认为这里的abc不是形成周围类的a b c,但是任何 a b 和 c,那么如何表达一个对局部类型变量的引用的类型呢?

最佳答案

negzero 拉出到仅使用一种类型的父类(super class)中:

class Zero a where
neg :: a -> a
zero :: a

class Zero a => Add a b c | a b -> c where
(~+) :: a -> b -> c
(~-) :: a -> b -> c

重点是,按照您的方式,zero::Int 可能是来自 Add Int Int Intzero Add Int Double Double 中的 zero,并且无论您是否从默认实现内部引用它,都无法消除两者之间的歧义或实例声明或普通代码。

(您可能会反对 Add Int Int Int 中的 zeroAdd Int Double Double 中的 zero > 将具有相同的值,但编译器无法知道有人不会在不同的模块中定义 Add Int Char Bool 并给 zero 不同的值那里。)

通过将类型类分成两部分,我们消除了歧义。

关于haskell - 具有 Haskell 函数依赖性的不明确类型变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10447945/

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