使用'sqrt'不会产生(Floating Int)实例

时间:2016-05-05 17:40:09

标签: haskell geometry sqrt

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

public java.lang.String com.maluuba.api.Impl.get()
public java.lang.String com.maluuba.api.Impl.get()

public java.lang.Object com.maluuba.api.Impl.get()
public java.lang.String com.maluuba.api.Impl.get()

这个简单的函数用于找到三边的三角形区域。

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

对此有何不妥的帮助和解释表示赞赏。

更新triangle inequality的方式我已经开始工作(似乎是这样)的解决方案。但是“No instance for”的问题对我来说仍然没有解决。我想弄清楚。

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

2 个答案:

答案 0 :(得分:4)

sqrt函数的类型为

sqrt :: Floating a => a -> a

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

转换它们
fromIntegral :: (Integral i, Num n) => i -> n

为了您的特定目的(确定您是否有三角形),您实际上不需要计算平方根。你能明白为什么吗?

答案 1 :(得分:1)

您需要在计算平方根之前将Int转换为浮点数,然后再将其除以/(对于整数除法使用divquot

还可以简化您的if ... then True else False

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