我在尝试将元组的两个部分添加在一起时遇到了问题
函数类型:
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/