2013-02-21 2 views
0

мне нужно, чтобы получить среднее значение, поэтому вход останавливается до тех пор, пока пользователь не вводит в отрицательном числе, а затем выход среднегоHaskell ошибки разбора, для усреднения программы

{ 
    getFloat :: IO Float 
    getFloat = do line <- getLine 
        return (read line:: Float) 


    average :: IO Float 
    average = helper summ n 
        where 
        helper :: Float->Float->IO Float 
        helper summ n = do val<-getFloat 
             if (val<0) 
              then (return average) 
              else (do summ = summ + val 
                n = n+1 
                average= summ/n 
                average) 
                 } 
+3

Пожалуйста, прикрепите эту ошибку. Кроме того, любой вопрос обычно должен содержать по крайней мере один символ '?' – Yuras

+0

hs: 46: 54: ошибка синтаксического анализа на входе '=' – 2013-02-21 19:25:19

+0

как исправить эту ошибку синтаксического анализа, и alogotihm получить правильную программу – 2013-02-21 19:26:02

ответ

2

Это лучше отделить чистые и нечистые вычисления , I.e., average может быть только [a] -> b без эффектов ввода-вывода.

main = print =<< average `fmap` go [] 
    where 
    go :: [Int] -> IO [Int] 
    go xs = do 
     x <- (read :: String -> Int) `fmap` getLine 
     if x < 0 then return (x : xs) else go (x : xs) 

    average :: [Int] -> Float 
    average xs = (fromIntegral $ sum xs)/(fromIntegral $ length xs) 

Это не самое лучшее решение, кстати:

  • readLn :: Read a => IO a
  • среднее значение может быть получить легче, не пересекая List дважды
0

Попробуйте что-нибудь например:

main = do (s,n) <- getnums 
      putStrLn $ show $ s/(fromIntegral n) 

getnums :: IO (Float, Int) 
getnums = go 0.0 0 
    where go s n = do line <- getLine 
        let f = read line :: Float 
        if f < 0 then return (s,n) 
          else go (s+f) (n+1) 
+0

'getLine >> = \ line -> return $ read line' совпадает с' read <$> getLine', который является таким же, как 'readLn'. И вам не нужна явная подпись типа для 'read', если вы что-то делаете с результатом, который исправляет его тип. – Cubic

+0

Правда. Я думаю, что реальная проблема OP заключалась в том, как выполнить цикл в монадическом вычислении, поэтому я попытался сделать свой код похожим на оригинал. – ErikR

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