Haskell无法将预期类型的​​浮点数与实际类型相匹配' a'

时间:2017-11-13 20:35:38

标签: haskell types type-mismatch

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

功能类型:

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)))

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

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

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

2 个答案:

答案 0 :(得分:2)

你的类型错了。正如评论中提到的那样,您在类型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

答案 1 :(得分:0)

帮助您调试此方法的一种方法是注释掉您的类型签名并询问系统的类型。在ghci中,那将是:t close