【问题标题】:Haskell couldn't match expected type float with actual type 'a'Haskell 无法将预期类型 float 与实际类型“a”匹配
【发布时间】:2017-11-14 05:06:37
【问题描述】:

我在尝试将元组的 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)))

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

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

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

【问题讨论】:

  • 您在类型定义中提到Floating a,然后在函数中使用相同的a 类型提供fromIntegral,该类型应该属于Integral 类型类......这是一个冲突。
  • 您需要一个函数Floating a => a -> Float 来产生结果。我希望close :: Floating a => (a,a) -> (a,a) -> aclose :: (Integral a, Floating b) => (a,a) -> (a,a) -> bOrdFloat 来自哪里?
  • @molbdnilo 也许他想从输出中得到一个具体的Float
  • @molbdnilo 是的,我不知道为什么我有 float.... 我想我只是没有意识到我可以使用 a 作为 float 的模棱两可

标签: haskell types type-mismatch


【解决方案1】:

你的类型是错误的。正如 Redu 在 cmets 中提到的,您在 typeclass 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

【讨论】:

    【解决方案2】:

    帮助您调试此问题的一种技术是注释掉您的类型签名并询问系统类型是什么。在 ghci 中,这将是 :t close

    【讨论】:

    • 给我'浮动 a => (a,a) -> (a,a) -> a'
    • 这基本上是我的类型
    • @MaxUmarovs 你对close的定义没有那个类型,但是(Floating a1, Integral b, Integral b1, Integral a, Integral a2) => (a2, b1) -> (a, b) -> a1
    • @MaxUmarovs 你错过了他说要注释掉你的类型签名的部分。
    猜你喜欢
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多