我正在编写我的第一个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
Int
和之间不匹配Integer
让我们在这里看一下签名:
square :: Int -> Int
getInt :: IO Integer
很明显,这Int
不是一个Integer
,因此选择或使用Num n => n
:
square :: Num n => n -> n
getInt :: Num n => IO n
Int
和之间不匹配IO Int
第二个问题要复杂一些。由于getInt
是IO操作,因此需要先提取它才能使用:
num <- getInt
print $ square num
还有其他方法可以通过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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句