这是我的功能:
foo :: Int -> Int
foo i = do
putStrLn "Foo Function has run!"
return (i*2)
Run Code Online (Sandbox Code Playgroud)
以上有编译时错误.
如果我这样做,我希望它是这样的:
bar = foo 6
Run Code Online (Sandbox Code Playgroud)
酒吧将是12.
但是当首次运行该函数时,它会输出字符串"Foo Function has run!" 我怎样才能做到这一点?
您必须将该功能转换为IO操作.Haskell严格强制您将执行IO的代码与不执行IO的代码分开:
foo :: Int -> IO Int
foo i = do
putStrLn "Foo Function has run!"
return (i * 2)
Run Code Online (Sandbox Code Playgroud)
然后,您可以在另一个IO函数中提取此值:
main :: IO ()
main = do
bar1 <- foo 6
bar2 <- foo bar1
print (bar1, bar2)
Run Code Online (Sandbox Code Playgroud)
Haskell选择这条路线的原因有很多种,但一些重要的(没有特别的顺序)是: