Meh*_*dad 15 io haskell functional-programming
我刚刚开始看看Haskell(我之前的FP体验是在Scheme中),我遇到了这段代码:
do { putStrLn "ABCDE" ; putStrLn "12345" }
Run Code Online (Sandbox Code Playgroud)
对我来说,这是程序式编程,如果有的话 - 特别是因为副作用的连续性.
有人请说明这段代码在任何方面都是"功能性的"吗?
Don*_*art 20
虽然它似乎是一个程序性程序,但上述语法被翻译成一个功能程序,如下所示:
do { putStrLn "ABCDE" ; putStrLn "12345" }
=>
IO (\ s -> case (putStrLn "ABCDE" s) of
( new_s, _ ) -> case (putStrLn "12345" new_s) of
( new_new_s, _) -> ((), new_new_s))
Run Code Online (Sandbox Code Playgroud)
也就是说,一系列嵌套函数具有穿过它们的唯一世界参数,从而"按程序"对原始函数进行排序.此设计支持将命令式编程编码为函数式语言.
这个设计背后的语义决策的最佳介绍是"The Awkward Squad"论文,
这样想吧.它实际上并不"执行"IO指令.IO monad是一个纯值,它封装了要执行的"命令式计算"(但实际上并没有执行它).您可以使用monad运算符和类似"do"的结构以纯粹的方式将monad(计算)组合成更大的"计算".尽管如此,本身并没有"执行".实际上,在某种程度上,Haskell程序的整个目的是将一个大的"计算"放在一起,即它的main
值(具有类型IO a
).当你运行程序时,就是运行这个"计算".