标签: purely-functional

纯度与参考透明度

这些术语似乎有 不同的定义,但我总是想到一个暗示另一个; 当表达式是引用透明但不纯粹时,我无法想到任何情况,反之亦然.

维基百科为这些概念维护单独的文章并说:

参考透明度:

如果表达式中涉及的所有函数都是纯函数,则表达式是引用透明的.此外,如果丢弃它们的值并且它们的副作用无关紧要,则表达式中可以包含一些不纯的函数.

来自纯粹的表达:

构造纯表达式需要纯函数.[...]纯表达通常被称为引用透明.

我发现这些陈述令人困惑.如果副作用所谓的"非纯函数"是微不足道的,足以让不执行他们(即替换其这种函数的调用没有实质性改变程序),它是一样的,如果它的是纯粹的第一名,不是吗?

有没有更简单的方法来理解纯表达式和引用透明的表达式之间的差异(如果有的话)?如果存在差异,则可以理解清楚地表明它的示例表达.

language-agnostic functional-programming side-effects referential-transparency purely-functional

58
推荐指数
2
解决办法
5664
查看次数

纯功能数据结构有什么好处?

有大量关于数据结构的文本和数据结构代码库.我知道纯粹的功能数据结构更容易推理.但是,我很难理解在实用代码中使用纯函数式数据结构(使用函数式编程语言与否)的命令对应的真实世界优势.有人可以提供一些真实世界的案例,其中纯功能数据结构具有优势,为什么?

这个例子就像我在programming_language中使用data_structure_name来做应用程序,因为它可以做某些事情.

谢谢.

PS:我的意思是纯功能数据结构与持久数据结构不同.持久性数据结构是一种不会改变的数据结构.另一方面,纯功能数据结构是纯粹运行的数据结构.

ocaml haskell functional-programming purely-functional data-structures

56
推荐指数
5
解决办法
9668
查看次数

为什么纯函数式语言不使用引用计数?

在纯函数式语言中,数据是不可变的.通过引用计数,创建引用周期需要更改已创建的数据.似乎纯函数式语言可以使用引用计数而不必担心循环的可能性.我是对的?如果是这样,他们为什么不呢?

我知道在许多情况下引用计数比GC慢,但至少它减少了暂停时间.如果暂停时间不好,可以选择使用引用计数.

garbage-collection functional-programming memory-management reference-counting purely-functional

43
推荐指数
5
解决办法
5610
查看次数

学习Haskell以学习Scala

我读了几个问题,比如Scala和Haskell讨论两种语言的优点或者要学习哪些,但我已经知道我想学习Scala.我是uni的Java程序员,现在主要使用PHP.

我想学习Scala,因为它看起来像个人项目的Java改进,我也想学习一种函数式语言来提高我作为程序员的知识.

我想知道将Haskell作为函数式编程的介绍是否是一个好主意,因为它纯粹是函数式的,所以我应该正确地学习它而不是偶然使用Scala中的一些函数而不知道为什么?

我也喜欢将Haskell用于个人项目等,因为它看起来很棒,但我并没有真正看到它的许多真实应用,似乎更多地用于学术事物,因此想要学习它以获得功能性理解然后继续斯卡拉

haskell functional-programming scala purely-functional

42
推荐指数
4
解决办法
3771
查看次数

为什么"纯粹"的功能被称为"纯粹"?

纯函数是没有副作用的函数 - 它不能做任何类型的I/O并且它不能修改任何东西的状态 - 并且它是引用透明的 - 当使用相同的输入多次调用时,它总是给出相同的产出.

为什么单词"pure"用于描述具有这些属性的函数?谁首先以这种方式使用"纯"这个词,何时?是否有其他词语意味着大致相同的事情?

functional-programming function purely-functional pure-function

39
推荐指数
3
解决办法
6730
查看次数

为什么捕获异常非纯,但抛出异常是纯粹的?

在Haskell中,您可以从纯函数代码中抛出异常,但是您只能捕获IO代码.

  • 为什么?
  • 你可以在其他情况下或仅在IO monad中捕获吗?
  • 其他纯功能语言如何处理它?

haskell functional-programming exception-handling purely-functional

37
推荐指数
2
解决办法
3526
查看次数

有一个`(a - > b) - > b`等同于'a`?

在纯函数式语言中,您可以对值执行的唯一操作是对其应用函数.

换句话说,如果你想用类型值做任何有趣的事情,a你需要一个带有类型的函数(例如),f :: a -> b然后应用它.如果有人用你(flip apply) a的类型交给你(a -> b) -> b,那是否适合替代a

什么叫做类型的东西(a -> b) -> b?看起来它似乎是一个替身a,我很想把它称为代理,或来自http://www.thesaurus.com/browse/proxy的东西.

haskell functional-programming purely-functional

37
推荐指数
3
解决办法
3651
查看次数

纯功能语言中的高效堆

作为Haskell的一个练习,我正在尝试实现heapsort.堆通常在命令式语言中实现为数组,但在纯函数式语言中这将是非常低效的.所以我看了二进制堆,但到目前为止我发现的所有内容都是从命令性的角度描述的,所提出的算法很难转化为功能设置.如何在Haskell等纯函数式语言中有效地实现堆?

编辑:通过有效我的意思是它应该仍然在O(n*log n),但它不必击败C程序.另外,我想使用纯函数式编程.在Haskell中做这件事还有什么意义呢?

haskell functional-programming binary-heap heapsort purely-functional

35
推荐指数
4
解决办法
9687
查看次数

可以纯粹执行`ST`之类的monad(没有'ST`库)吗?

这篇文章是有文化的Haskell.只需输入像"pad.lhs"这样的文件ghci就能运行它.

> {-# LANGUAGE GADTs, Rank2Types #-}
> import Control.Monad
> import Control.Monad.ST
> import Data.STRef
Run Code Online (Sandbox Code Playgroud)

好的,所以我能够想出如何ST用纯代码表示monad.首先,我们从我们的引用类型开始.它的具体价值并不重要.最重要的是PT s a不应该与任何其他类型同构forall s.(特别是,它既不应该同形()也不应该同形Void.)

> newtype PTRef s a = Ref {unref :: s a} -- This is defined liked this to make `toST'` work. It may be given a different definition.
Run Code Online (Sandbox Code Playgroud)

那种为s*->*,但现在不是真的很重要.对于我们所关心的一切,它可能是多面手的.

> data PT s a where
>     MkRef   :: a -> PT s …
Run Code Online (Sandbox Code Playgroud)

monads state haskell ghc purely-functional

32
推荐指数
3
解决办法
813
查看次数

副作用是否是纯函数中无法找到的一切?

可以说下面的二分法是否安全:

每个给定的功能是

  • 要么是纯粹的
  • 或有副作用

如果是这样,(函数的)副作用是在纯函数中找不到的任何东西.

f# haskell functional-programming scala purely-functional

28
推荐指数
4
解决办法
2500
查看次数