我正在编写我的第一个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)
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)
| 归档时间: |
|
| 查看次数: |
60 次 |
| 最近记录: |