--bmicalculator
bmicalculator::IO()
bmicalculator=do bmicalculator::(RealFloat a)=>a->a->String
putStrLn "Please Input your weight"
weight<-getLine
putStrLn "Please Input your height"
height<-getLine
|bmi<=17.5="You are anorexia!"
|bmi<=20.7="You are Under weight"
|bmi<=26.4="You are in normal range"
|bmi<=27.8="You are marginally overweight"
|bmi<=31.1="You are overweight"
|bmi>31.1="You are super OBESE!!"
where bmi=weight/height^2
错误我怎么能提示用户输入“重量”和“高度”,然后计算和像我创建的数据类型返回字符串bmicalculator::(RealFloat a)=>a->a->String
解析错误< - 在</p> <pre><code>weight<-getLine </code></pre> <p>发生
另外要的BMI-计算器从主功能分开,因为它是没有任何副作用的纯函数
main :: IO()
main = do
putStrLn "Please Input your weight"
w <- getLine
let weight = read w :: Float
putStrLn "Please Input your height"
h <- getLine
let height = read h :: Float
putStrLn $ bmicalc weight height
bmicalc :: Float -> Float -> String
bmicalc weight height | bmi<=17.5 = "You are anorexic!"
| bmi<=20.7 = "You are underweight"
| bmi<=26.4 = "You are in normal range"
| bmi<=27.8 = "You are marginally overweight"
| bmi<=31.1 = "You are overweight"
| otherwise = "You are super OBESE!!"
where bmi=weight/(height*height)
是的,如果它有帮助,请考虑upvote,并尝试从真正了解它的人那里读取大量的haskell代码 - 这里有关于haskell风格的一个stackoverflow问题。 – epsilonhalbe 2012-02-09 19:27:55
首先你的缩进是错误的(也就是说:不存在)。 do-block的内容应该缩进。
然后你给出了两种不同于bmicalculator的类型签名。第二个是在它明显不属于的do-block内部。
然后,你似乎在do-block内部使用模式防护,在任何模式匹配构造之外。这在语法上无效。那你可能错过了case bmi of
。您还需要将=
替换为->
。
最后,您不能使用位于do
- 块之后的where-block内的do-block的本地变量。您应该使用do
- 块内的let
。此外weight
和height
是字符串,所以你不能对它们进行算术而不先把它们转换成数字。
感谢您的帮助,因为互联网上关于haskell的资料较少,我试图结合不同的教程,因此我收到了一些语法错误。我仍然是哈斯克尔的初学者.. – user1151874 2012-02-08 16:19:19
我想问如何申报少于案件陈述? 病例bmi | bmi user1151874 2012-02-08 16:27:28
虽然你可以使用'case'模拟守卫(例如'____ bmi doStuff'的情况(),我建议你提取这部分转化为纯函数,像[this](http://ideone.com/K2ASA) – Vitus 2012-02-08 20:44:59
你可以阅读[此](http://www.haskell.org/haskellwiki/Learn_Haskell_in_10_minutes)所需时间短于输入问题所需的时间 – soulcheck 2012-02-08 16:12:20
我知道实现计算和结果的方式。 但我想这样做传递2浮点值并返回一个字符串值,而不是如果其他或case语句的方式。 – user1151874 2012-02-08 16:14:24