关闭

Action

标签: haskellstringscala
242人阅读 评论(0) 收藏 举报
分类:

之前学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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:353731次
    • 积分:8031
    • 等级:
    • 排名:第2637名
    • 原创:433篇
    • 转载:276篇
    • 译文:0篇
    • 评论:14条
    文章分类
    最新评论