Страницы

Поиск по вопросам

суббота, 21 марта 2020 г.

Couldn't match type `Int' with `[Char]'

#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)

Комментариев нет:

Отправить комментарий