Action

之前学scala时有个不解的问题,现在在haskell里找到答案了

-- file: ch07/actions.hs
str2action :: String -> IO ()
str2action input = putStrLn ("Data: " ++ input)

list2actions :: [String] -> [IO ()]
list2actions = map str2action

numbers :: [Int]
numbers = [1..10]

strings :: [String]
strings = map show numbers

actions :: [IO ()]
actions = list2actions strings

printitall :: IO ()
printitall = runall actions

-- Take a list of actions, and execute each of them in turn.
runall :: [IO ()] -> IO ()
runall [] = return ()
runall (firstelem:remainingelems) =
    do firstelem
       runall remainingelems

main = do str2action "Start of the program"
          printitall
          str2action "Done!"

str2action 这个函数接受一个参数并返回 IO () ,就像你在 main 结尾看到的那样,你可以直接在另一个操作里使用这个函数,它会立刻打印出一行。或者你可以保存(不是执行)纯代码中的操作。你可以在 list2actions 里看到保存的例子,我们在 str2action 用 map ,返回一个操作的列表,就和操作其他纯数据一样。所有东西都通过 printall 显示出来, 而 printall 是用纯代码写的。

虽然我们定义了 printall ,但是直到它的操作在其他地方被求值的时候才会执行。现在注意,我们是怎么在 main 里把str2action 当做一个I/O操作使用,并且执行了它。但是先前我们在I/O Monad外面使用它,只是把结果收集进一个列表。

你可以这样来思考: do 代码块中的每一个声明,除了 let ,都要产生一个I/O操作,这个操作在将来被执行。

对 printall 的调用最后会执行所有这些操作。实际上,因为Haskell是惰性的,所以这些操作直到这里才会被生成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值