关于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
答案 0 :(得分:4)
sqrt
函数的类型为
sqrt :: Floating a => a -> a
(它实际上是Floating
类的一种方法),因此适用于任何标准的基于浮点的数值表示,包括Double
,Complex Double
和其他不太重要的类型。它也可能适用于非标准,非浮点,非常奇特的数值表示。但是Int
不支持平方根,因为只有完美的正方形具有整数平方根。您应该切换到提供它们的类型。如果您需要从Int
值开始,可以使用
fromIntegral :: (Integral i, Num n) => i -> n
为了您的特定目的(确定您是否有三角形),您实际上不需要计算平方根。你能明白为什么吗?
答案 1 :(得分:1)
您需要在计算平方根之前将Int
转换为浮点数,然后再将其除以/
(对于整数除法使用div
或quot
)
还可以简化您的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'))