Haskell 没有因使用‘;sqrt&x2019;

Haskell 没有因使用‘;sqrt&x2019;,haskell,geometry,sqrt,Haskell,Geometry,Sqrt,还有一个问题,标题相同。我已经在这里读到了答案,但我仍然不明白如何解决这些问题 No instance for (Fractional Int) arising from a use of ‘/’ In the expression: (a + b + c) / 2 -- and No instance for (Floating Int) arising from a use of ‘sqrt’ In the first argument of ‘(>)’, namely 在这个简单的

还有一个问题,标题相同。我已经在这里读到了答案,但我仍然不明白如何解决这些问题

No instance for (Fractional Int) arising from a use of ‘/’
In the expression: (a + b + c) / 2
-- and
No instance for (Floating Int) arising from a use of ‘sqrt’
In the first argument of ‘(>)’, namely
在这个简单的函数中,求三角形的三边面积

----- Heron's formula -----
-- S = sqrt(p*(p-a)*(p-b)*(p-c)), where p = (a+b+c)/2

isTriangle :: Int -> Int -> Int -> Bool
isTriangle a b c = let p = (a + b + c) / 2
                   in if (sqrt(p * (p - a) * (p - b) * (p - c)) > 0)
                      then True
                      else False
任何帮助和解释这里的错误都是非常感谢的


更新: 在这方面,我已经找到了工作(似乎是这样)的解决办法。但是“没有实例”的问题对我来说仍然没有解决。我真的很想弄明白

-- works fine
import Data.List (sort)
isTriangle :: Int -> Int -> Int -> Bool
isTriangle a b c = let sides = sort[a, b, c]
                   in if ((last sides) < head sides + (head $ tail sides))
                      then True
                      else False
——工作正常
导入数据列表(排序)
isTriangle::Int->Int->Int->Bool
isTriangle a b c=让边=排序[a,b,c]
如果((最后边)<头边+(头尾边))
那是真的
否则错误

在计算平方根并将其除以
/
之前,需要将
Int
转换为浮点数(对于整数除法,请使用
div
quot

如果。。。然后为真,否则为假

isTriangle :: Int -> Int -> Int -> Bool
isTriangle a b c = let a' = fromIntegral a
                       b' = fromIntegral b
                       c' = fromIntegral c
                       p = (a' + b' + c') / 2
                   in 0 < sqrt (p * (p - a') * (p - b') * (p - c'))
isTriangle::Int->Int->Int->Int->Bool
isTriangle a b c=设a'=来自积分a
b'=积分b
c'=积分c
p=(a'+b'+c')/2
在0
在计算平方根并将其除以
/
之前,需要将
Int
转换为浮点数(对于整数除法,请使用
div
quot

如果。。。然后为真,否则为假

isTriangle :: Int -> Int -> Int -> Bool
isTriangle a b c = let a' = fromIntegral a
                       b' = fromIntegral b
                       c' = fromIntegral c
                       p = (a' + b' + c') / 2
                   in 0 < sqrt (p * (p - a') * (p - b') * (p - c'))
isTriangle::Int->Int->Int->Int->Bool
isTriangle a b c=设a'=来自积分a
b'=积分b
c'=积分c
p=(a'+b'+c')/2
在0
sqrt函数的类型为

sqrt :: Floating a => a -> a
(它实际上是一种
浮点
类的方法),因此它适用于任何标准的基于浮点的数字表示,包括
双精度
复杂双精度
,以及其他不太重要的类型。它可能也适用于非标准、非浮点、非常奇特的数字表示。但是
Int
不支持平方根,因为只有完全平方才有整数平方根。您可能应该切换到提供它们的类型。如果需要从
Int
值开始,可以使用

fromIntegral :: (Integral i, Num n) => i -> n


出于您的特殊目的(计算是否有三角形),您实际上不需要计算平方根。你知道为什么吗?

函数的类型是

sqrt :: Floating a => a -> a
(它实际上是一种
浮点
类的方法),因此它适用于任何标准的基于浮点的数字表示,包括
双精度
复杂双精度
,以及其他不太重要的类型。它可能也适用于非标准、非浮点、非常奇特的数字表示。但是
Int
不支持平方根,因为只有完全平方才有整数平方根。您可能应该切换到提供它们的类型。如果需要从
Int
值开始,可以使用

fromIntegral :: (Integral i, Num n) => i -> n


出于您的特殊目的(计算是否有三角形),您实际上不需要计算平方根。你知道为什么吗?

非常非常好的解释!不,我不明白你是不是说Heron变体中的
sqrt
无用。(这是第二个var(带不等式)根本不处理
sqrt
。@YulianKhlevnoy不仅不需要计算平方根,事实上这样做是错误的!如果参数是否定的,那么根是什么?当然,没有什么可以与0进行有意义的比较@左撇子,如果是否定的论点,我同意。但这并不可怕,请注意三角形边>=0这一事实。此函数适用于此类简单的情况,而不适用于超复杂的数学(或类似的东西)。但我明白了:似乎第二种变体(没有
sqrt
)更好。@YulianKhlevnoy,我不知道你的意思;你应该仔细听leftaroundabout(总是,尤其是这里)。@YulianKhlevnoy:“不适用于超复杂的数学(或类似的东西)”-好吧,那很好,这正是你不应该取负数的平方根的原因!(碰巧您的原始检查会起作用,但比任何其他检查都更“运气不佳:
sqrt(-1)
会产生特殊的IEEE745值
NaN
,并且无论您与
NaN
比较什么,都会给出
False
。因此,
sqrt(-1)>0
是False,但
sqrt(-1)非常非常好的解释!不,我不明白你是不是指Heron变体中
sqrt
的无用性。(这是第二个变量(带不等式)根本不涉及
sqrt
).@YulianKhlevnoy你不仅不需要计算平方根,事实上这样做是错误的!如果参数为负,那么根会是什么?当然,如果参数为负,你就无法有意义地与0进行比较!@leftaroundabout,如果参数为负,我同意。但这并不可怕,请注意三角形边>=0的事实。此函数适用于如此简单的情况,不适用于超复杂的数学(或类似的)。但我明白:似乎第二个变量(不带
sqrt
)更好。@YulianKhlevnoy,我不知道你的意思;你应该仔细听LeftAroundaound(总是,尤其是在这里)。@YulianKhlevnoy:“不适用于超复杂的数学(或类似的数学)”–好吧,这很好,这正是你不应该取负数的平方根的原因!(碰巧你的原始检查