Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“怎么说?”;基于monad的IO";Haskell的设计与基于标记纯/不纯代码的设计形成对比?_Haskell - Fatal编程技术网

“怎么说?”;基于monad的IO";Haskell的设计与基于标记纯/不纯代码的设计形成对比?

“怎么说?”;基于monad的IO";Haskell的设计与基于标记纯/不纯代码的设计形成对比?,haskell,Haskell,已知IO单子在Haskell中将纯代码与非纯代码分开,因此签名如f::…->IO?表示具有副作用的操作,否则它是纯函数 此外,在Haskell中,单子被用作一种纯函数机制来对操作进行排序,否则可能会被设计为只处理纯函数的编译器意外地重新排序 围绕monad设计的问题在于,很多人(可能包括我自己)似乎很难理解monad,因此我想知道它们是否是软件开发中区分纯代码和非纯代码的最佳方法 我想,如果我们有一种语言,其中所有的原语都被标记为pure和purpure,那么编译器可以直接或间接地使用原语来推断

已知IO单子在Haskell中将纯代码与非纯代码分开,因此签名如
f::…->IO?
表示具有副作用的操作,否则它是纯函数

此外,在Haskell中,单子被用作一种纯函数机制来对操作进行排序,否则可能会被设计为只处理纯函数的编译器意外地重新排序

围绕monad设计的问题在于,很多人(可能包括我自己)似乎很难理解monad,因此我想知道它们是否是软件开发中区分纯代码和非纯代码的最佳方法

我想,如果我们有一种语言,其中所有的原语都被标记为pure和purpure,那么编译器可以直接或间接地使用原语来推断任何函数的纯度,这将是一种更简单的设计。这样的编译器就会知道代码的哪些部分可以重新排序,因为它们是纯的,或者由于存在副作用而需要某种顺序

所以,我的问题是:


“基于monad的IO”设计与我前面描述的基于在语言中标记纯/不纯原语的设计相比,有哪些优点/缺点?

Haskell对IO类型做了类似的事情。然而,Haskell型系统更为通用。你可以把单子看作是副作用潜在范围的声明,因此你可以拥有一个更复杂的系统,而不是一个二进制纯/不纯标志


当然,哈斯克尔单子是关于“杂质”的神话。IO当然有点特殊,但所有其他Monad都是用Haskell编写的,并带有“bind”的完美纯实现。(也许ST和STM需要从运行时系统中获得一些魔力来提高效率,但它们可以用Haskell编写)。

Haskell对IO类型执行类似操作。然而,Haskell型系统更为通用。你可以把单子看作是副作用潜在范围的声明,因此你可以拥有一个更复杂的系统,而不是一个二进制纯/不纯标志


当然,哈斯克尔单子是关于“杂质”的神话。IO当然有点特殊,但所有其他Monad都是用Haskell编写的,并带有“bind”的完美纯实现。(好吧,也许ST和STM需要运行时系统的一些魔力来提高效率,但它们可以用Haskell编写)。

单子的力量远远超出了知道什么是和什么不是纯粹的。继续尝试,你会明白的。一个明显的优点是使用单子可以让你在许多不同的单子上使用相同的函数。只要看看
Control.Monad
中的所有函数,以及其他地方,就有几十个组合器与
Monad m=>…
一起工作,不管它是哪个Monad。这让你可以在很多情况下重用功能强大的工具。你的问题似乎是假设将纯粹的东西与不纯净的东西区分开来的唯一一点是使编译器能够进行更多的操作。然而,跟踪副作用不仅对编译器有用,而且对编写和阅读代码的人也有用。跟踪类型的副作用为我们提供了关于它们的存在或不存在的可靠且易于访问的信息,这些信息在构建程序时非常有用。我总是发现查看monad的组成(基于类型签名和定律)更有用。“它有点像容器”和“它用于排序操作”等可爱的类比在某些特定实例中效果很好,但通常对理解实际发生的情况没有帮助。@Cubic我认为单子是处理
a>…>>中函数序列的一种方法z
转换为我们需要的任何内容,并最终
返回…
此类处理的结果。我不明白的是,这种东西怎么会像人们说的那样强大。单子的力量远远超出了知道什么是纯洁的,什么不是纯洁的。继续尝试,你会明白的。一个明显的优点是使用单子可以让你在许多不同的单子上使用相同的函数。只要看看
Control.Monad
中的所有函数,以及其他地方,就有几十个组合器与
Monad m=>…
一起工作,不管它是哪个Monad。这让你可以在很多情况下重用功能强大的工具。你的问题似乎是假设将纯粹的东西与不纯净的东西区分开来的唯一一点是使编译器能够进行更多的操作。然而,跟踪副作用不仅对编译器有用,而且对编写和阅读代码的人也有用。跟踪类型的副作用为我们提供了关于它们的存在或不存在的可靠且易于访问的信息,这些信息在构建程序时非常有用。我总是发现查看monad的组成(基于类型签名和定律)更有用。“它有点像容器”和“它用于排序操作”等可爱的类比在某些特定实例中效果很好,但通常对理解实际发生的情况没有帮助。@Cubic我认为单子是处理
a>…>>中函数序列的一种方法z
转换为我们需要的任何内容,并最终
返回…
此类处理的结果。我不明白的是,这种东西怎么会像人们说的那样强大。“哈斯克尔·蒙纳德关于不洁的神话”是一句非常重要的话
Monad
是一个非常通用和抽象的界面(这使得它一开始有点难以掌握),但最终还是非常简单的界面。IO恰好是它的众多用例之一。“Haskell单子是关于杂质的神话”是一句非常重要的评论
Monad
是一个非常笼统和抽象的概念(这使得它有点难以理解)