Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.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
Functional programming 控制功能方面的副作用_Functional Programming_Side Effects_Purely Functional - Fatal编程技术网

Functional programming 控制功能方面的副作用

Functional programming 控制功能方面的副作用,functional-programming,side-effects,purely-functional,Functional Programming,Side Effects,Purely Functional,我想大多数都有功能上控制副作用的功能,比如Haskell中的单子,但是Elm不需要这样的功能,因为茶。此外,我听说Nim是一种不纯的函数式编程语言,但它通过有/无副作用将func和proc分开 那么,我有一个问题。是否有任何编程语言列表按功能中的can或can不能控制副作用分类?如果没有,你能给我一些语言的名字吗?我将搜索名称并研究它是如何工作的,但如果可能的话,我很高兴您能简单地编写它。以下是我所知道的可以控制副作用的语言及其方式: 单子 哈斯克尔 纯脚本 伊德里斯 (在查找了一些类似的语

我想大多数都有功能上控制副作用的功能,比如Haskell中的单子,但是Elm不需要这样的功能,因为茶。此外,我听说Nim是一种不纯的函数式编程语言,但它通过有/无副作用将
func
proc
分开

那么,我有一个问题。是否有任何编程语言列表按功能中的can或can不能控制副作用分类?如果没有,你能给我一些语言的名字吗?我将搜索名称并研究它是如何工作的,但如果可能的话,我很高兴您能简单地编写它。以下是我所知道的可以控制副作用的语言及其方式:

  • 单子
    • 哈斯克尔
    • 纯脚本
    • 伊德里斯
    • (在查找了一些类似的语言后,我想Agda和Isabelle也包括在内)
  • 代数效应(我不太懂)
    • 科卡
    • 效率
  • 按类型
    • 干净的
  • 按语法
    • Nim-
      proc
      func

此外,如果您知道,请让我知道有关控制功能副作用的文档。

不,您的分类完全错误

Haskell不需要IO来引入副作用,并且可以绕过它轻松地实现。它还有
错误“Oops”
概念,它不受
IO a的约束,可以在纯函数中使用。例如,以下定义是完全有效的Haskell代码:

myDiv1 :: Float -> Float -> Float
myDiv1 x 0 = error "Division by zero"
myDiv1 x y = x / y
除此之外,您不需要任何monad来处理错误。考虑<代码> go <代码>,讨厌的

res1, err := somePackage.SomeOperationThatMightEndWithError()
if err == Nil {
    // do something with it
}
res2, err := somePackage.SomeAnotherDangereousOperation(res1) 
if err == Nil {
    // do something with it
}
它不是单子。但它通过在整个代码库中进行显式错误处理来接近纯度


同样的思维方式也适用于您在原始帖子中决定列出的其他类别。

StackOverflow平台不太适合要求列出列表的问题。顺便说一句,为了澄清一些困惑。大多数代数效应也是一元合成的。我建议你多研究一下这些,以及关于Haskell创作者IO的论文。这篇文章会包含这些论文的链接吗?无论如何,我会仔细阅读,谢谢!可能相关:。Elm不“避免”单子。它在任何地方都使用它们,只是没有提到它们的名字,而且它对它们的语言支持非常糟糕。Haskell程序如何在没有
IO
的情况下产生副作用?当然,你可以用
unsafePerformIO
绕过适当的技术,就像你可以用
error
编写导致程序崩溃的部分函数一样,但所有这些都不能改变Haskell控制副作用的选择是
IO
monad这一事实。@Bergi,首先,(几乎)任何返回
IO a
,即以
->IO a
箭头结尾的函数都是纯函数。实际上,
pure::a->ioa
定义就是这么说的。其次,只要运行时允许“部分函数”,任何执行点上的堆栈缠绕异常和肮脏的黑客行为,如
unsafePerformIO
IO
——monad不再是您所写的“Haskell的选择”,而是程序员的选择。或标准库的选择。但不是运行时的选择。所以你是说GHCs运行时是不纯净的?Bummer@Bergi我是在直截了当地说我的帖子和评论中写的东西:)不管你喜欢不喜欢Haskell,不管你是否采用
IO
,你仍然允许轻松绕过
IO
,并破坏那些看起来纯粹靠签名的函数。无意冒犯,这是事实。我不同意允许黑客绕过控制副作用的标准方法会使老年退休金计划分类无效。