#haskell #haskell_stack
Начал изучать haskell по книге.
В процессе написал и попытался скомпилировать следующий код:
{-# LANGUAGE MultiWayIf #-}
module Main where
calculateTime :: Int -> Int
calculateTime timeInS =
let threshold = 40
correction = 120
in
if | timeInS < threshold -> timeInS + correction
| otherwise ->
let delta = 8
in
timeInS + delta + correction
main :: IO()
main = putStrLn (calculateTime 50)
Но компиляция не завершилась, сообщив мне об ошибке:
app\Main.hs:18:18: error:
* Couldn't match type `Int' with `[Char]'
Expected type: String
Actual type: Int
* In the first argument of `putStrLn', namely `(calculateTime 50)'
In the expression: putStrLn (calculateTime 50)
In an equation for `main': main = putStrLn (calculateTime 50)
|
18 | main = putStrLn (calculateTime 50)
| ^^^^^^^^^^^^^^^^
-- While building package real-0.1.0.0 using:
C:\sr\setup-exe-cache\x86_64-windows\Cabal-simple_Z6RU0evB_2.4.0.1_ghc-8.6.5.exe
--builddir=.stack-work\dist\e626a42b build lib:real exe:real-exe --ghc-options " -fdiagnostics-color=always"
Process exited with code: ExitFailure 1
Насколько я понял, haskell ожидал, что функция заменится строкой, но фактически это
было число.
Я предполагал, что функция примет 1 аргумент (timeInS) типа Int (50) и отобразит
его на тип Int, исходя из этого объявления:
calculateTime :: Int -> Int
После чего напечатает отобразившееся значение:
putStrLn (calculateTime 50)
В итоге, я ожидал, что программа напечатает мне 178.
Где я допустил ошибку? И вообще, правильно ли я понял сообщение компилятора?
Ответы
Ответ 1
Ошибка в том, что putStrLn применяется только к значениям типа [Char] (он же String) putStrLn :: String -> IO () Нужно либо использовать show для преобразования числа в строку putStrLn (show (calculateTime 50)) Либо использовать print, который сделает ровно то же самое print (calculateTime 50)
Комментариев нет:
Отправить комментарий