2012-02-08 4 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 

ошибка произошла вошибка синтаксического анализа в Haskell <-

weight<-getLine 

как бы я проворный пользователь вводить «вес» и «высоту», а затем вычислить и вернуть строку как то, что я создаю тип данных bmicalculator::(RealFloat a)=>a->a->String

+1

вы могли читать [это] (http://www.haskell.org/haskellwiki/Learn_Haskell_in_10_minutes) за меньшее время, чем вам нужно было ввести вопрос – soulcheck

+0

Я знаю способ достижения расчета и результата. , но я хочу сделать это способом передачи 2 значения float и вернуть значение строки, а не if else или case statement. – user1151874

ответ

1

дополнительно вы хотите отделить 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

Да, пожалуйста, подумайте над повышением, если это поможет, и попытайтесь прочитать много кода Хеккеля у людей, которые действительно знают это - есть вопрос stackoverflow о стиле haskell. – epsilonhalbe

3

Прежде всего, ваш отступ неправильный (то есть: несуществующий). Содержимое do-блока должно быть отступом.

Тогда вы дали две подписи типа, которые не соответствуют друг другу для bcomculator. Второй - внутри блока do, где он явно не принадлежит.

Тогда вы, кажется, используете шаблонные ограждения внутри блока do, вне любой конструкции, соответствующей шаблону. Это синтаксически недействительно. Вероятно, вам не хватает case bmi of. Вам также необходимо заменить = на ->.

Наконец, вы не можете использовать переменные, которые являются локальными для блока do внутри блока where, следующего за -блоком. Вместо этого вы должны использовать let внутри блока . Кроме того, weight и height являются строками, поэтому вы не можете выполнять арифметику на них, не преобразовывая их сначала в числа.

+0

спасибо за помощь, потому что в интернете есть меньше материала о haskell, я попытался объединить разные учебники, поэтому я получаю синтаксическую ошибку. Я все еще новичок haskell .. – user1151874

+0

Я хочу спросить, как объявить меньше, чем в заявлении case? case bmi of | bmi <= 17.5 = "Вы анорексия!" Я пробовал вот так, но «|» с ошибкой « или <= 17.5 все еще имеет ошибку – user1151874

+1

Пока вы можете имитировать охранники с помощью' case' (т.е. 'case() of _ | bmi <= 17.5 -> doStuff', я предлагаю вам извлечь эта часть в чистую функцию, что-то вроде [этого] (http://ideone.com/K2ASA) – Vitus

Смежные вопросы