haskell - 对类型类约束感到困惑

标签 haskell typeclass

我是 Haskell 的初学者,目前很困惑,我确信这与我使用的约束有关,我不断收到错误

代码

averageThreeNumbers:: Floating a=> (a, a, a) -> a
averageThreeNumbers (x,y,z) = ((x+y+z)/3)

howManyBelowAverage:: Floating a=> (a, a, a) -> [a]
howManyBelowAverage (b,c,d) = [x|x <- [b,c,d], x > averageThreeNumbers(b,c,d)]

错误

Could not deduce (Ord a) arising from a use of `>'
from the context: Floating a
bound by the type signature for:
howManyBelowAverage :: Floating a=> (a, a, a) -> [a]
Possible fix: add (Ord a) to the context of the type signature

尽管当我使用相同的列表但在控制台中使用原始 float 时,它工作得很好。我在这里错过了一些大事吗?如有任何帮助,我们将不胜感激。

编译良好:

[x|x <- [1.2, 3.2, 4.6], x > averageThreeNumbers (1.2, 3.2, 4.6)]

最佳答案

由于您将 value 输出值与 averageThreeNumbers 的结果进行比较,因此您需要在 howManyBelowAverage 函数中包含 Ord 约束。我还认为您的意思是检查 x 是否小于函数返回值(在上面的代码片段中,您执行相反的操作)。

修改约束和比较检查,我们最终得到以下结果:

howManyBelowAverage :: (Ord a, Floating a) => (a,a,a) -> [a]
howManyBelowAverage (b,c,d) = [ x | x <- [b,c,d], x < averageThreeNumbers(b,c,d)]

关于haskell - 对类型类约束感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40499316/

相关文章:

string - IsString 实例不会自动转换为 String

haskell - 使用 `ldap-haskell` : can it be made secure? 进行 LDAP 身份验证

haskell - 在haskell中派生Applicative

haskell - GHCi中特殊情况下的函数定义

haskell - 需要配置数据的类型类实例。我有什么选择?

haskell - Haskell 中的孤立实例

haskell - 是否有 Haskell 时间类型类

math - haskell 中的复杂迭代

scala - 在scala 2.13中,为什么有时无法显式调用类型类?

haskell - 可以在 Haskell 中通过类型类的模式匹配实现多重分派(dispatch)吗?