没有因使用'sqrt'而引起的(Floating Int)实例

yul*_*ian 1 geometry haskell sqrt

关于SO的另一个问题,标题相同。我在这里已经阅读了已经回答的问题,但仍然不明白如何解决这些问题

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
Run Code Online (Sandbox Code Playgroud)

在这个简单的函数中,该函数用于通过3个边找到三角形的面积。

----- 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
Run Code Online (Sandbox Code Playgroud)

任何帮助和对这里出什么问题的解释表示赞赏。


更新:三角形不等式的方式,我已经解决了(似乎是这样)的解决方案。但是“ No instance for”的问题对我来说仍然没有解决。我确实想弄清楚。

-- 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
Run Code Online (Sandbox Code Playgroud)

dfe*_*uer 5

sqrt函数类型

sqrt :: Floating a => a -> a
Run Code Online (Sandbox Code Playgroud)

(它实际上是一个方法Floating类),所以它适用于任何标准的基于点浮动数值表示,包括DoubleComplex Double和其它,不太重要的,种类。它也可能适用于非标准,非浮点,非常漂亮的数字表示形式。但是Int不支持平方根,因为只有完全平方才具有整数平方根。您可能应该切换到提供它们的类型。如果您需要从Int值开始,则可以使用

fromIntegral :: (Integral i, Num n) => i -> n
Run Code Online (Sandbox Code Playgroud)

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

  • @YulianKhlevnoy:“不适合超级复杂的数学(或类似的东西)” –很好,这正是您不应该取负数平方根的原因!(碰巧您的原始支票会工作_,但比其他任何事情都“走运”:`sqrt(-1)`会产生特殊的IEEE745值“ NaN”,而与“ NaN”进行比较的结果总会得出“所以...`sqrt(-1)&gt; 0`是错误的,但是`sqrt(-1)&lt;= 0`也是_false_错误,矛盾的是。) (2认同)