0

我是 Haskell 的新手,我很难为这个程序加入两段代码。它所做的(或应该做的)是让我知道三角形是否根据 cosenes 定理等腰。这是我认为可行的方法:

--Determine if a triangle is isosceles by the cosene theroem

module Main where
sides :: (Float, Float, Float) -> (Float, Float, Float)
sides (a, b, c) = (x, y, z)
 where
   x = acos((b^2 + c^2 - a^2) / (2 * b * c))
   y = acos((a^2 + c^2 - b^2) / (2 * a * c))
   z = acos((a^2 + b^2 - c^2) / (2 * a * b))  

theorem :: (Float, Float, Float) -> String
theorem (x, y, z)
  |(x==y && x/=z) = "Es isosceles"
  |(x==z && x/=y) = "Es isosceles"
  |(y==z && y/=x) = "No es isosceles"
 
main :: IO()
main = do
   print "Please type the size of the triangle faces: "
   (a, b, c) <- getLine
   (x, y, z) <- sides (a, b, c)
   string <- theorem(x, y, z)
   print string
4

1 回答 1

3

我不确定在我的建议更新后的代码是否会运行,但我在这段代码中看到了一些问题:

  1. print不完全是您想要的,因为字符串将使用引号("Please type the size of the triangle faces: "而不是Please type the size of the triangle faces: )打印。如果要打印字符串,请替换printputStrLn

  2. getLine有 type IO String,所以模式匹配(a, b, c)会失败。但是您可以编写read <$> getLine- 它会将将read字符串转换为任何可读类型的值(在本例中为(Float, Float, Float))的函数应用于输入字符串。但输入字符串必须是格式(_, _, _)(例如(1, 1, 1)

  3. 当您a <- b在 do-block 中写入时,这意味着b具有类型m twhere misMonada类型tsides有 type (Float, Float, Float) -> (Float, Float, Float),所以你不能b在上面的表达式中写这个。但是你可以写let a = bwhere 两者都a具有b相同的类型t。所以你可以改写let (x, y, z) = sides (a, b, c)(x, y, z) <- sides (a, b, c)同样与string <- theorem(x, y, z)

  4. theorem不要为所有值定义,(x, y, z)因为您考虑一对等于值和一个不等于的情况

于 2020-09-14T07:10:17.810 回答