#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)
Комментариев нет:
Отправить комментарий