Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Haskell: Getting error when accepting string input in user defined function

I’m a newbie in Haskell. Was trying a code to take input string in user defined function and further perform tasks as per argument passed to function in main.

main :: IO()
main=do
{
    print(f 2)
}
f::Int->Int
f n=do
{
    inp<-getLine;
    if (inp=="hello") then (n+2);
    else                   (n);
}

Since this function takes int and returns int, I defined it as Int->Int. However I feel something’s missing.
I’m getting the following error:-

[1 of 1] Compiling Main             ( main.hs, main.o )
main.hs:9:5: error:
    • Couldn't match expected type ‘Int’ with actual type ‘IO b0’
    • In a stmt of a 'do' block: inp <- getLine
      In the expression:
        do inp <- getLine
           if (inp == "hello") then (n + 2) else (n)
      In an equation for ‘f’:
          f n
            = do inp <- getLine
                 if (inp == "hello") then (n + 2) else (n)
  |
9 |     inp<-getLine;
  |     ^^^^^^^^^^^^
main.hs:10:29: error:
    • Couldn't match expected type ‘IO b0’ with actual type ‘Int’
    • In the expression: (n + 2)
      In a stmt of a 'do' block:
        if (inp == "hello") then (n + 2) else (n)
      In the expression:
        do inp <- getLine
           if (inp == "hello") then (n + 2) else (n)
   |
10 |     if (inp=="hello") then (n+2);
   |                             ^^^
main.hs:11:29: error:
    • Couldn't match expected type ‘IO b0’ with actual type ‘Int’
    • In the expression: (n)
      In a stmt of a 'do' block:
        if (inp == "hello") then (n + 2) else (n)
      In the expression:
        do inp <- getLine
           if (inp == "hello") then (n + 2) else (n)
   |
11 |     else                   (n);
   |                             ^

How to rectify this error??

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

>Solution :

A do block almost always indicates that you are defining a monadic computation(1). Therefore the type of f has to be Int -> IO Int (IO is induced by the use of getLine here). Additionally, since the result has to be contained in a monadic context, you should wrap n+2 and n with return.

So the final code of f should be

f :: Int -> IO Int
f n = do
    inp <- getLine
    if inp == "hello" then return (n + 2)
    else                   return n

Note that the use of f in main has to be adjusted accordingly.


(1)sometimes applicative, but anyway

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading