问题标签 [pure-function]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
626 浏览

java - 您将如何编写一个从列表中删除元素的“纯”函数?

在 Java(或任何类似语言)中,您将如何编写从列表中删除元素的纯函数(或方法)。

如果元素在列表中,我们只需返回一个新的(理想情况下是不可变的)列表,其中包含输入列表的所有元素,减去我们删除的元素。

但是您将如何处理列表中未找到该元素的情况?

让我们假设该方法接收 2 个参数,list以及element要删除的参数:

如果我调用这个方法,并且element不包含在里面list

  • 抛出异常可能会使方法“不纯”(?)
  • 修改输入列表并返回布尔值(类似于List#remove())可能会使方法“不纯”(修改输入将是副作用)
  • 如果我调用此方法,将输入作为输出返回对我来说似乎不直观。
  • 返回一个Optional.of(listCopy)(编辑:发布后添加到我的问题中)
  • 还有其他想法吗?

编辑

我应该提到我只想删除第一次出现的element,所以如果输入list中有多次出现element,我不想通过一次调用我的 remove() 方法(例如使用stream().filter())来删除它们。我刚刚在我的代码示例中编辑了注释以反映这一点。但是,这与我的问题并不完全相关,因为我的主要问题围绕着如何使该方法直观地使用并保持“纯粹”。

编辑 2

我在上述建议中添加了一个额外的想法。ReturningOptional.of(listCopy)似乎是迄今为止提出的解决方案中最优雅的解决方案。它强制调用者检查请求的操作是否成功,并且(如果成功),它返回一个新列表,从而不修改原始输入列表。如果操作不成功(element未在里面找到list),则方法返回Optional.empty()。在我看来,这也将满足下面提到的引用完整性

0 投票
1 回答
225 浏览

javascript - 在 JavaScript 中将非纯函数转换为纯函数的策略是什么

我开始学习 javascript 中的函数式编程。这可能是一个愚蠢的问题,但我试图解决以函数方式编写的非纯函数。

我的问题是在函数式编程范式中应该使用什么策略来实现这一点。

0 投票
1 回答
55 浏览

java - 我们可以以线程安全的方式从方法中返回 Function 吗?

上述方法安全吗?

如果我创建 10 个线程,使用不同类型的SomeRequests并同时调用此方法,假设存在线程安全是否安全?

0 投票
1 回答
87 浏览

c++ - 防止使用被覆盖的非虚拟函数 - 正确的方法?

所以这是我的第一个问题。我已经搜索了该站点,找到了一些东西并应用了其中给出的建议,但我仍然不确定我是否以正确的方式完成了它。

我正在开发一个模板库,这是我对BST类模板的实现:

bstnodeiterator::get_container()并且bstnodeiterator::is_null()派生自iterator_base<>它是所有其他容器(例如vector<>fixed_list<>map<>等)的迭代器的基类:

  • 需要定义上述所有三个函数,因为它们在整个库中的其他任何地方都使用(例如,在算法中,在iterator_helper类中等)。

由于 BST 是已排序元素的容器,因此不应动态更改节点的内容。因为这会破坏树的排序结构。因此,我想阻止程序员使用get_pointer(). 即使它返回一个指向内容的 const 指针,它仍然可以通过成员函数进行更改T(例如,如果T是 astd::string那么内容可以通过 更改std::string::assign()),我不希望这样。

所以,我_iterator_base<*,*>::get_pointer()在基类中使函数非虚拟。而且它没有在派生类中定义,bstnodeiterator. 所以,如果程序员从派生类中调用它......

...然后编译器将给出链接错误:unresolved external symbol " ... ::get_pointer()".

这是正确的方法吗?你怎么看?

编辑:

我刚刚尝试取消引用和修改:

...它没有编译。但是,如果我将最后一行更改为:

...它编译没有错误,运行和工作!

编辑2:

我终于找到了问题的根源:typedefs。

我没有typedef在原始问题中显示 s 以使其看起来更简单,更易于阅读。在原始代码中,有一个using val_ptr = T*;在范围内bstree<>,我在typedef以下范围内使用它bstnodeiterator

如果我定义了上面给出的函数,那么我可以std::string::assign()get_pointer(). 但是,如果我将函数的返回类型更改为const val*然后我不能调用string::assign().

我终于意识到这两种类型是不同的。可能编译器将其const放在其他地方。

0 投票
0 回答
70 浏览

javascript - noop 是纯函数吗?

在 JavaScript 中,我们可以像这样表达一个简单的 noop 函数(在 Lodash 中也是如此):

这可能是一个轻浮的区别,但它算作一个纯函数吗?我最初的猜测是,这因为:

  • 引用透明,因为它总是返回undefined.
  • 不会造成任何副作用。

但是如果我们重复调用这个函数(就像下面的代码块分配undefined给一堆变量),它最终会不会因为外部状态一直在变化而导致不同的行为(比如崩溃程序)?

(或者我们应该在这种情况下把记忆等问题放在一边?)

0 投票
5 回答
883 浏览

scala - 为什么 println 被认为是不纯函数?

我正在阅读 scala 编程的书,据说:

...在这种情况下,它的副作用是打印到标准输出流。

而且我看不出副作用在哪里,因为对于相同的输入, println 将打印相同的输出(我认为) 例如任何时候我们调用
更新:

它会打印5,我没有看到调用println(5)会打印 5 以外的值的情况!

0 投票
1 回答
96 浏览

for-loop - For循环纯函数玩笑测试使用expect ...无法读取属性

我正在尝试使用 for 循环制作一个纯函数,在终端中通过一个 jest 测试/npm 测试...我收到一个错误,它无法读取 toBe 的属性...

我的功能:

我的 Test.js 文件:我希望它测试 1+2 不等于 0 使该测试通过函数

终端中的类型错误:

变化:

测试文件:(固定括号)

0 投票
2 回答
148 浏览

javascript - 使用纯函数(For Each)更改数组,Jest 失败

我正在尝试使用一个使用 For Each 的纯函数,该函数将更改输入数组以返回“x”。有人可以帮我解释为什么我会收到这个错误吗?

功能:

测试文件:

结果/错误:

变化:

测试文件:

结果:

0 投票
1 回答
173 浏览

javascript - 是否可以在 Google Apps 脚本中将每个函数都写为“纯函数”?

我对函数式编程很感兴趣,所以我决定在我的Google Sheets文件的脚本环境中尝试这种方法,你知道脚本语言是Google Apps Script,它基本上是javascript。它甚至支持一些(如果不是全部)ES6 语法。

问题是我不能直接运行任何代码,例如:

我的意思是,我不能全局运行它,我需要定义一个任何名称的函数,然后将代码放在那个函数里面,我可以运行这个函数,所以函数运行里面的代码。

所以,也许你会问,“为什么这种行为会导致编写纯函数式代码出现问题?” 好吧,因为据我所知,关于纯函数的两个最重要的因素是:

1)我们不能在函数内部使用全局变量/函数,而是必须作为参数传递(当然,然后作为参数)。

2) 就代码的可读性和组织而言,在函数内部定义函数通常不是一个好主意。

所以,我想定义更多函数(做一些事情),而不仅仅是一个“主要”函数,而且我找不到任何方法,任何单一的方法来编写代码(作为一个整体)而不违反两者中的至少一个上面的陈述。

所以,我的意思是,如果不创建至少一个非纯函数,我就不能写任何东西。

0 投票
1 回答
254 浏览

haskell - Haskell 中的记忆

上下文

可以通过记忆加速:

这种 memoization 的实现技术在许多编程语言中被广泛使用,但它不能直接应用于 Haskell,因为 Haskell 是纯粹的,我们不想仅仅为了 memoize 函数而引入杂质。幸运的是,由于 Haskell 的惰性求值特性,可以记住一个没有副作用的函数。

以下memoize函数采用类型函数Int -> a 并返回同一函数的记忆版本。诀窍是将函数转换为值,因为在 Haskell 中,函数不是被记忆的,但是被记忆的。

问题:

  1. 函数式编程中的函数和值不一样吗?
  2. 缓存如何不被视为副作用(在纯函数的上下文中)