haskell中pure和impure有什么区别?

13 haskell functional-programming

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

Joh*_*son 23

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

例如,假设您想要编写一个带有字符串的程序并在其中添加",dude".

main = do
  line <- getLine
  putStrLn $ line ++ ", dude"
Run Code Online (Sandbox Code Playgroud)

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

main = do
  line <- getLine
  putStrLn $ addDude line

addDude input = input ++ ", dude"
Run Code Online (Sandbox Code Playgroud)

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

  • 很好的答案.在代码中冒昧地解决拼写错误的道歉.我还建议`addDude`的签名在显示纯度时会更好,如果它存在于代码中.编写显式类型签名的一个原因正是为了记录和验证哪些坏东西肯定不会发生. (2认同)

ami*_*dfv 6

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

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

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