解析错误< - 在

weight<-getLine 

发生

问题描述:

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

+1

你可以阅读[此](http://www.haskell.org/haskellwiki/Learn_Haskell_in_10_minutes)所需时间短于输入问题所需的时间 – soulcheck 2012-02-08 16:12:20

+0

我知道实现计算和结果的方式。 但我想这样做传递2浮点值并返回一个字符串值,而不是如果其他或case语句的方式。 – user1151874 2012-02-08 16:14:24

另外要的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) 
+0

是的,如果它有帮助,请考虑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。此外weightheight是字符串,所以你不能对它们进行算术而不先把它们转换成数字。

+0

感谢您的帮助,因为互联网上关于haskell的资料较少,我试图结合不同的教程,因此我收到了一些语法错误。我仍然是哈斯克尔的初学者.. – user1151874 2012-02-08 16:19:19

+0

我想问如何申报少于案件陈述? 病例bmi | bmi user1151874 2012-02-08 16:27:28

+1

虽然你可以使用'case'模拟守卫(例如'____ bmi doStuff'的情况(),我建议你提取这部分转化为纯函数,像[this](http://ideone.com/K2ASA) – Vitus 2012-02-08 20:44:59