gpt4 book ai didi

haskell - 表达式 `pi * r' * r'` 中没有 (Fractional Int) 的实例

转载 作者:行者123 更新时间:2023-12-02 05:32:56 24 4
gpt4 key购买 nike

我正在尝试制作一个非常简单的区域程序:

type Point = (Int, Int)
data Figure = Rect Point Point | Circ Point Int
area (Rect (x1,y1) (x2,y2)) = (x2 - x1) * (y1 - y2)
area (Circ _ r) = pi * r'^2 where r' = fromIntegral r

当我手动将其输入 ghci 时,它没有错误并且按预期工作。

但是,编译这个程序会产生以下错误:

No instance for (Floating Int) arising from a use of `pi'
In the first argument of `(*)', namely `pi'
In the expression: pi * r' ^ 2
In an equation for `area':
area (Circ _ r)
= pi * r' ^ 2
where
r' = fromIntegral r

这是怎么回事?

最佳答案

Always use type signatures .在本例中,您显然希望结果为 Double。一旦明确说明,编译器错误就会变得非常容易理解。


目前错误理解不清楚的原因是:从第一条开始

area (Rect (x1,y1) (x2,y2)) = (x2 - x1) * (y1 - y2)

编译器推断area的结果是(x2 - x1) * (y1 - y2)的类型,与是同一类型xⱼyⱼ 本身:Int。当编译器随后检查第二个子句时,它找到了 fromIntegral'。这可以产生任何数字类型,包括 Int,所以这里没问题。因此推断乘法也是积分的。但这意味着 pi 也需要是 Int,这显然是无稽之谈!

有了正确的签名,

area :: Figure -> Double

编译器将在第一个子句处停止,正确地提示 IntDouble 不匹配。这里需要另一个 fromIntegral

关于haskell - 表达式 `pi * r' * r'` 中没有 (Fractional Int) 的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31310213/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com