在纯函数式编程中,我们不像在命令式编程中那样执行语句。没有“做这个,然后做那个”的概念。相反,我们主要编写将一些参数作为输入并返回一些输出的函数。
如果我们确实想与世界交互,而不仅仅是计算返回值怎么办?好吧,在这种特殊情况下,我们求助于 IO monad。请注意,这不是我们经常做的事情——我们更愿意尽可能避免使用 IO monad,以便保持大部分计算的纯洁性。
这是一个例子:
f :: Int -> IO ()
f x = do
putStrLn "hello"
if x > 15
then putStrLn "> 15"
else putStrLn "not > 15"
if x > 10
then putStrLn "> 10"
else putStrLn "not > 10"
如果您是初学者,我建议您在使用 IO monad 之前学习 Haskell 基础知识。到处使用 IO monad 会导致非常单一的代码。
大多数学习 FP 的命令式程序员都试图将他们以前的习惯硬塞进 FP 语言中——这很常见。但是,使用副作用和可变变量进行编程并不能很好地处理 FP。人们逐渐需要停止根据有效陈述进行思考,而是重新连接自己的大脑,以便根据价值观和(通常是递归的)定义进行思考。
请注意,FP 在这方面并不特殊。如果一个人首先学习纯 FP,比如在 Haskell 中,然后接触任何命令式编程语言,他们可能会问这样的想法:“我如何使用状态单子?”。即使您可以在 -say- Java 中使用 state monad,那也是愚蠢的,因为使用可变变量会更加自然。再次,编程试图将他们以前的方法硬塞进新的语言/范式中,忽略新特性,并产生单一的代码。