首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在haskell中纯净和不纯净的区别是什么?

在haskell中纯净和不纯净的区别是什么?
EN

Stack Overflow用户
提问于 2013-03-03 15:10:16
回答 3查看 3K关注 0票数 13

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-03 16:50:20

本质上,您希望在“不纯部分”中保留尽可能少的代码。在IO monad中编写的代码总是充满了不安全性。签名为IO Int的函数将在IO monad中返回一个整数,但它可以在此基础上将核导弹发送到月球。如果不研究代码的每一行,我们就无法知道。

例如,假设您想要编写一个程序,该程序接受一个字符串并在其后面附加",伙计“。

代码语言:javascript
复制
main = do
  line <- getLine
  putStrLn $ line ++ ", dude"

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

代码语言:javascript
复制
main = do
  line <- getLine
  putStrLn $ addDude line

addDude input = input ++ ", dude"

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

票数 24
EN

Stack Overflow用户

发布于 2013-03-03 15:53:03

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

将纯函数与非纯函数分开意味着您可以更多地了解您的代码要做什么。例如,当您说1 + 2时,您可以通过它的类型(Int -> Int -> Int)确定它所做的唯一事情就是获取两个数字并产生第三个数字。如果它的类型是Int -> Int -> IO Int,它可能会在每次将这两个数字相加时移动一个机器人手臂。

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

票数 6
EN

Stack Overflow用户

发布于 2013-03-04 04:38:37

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15183324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档