- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
纯函数式编程语言不允许可变数据,但某些计算以命令式方式更自然/直观地表达 - 或者算法的命令式版本可能更有效。我知道大多数函数式语言都不是纯粹的,并且允许您分配/重新分配变量并执行命令式操作,但通常不鼓励这样做。
我的问题是,为什么不允许在局部变量中操作局部状态,而是要求函数只能访问它们自己的局部变量和全局常量(或只是在外部作用域中定义的常量)?这样,所有函数都保持引用透明性(在给定相同参数的情况下,它们总是给出相同的返回值),但在函数内,计算可以用命令式术语表示(例如,while 循环)。
IO 等仍然可以以正常的功能方式完成 - 通过 monad 或传递“世界”或“宇宙” token 。
最佳答案
简短的回答是:有些系统可以满足您的需求。例如,您可以使用 ST
Haskell 中的 monad(如评论中所述)。ST
monad 方法来自 Haskell 的 Control.Monad.ST
.代码写在ST
monad 可以在方便的地方使用引用( STRef
)。好的部分是您甚至可以使用 ST
的结果。 monad 在纯代码中,因为它本质上是自包含的(这基本上是您在问题中想要的)。
这种自包含属性的证明是通过类型系统完成的。 ST
monad 带有一个状态线程参数,通常用类型变量 s
表示.当您进行这样的计算时,您将获得一元结果,其类型如下:
foo :: ST s Int
runST :: (forall s . ST s a) -> a
s
类型参数无所谓,我可以把计算结果还给你,不用
ST
行李。这基本上保持了可变
ST
避免转义变量,因为它们会携带
s
与他们,这将被类型系统捕获。
Vector
带有
impure algorithms package保持原位排序算法的大部分性能特征并仍然保持纯度。
pureSort :: Ord a => Vector a -> Vector a
pureSort vector = runST $ do
mutableVector <- thaw vector
sort mutableVector
freeze mutableVector
thaw
和
freeze
函数是线性时间复制,但这不会破坏整体 O(n lg n) 运行时间。您甚至可以使用
unsafeFreeze
避免再次线性遍历,因为不再使用可变向量。
关于functional-programming - 功能-命令式混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7074134/
As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be
我正在做一个相当简单的示例来学习如何使用 ocaml 作为命令式语言。我的猜测是我搞乱了分号,但我在代码中找不到任何错误 let sort array = for index = 0 to (Arra
我是函数式编程的新手,我刚遇到一些事情,想知道是否有解决办法。 假设我有 myArray = [ { a : 1 } { a : 4 } { a : 5 } { a : 6 } {
我正在尝试在我的 Node 应用程序的 dockerode 容器中编译并执行 java 程序。我可以通过首先使用基本 javascript 写入 tmp.java 文件,然后运行以下 shell 命令
Quicksort 通常被描述为一种原位(就地)算法,尽管它需要 O(log n) 堆栈空间。那么 in situ 是否意味着“需要少于 O(n) 的额外空间”,或者堆栈空间通常不算作空间复杂度(但为
我需要一些关于 Reactive JS 和“if 语句”的帮助 我不知道如何在 Reactive JS 中实现一个简单的代码在 Spark AR 中是这样的: if( boolvalue=true)
我是 Scala 的新手,我正在尝试从 IndexedSeq 创建一个大 map ,我在 SO 上发现了一个提及,即函数式 map 创建比命令式 Java map 创建慢得多,我决定自己测试一下。到目
我是一名优秀的程序员,十分优秀!