gpt4 book ai didi

haskell - 使用多个参数类型类时 Haskell 中的模棱两可的类型变量

转载 作者:行者123 更新时间:2023-12-04 14:50:25 24 4
gpt4 key购买 nike

我在 Haskell 的类型类中与模棱两可的类型变量作斗争:

这段代码将我的问题归结为基础:

class Problem a b where
foo :: a -> a
bar :: b -> b
baz :: a -> b -> (a, b)

solve :: Problem a b => a -> b -> (a, b)
solve a b = baz (foo a) (bar b)

它没有编译,说我在调用 foo 和 bar 时没有使用的类型变量是模棱两可的:
    Ambiguous type variable `b0' in the constraint:
(Problem a b0) arising from a use of `foo'
Probable fix: add a type signature that fixes these type variable(s)
In the first argument of `baz', namely `(foo a)'
In the expression: baz (foo a) (bar b)
In an equation for `solve': solve a b = baz (foo a) (bar b)

Ambiguous type variable `a0' in the constraint:
(Problem a0 b) arising from a use of `bar'
Probable fix: add a type signature that fixes these type variable(s)
In the second argument of `baz', namely `(bar b)'
In the expression: baz (foo a) (bar b)
In an equation for `solve': solve a b = baz (foo a) (bar b)

当我为 foo、bar 和 baz 提供三个单独的类型类并将solve定义为:
solve :: FooProblem a => BarProblem b => BazProblem a b => a -> b -> (a, b)

但这非常麻烦。为什么我首先在​​一个类型类中拥有这三个功能?好吧,它们都是相关的,我总是一起使用这三个。

我尝试在 foo 和 bar 周围放置类型签名并使用 forall (诚然,在绝望中有些随机)。我查看了现有的模棱两可的类型变量问题,但没有看到与我相关的修复。

我该如何解决这个问题?

非常感谢。

最佳答案

从 foo 的使用来看,编译器无法知道选择哪个 Problem 实例。可能有多个实例具有相同的 a但不同b s。您可以告诉编译器,函数依赖不是这种情况,但在这种情况下,我认为有一个更简单的解决方案:

class (FooProblem a, BarProblem b) => BazProblem a b where
baz :: a -> b -> (a, b)

然后解决的类型是干净的:
solve :: BazProblem a b => a -> b -> (a, b)

关于haskell - 使用多个参数类型类时 Haskell 中的模棱两可的类型变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7307649/

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