Haskell:使用函数值

cad*_*ebe 1 haskell

我正在编写我的第一个Haskell程序,我在使用用户输入的输入值创建函数时遇到了困难.我还不太了解这种语言,所以我开始简单地通过创建一个读取用户输入值的函数并将其作为整数返回.然后,在主调用函数中,我想使用此值作为另一个函数的输入.这是代码场景:

module Main where

square :: Int -> Int
square n = n*n  

getInt :: IO Integer
getInt = do
    putStrLn "Enter a positive integer: "
    s <- getLine
    putStrLn("The number you entered is " ++ s)
    let num = read s :: Integer
    return num

main :: IO ()
main = do 
    num <- getInt
    print num -- works
    print $ square (getInt) -- breaks down here
    print $ square (num) -- also does not work
    print $ square (5) -- works
Run Code Online (Sandbox Code Playgroud)

Bar*_*icz 6

Int和之间不匹配Integer

我们来看看这里的签名:

square :: Int -> Int
getInt :: IO Integer
Run Code Online (Sandbox Code Playgroud)

很明显,Int不是Integer,所以选择,或使用Num n => n:

square :: Num n => n -> n
getInt :: Num n => IO n
Run Code Online (Sandbox Code Playgroud)

Int和之间不匹配IO Int

第二个问题有点复杂.由于getInt是IO操作,因此需要首先提取它以使用:

num <- getInt
print $ square num
Run Code Online (Sandbox Code Playgroud)

还有其他方法可以使用IO操作组合纯函数:

-- Control.Applicative (<$>)
square <$> getInt >>= print

-- Data.Functor (fmap)
fmap square getInt >>= print

-- directly composed with return
getInt >>= return . square >>= print

-- manual lambda extraction
getInt >>= (\x -> return $ square x) >>= print
Run Code Online (Sandbox Code Playgroud)