haskell中pure和impure有什么区别?

时间:2013-03-03 07:10:16

标签: haskell functional-programming

haskell中pure和impure有什么区别? 在haskell中执行IO时,将纯净和不纯的项目分开是什么意思?

3 个答案:

答案 0 :(得分:21)

基本上你想在“不纯的部分”保留尽可能少的代码。编写在IO monad中的代码永远受到不安全因素的影响。具有签名IO Int的函数将在IO monad中返回一个整数,但它可以将核导弹发送到月球。如果不研究代码的每一行,我们都无法知道。

例如,假设你想要编写一个带字符串的程序并在其上附加“,dude”。

main = do
  line <- getLine
  putStrLn $ line ++ ", dude"

代码的某些部分必须位于IO monad中,因为它们有副作用。这包括getLine和putStrLn。但是,将两个字符串放在一起不会。

main = do
  line <- getLine
  putStrLn $ addDude line

addDude input = input ++ ", dude"

addDude的签名表明它是纯粹的:String -> String。这里没有IO。这意味着我们可以假设addDude至少会以这种方式运行。它将需要一个字符串并返回一个字符串。它不可能有副作用。它不可能炸毁月球。

答案 1 :(得分:6)

纯度只是意味着没有副作用(从磁盘读取,移动机器人手臂等)。

将纯函数与不纯函数分开意味着您可以更多地了解代码将要执行的操作。例如,当你说1 + 2时,你肯定知道它的类型(Int -> Int -> Int),它唯一能做的就是取两个数字并产生第三个数字。如果它的类型是Int -> Int -> IO Int,它可能会在每次添加两个数字时移动机器人手臂。

可以在这里找到Haskell基础知识的良好起点: http://learnyouahaskell.com/introduction#so-whats-haskell

答案 2 :(得分:3)

Haskell的一切都是纯粹的。您正在阅读的内容可能是关于IO mondad与外部的代码。一旦你把东西放入IO monad,它就永远不会“逃脱” - 你必须留在IO monad中。因此,IO monad倾向于“入侵”你的代码 - 如果你有一个返回IO的东西,那么调用它的任何代码也必须返回IO,依此类推。因此,最好只在需要的地方使用IO monad,作为程序的最高级别,并将计算的任何部分分离为纯函数。