2012-02-08 29 views
-5
--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パースエラー< -

を作成するもののような文字列を計算して返すことができ

weight<-getLine 

で起こりました

+1

ない純粋な関数であるとして、あなたが読むことができる主な機能から、BMI-電卓を分離したいです/ haskellwiki/Learn_Haskell_in_10_minutes)あなたが質問を入力する必要があるよりも短い時間で – soulcheck

+0

私は計算と結果を達成する方法を知っています。 しかし、私は2つの浮動小数点値を渡し、文字列の値を返す方法をしたい、elseまたはcase文ではなく。 – user1151874

答えて

1

さらにあなたは[この](http://www.haskell.orgそれはどんな副作用

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

3

まず、あなたのインデントは間違っています(存在しないと言います)。 do-blockの内容は字下げする必要があります。

次に、バイマルコンピュータとお互いに一致しない2つのタイプシグネチャを指定しました。 2番目のブロックは明らかに属していないブロックの内側にあります。

次に、パターンマッチング構造の外で、do-block内部にパターンガードを使用しているようです。これは構文上無効です。おそらくcase bmi ofがありません。また、=->に置き換える必要があります。

最後に、doブロックの後にあるwhereブロック内のdoブロックのローカル変数を使用することはできません。代わりにdoブロック内にletを使用する必要があります。さらにweightheightはstringなので、最初に数値に変換せずに算術演算を行うことはできません。

+0

助けてくれてありがとう、haskellについてインターネット上の資料が少ないので、私は別のチュートリアルを組み合わせようとしたので、構文エラーが出ます。私はまだhaskellの初心者です。 – user1151874

+0

私はcase文の中で宣言する方法を尋ねたいですか? ケースbmiが | bmi <= 17.5 = "あなたは食欲不振です!" 私はこのようにしようとしましたが、エラー " または<= 17.5のエラーがまだ発生している" | " – user1151874

+1

' case {} {_ {bmi <= 17.5 -> doStuff'の場合}を使用してガードをシミュレートできますが、この部分を純粋な関数、[this](http://ideone.com/K2ASA) – Vitus