如何解决Haskell方式可以联合两个小功能需要语法建议
我是Haskell的新手,我很难在此程序的两部分代码中加入代码。它的作用(或应该做的)是让我知道,根据等高线定理,三角形是否为等腰。这是我认为可行的方法:
--Determine if a triangle is isosceles by the cosene theroem
module Main where
sides :: (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) -> String
theorem (x,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,c) <- getLine
(x,z) <- sides (a,c)
string <- theorem(x,z)
print string
解决方法
我不确定在我的建议更新后的代码是否会运行,但是我在此代码中看到了一些问题:
-
print
并不是您想要的,因为字符串将使用引号("Please type the size of the triangle faces: "
而不是Please type the size of the triangle faces:
)打印。如果要打印字符串,请将print
替换为putStrLn
-
getLine
的类型为IO String
,因此与(a,b,c)
的模式匹配将失败。但是您可以编写read <$> getLine
-它会应用函数read
,该函数将字符串转换为任何可读类型的值(在这种情况下为(Float,Float,Float)
)到输入字符串。但是输入字符串的格式必须为(_,_,_)
(例如(1,1,1)
) -
当您在do-block中写入
类似a <- b
时,这意味着b
的类型为m t
,其中m
是Monad
,而{{ 1}}的类型为a
。t
的类型为sides
,因此您不能在上面的表达式中写成(Float,Float) -> (Float,Float)
。但是您可以编写b
和let a = b
具有相同类型a
的{{1}}。因此,您可以写b
代替t
。与let (x,y,z) = sides (a,c)
-
(x,z) <- sides (a,c)
未为所有值string <- theorem(x,z)
定义,因为您考虑的是一对等值和不等的情况
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。