Haskell 无法将预期类型 float 与实际类型 'a' 匹配

标签 haskell types type-mismatch

我在尝试将元组的两个部分添加在一起时遇到了问题

函数类型:

close :: (Floating a, Ord a) => (a,a) -> (a,a) -> Float

函数定义:

close y x = sqrt (((fromIntegral(snd x) - fromIntegral(snd y))^2) + ((fromIntegral(fst x) - fromIntegral(fst y)^2)))

在向函数提供格式 ( , ) 的 y 元组和格式 ( , ) 的 x 元组时,它应该计算两个坐标之间的距离。 但是在启动时我收到错误:

Couldn't match expected type 'Float' with actual type 'a'
a is a rigid type variable bound by...

我确实明白为什么会出现这个问题,但我不知道如何解决它

最佳答案

您的类型错误。正如 Redu 在评论中提到的,您在类型类 Floating 下有一个类型,并且正在对其调用 fromIntegral

Prelude> :t fromIntegral
fromIntegral :: (Num b, Integral a) => a -> b

您不能使用Floating Integral,因此此操作会失败。您的类型应该是:

close :: Integral a => (a, a) -> (a, a) -> Float

请注意,您也不需要那么多 fromIntegral 调用,因为 (^)(Num a, Integral b) => a - 进行操作> b -> a,任何数字都可以作为基数。唯一重要的操作是 sqrt,它需要 Floating a

close :: Integral a => (a, a) -> (a, a) -> Float
close (x1, y1) (x2, y2) = sqrt . fromIntegral $ squaredDistance where
  squaredDistance = (x1 - x2) ^ 2 + (y1 - y2) ^ 2

关于Haskell 无法将预期类型 float 与实际类型 'a' 匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47273108/

上一篇:Liferay 聚类

下一篇:Asp.net 委托(delegate)

相关文章:

haskell - 如何获取特定类型类实例的多态函数类型?

haskell - 如何将 [TExp a] 转换为 TExp [a],或者以编程方式将 FineTH 应用于多个值?

Haskell 元组连接函数定义问题

postgresql - Postgres 9.1 SETOF 记录类型

java - 类型与 Iterator 接口(interface)不匹配

haskell - 为什么 f <$> g <$> x 等价于 (f . g) <$> x 虽然 <$> 不是右结合的?

haskell - Hoopl 中重写函数内的单子(monad)效应示例?

c++ - 在 C++ 中确定模板类型的取值范围

java - 类型不匹配 : cannot convert from ByteMatrix to BitMatrix

Excel VBA 类型不匹配 - 公共(public)对象