Функция ввода-вывода Haskell, принимающая возвращаемое значение от другой функции - PullRequest
1 голос
/ 12 июня 2011
module PRO where
average1 :: IO Float
avarage1  =
    do
        putStrLn "Enter Marks in Form of a List"
        marks <- getLine
        let m = (read marks)::[Int]
        x<-(sum' (m)) 
        avg <- x/length (m)
        if(x/=[])
           then
                putStrLn ("empty List")
            else
                putStrLn ("Your Avarage is " ++ show(avg))


sum' :: (Num a) => [a] -> a
sum' xs = foldl (\acc x -> acc + x) 0 xs

Моя программа не работает! У меня вопрос: почему я не могу присвоить avg возвращаемую sum функции sum'?

Ответы [ 2 ]

6 голосов
/ 12 июня 2011
module PRO where

average1 :: IO ()
average1 =
    do
        putStrLn "Enter Marks in Form of a List"
        marks <- getLine
        let m = (read marks)::[Int]
        let x = sum' m 
        let avg = (fromIntegral x)/(fromIntegral $ length m)
        if(m==[])
            then
                putStrLn ("empty List")
            else
                putStrLn ("Your Avarage is " ++ (show avg))

sum' :: (Num a) => [a] -> a
sum' xs = foldl (\acc x -> acc + x) 0 xs

i) Неверная подпись типа average1, функция не возвращает значение

ii) [Редактировать: эта точка неверна]

iii)среднее значение - это число с плавающей запятой, поэтому вам необходимо привести целочисленные аргументы

iv) Ваш тест if (x/=[]) неверный и должен использовать m, а не x

v)большинство ваших строк не в монаде IO и поэтому должны использовать let внутри блока do

5 голосов
/ 12 июня 2011

Нельзя использовать нотацию <- для присвоения возвращаемых значений sum' m и x/length m.<- можно использовать только в том случае, если правая часть представляет собой монадическое выражение (в данном случае значение IO), которое не является ни одним из них, и поэтому вместо него следует использовать let x = sum' m и let avg = x / fromInteger (length m) (fromInteger необходим для преобразования Int, возвращаемого length m, в дробное значение, чтобы его можно было передать /).(Также вам нужно изменить x /= [] на m /= [].)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...