问题标签 [declarative-programming]

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 投票
0 回答
53 浏览

variables - 读取变量的价格

假设我们在内存中分配了变量 (x) 并分配了一个常量值 (v)。是否存在读取变量内容的操作改变其值的情况?

谢谢。

0 投票
1 回答
270 浏览

haskell - 声明式编程中的实习字符串

以下场景显示了一个在我看来不可能以声明方式实现的抽象。

假设我想创建一个 Symbol 对象,它允许您使用可以比较的字符串创建对象,例如JavaScript 中的 Symbol.for()。JS 中的一个简单实现可能如下所示:

我可以很容易地用像 Haskell 这样的声明性语言来写这个:

但是,也许将来我想通过使用全局注册表而不更改MySymbol 对象的接口来提高效率。(我班级的用户不需要知道我已将其更改为使用注册表)

例如,这很容易在 Javascript 中完成:

然而,在 Haskell 中创建一个可变的全局注册表是不可能的。(我可以创建一个注册表,但不能不更改我的函数的接口。)


具体来说,这三种可能的 Haskell 解决方案都有问题:

  1. 强制用户传递注册表参数或等效参数,使接口实现依赖
  2. 使用一些花哨的 Monad 东西,比如 Haskell 的Control.Monad.Random,这需要从一开始就预见到优化或更改接口(基本上只是将状态的概念添加到您的程序中,因此破坏了引用透明度等)
  3. 实现缓慢,在给定的应用程序中可能不实用

这些解决方案都不允许我从我的 Haskell 接口中充分抽象出实现。

所以,我的问题是:有没有办法在 Haskell(或任何声明性语言)中实现对 Symbol 对象的这种优化,而不会导致上面列出的三个问题之一,还有其他情况下命令式语言可以表达抽象吗? (例如上面的优化)声明性语言不能?

0 投票
2 回答
2398 浏览

functional-programming - 函数式编程是一种声明式编程吗?

我知道声明式编程只是传递输入并期望输出而不说明过程是如何完成的。在函数式编程中,是一种编程范式,它接受输入并返回输出。当我检查高阶函数式编程时,我们将一个函数传递给 map/reduce,它没有揭示过程是如何完成的。那么高阶函数式编程和声明式编程是一回事吗?

0 投票
2 回答
118 浏览

imperative-programming - unix 的 'cp' 命令是声明式的还是命令式的?

我正在与一位同事讨论,他坚持认为 cp 是声明性的。对我来说,这似乎非常必要。这是我们要求计算机执行的指令,而不是定义或声明。为了它是声明性的,而不是:

你可能有:

有人对此有任何意见吗?

0 投票
1 回答
100 浏览

compilation - 为什么 Münster 编译器认为跨 ++ 的模式匹配是不确定的?

我最近安装了 Münster Curry 编译器来替换我使用的速度慢得多的 PAKCS。我想测试的第一件事是我是否可以使用 PAKCS 的一些模式匹配功能,因为我知道一些实现(想到的就是 Sloth)不支持 PAKCS 允许的所有模式匹配。所以我写了以下程序:

这适用于 PAKCS 并按Hello, World预期打印,但使用 MCC 编译时出现错误:

我的理解是,这意味着 MCC 无法进行模式匹配++,但我不明白为什么 MCC 会选择此错误。 cannot duplicate the world通常意味着 IO 依赖于非确定性行为。这让我怀疑 MCC 认为我的函数f是不确定的。然而,据我所知,这f是完全确定的。

MCC 做了什么导致它认为我的函数是不确定的?

我不需要知道如何修复程序,这真的很容易,以下工作:

我有兴趣了解编译器在此处执行的操作导致其出错,以及这与 PAKCS 在编译代码时的操作有何不同。

0 投票
3 回答
84 浏览

reactjs - 使用 React 处理条件类的最佳方法是什么

我在组件上有许多元素,在某些条件下需要“活动”和“禁用”类。

例如-:1-我需要在点击时切换活动类:-

2-我还需要切换活动类:-

3-我需要在font-small(字体太小)和font-large(字体太大)上添加禁用类:-

我是否需要维护许多状态只是为了添加/删除课程?

0 投票
1 回答
581 浏览

reactjs - 我如何告诉 React 中的子元素去寻找它的视频元素?

我有一个简单的 React 应用程序,带有视频播放器和显示视频数据的图表。两者都在自己的顶层组件中:

Inside是我想要控制VideoDisplay.js的一个元素,特别是通过寻找它的播放位置,我可以使用. 我想从元素中控制它:如果我点击图表,我希望视频搜索到点击的时间。但要做到这一点,似乎我必须在它收到来自的点击时调用一个函数。但这是必要的而不是声明性的,而且确实我在 React 中实现它时遇到了麻烦。甚至可能吗?我怎么能告诉一个元素中的视频寻找,由来自同级元素的点击触发?<video>videoElement.currentTime=seekToTimeMetricsDisplayVideoDisplay.jsApp.jsMetricsDisplay.js

我有一个解决方法,我将发布作为答案,但我非常相信从设计角度来看它是非常次优的,并且会导致代码维护问题。那么有什么更好的方法呢?做这样的事情的“反应”方式是什么?

见所附截图:当点击右边的图表时,视频应该搜索到点击的时间点。

视频和指标截图

0 投票
1 回答
270 浏览

enums - Alloy 中的赋值和 Enum 的使用

如何在合金中分配变量?

现在,当我在 a.variable_2 中分配比 b.variable_2 更大的值时,我想检查变量的反例。但我不确定如何在合金中分配变量。我想出的唯一一件事是跟随,但它不起作用-

但是,我相信它只会检查与 4 的相等性并返回为假。它与任务无关。所以我的问题是我应该如何产生反例a.variable_2>b.variable_2

以及如何在合金中使用 Int 枚举?喜欢-分配一个.variable Enum MetricValue {1,2,3,4,5}1。

编辑 我仍然无法找到反例,即使当我切换 ca 和 cb 的 variable_2 的值时,我可以通过手动检查找到一个。

0 投票
0 回答
110 浏览

programming-languages - 约束编程和逻辑编程有什么区别?

我知道约束编程和逻辑编程是声明式编程的子范式。但是我找不到它们之间的区别。它们之间有什么区别?你能提供一些例子吗?

0 投票
2 回答
2968 浏览

reference - Prolog比较变量的方法

我试图在 Prolog 中实现一些图形算法。我想出了一个想法,使用统一从图结构中构建一棵树:

该图将定义如下:

  • 对的列表,Vertex-Variable其中Vertex是表示顶点的常量,Variable是对应的变量,将用作对顶点的“引用”。例如:

    [a-A, b-B, c-C, d-D]

  • 对的列表VertexVar-NeighboursList,其中VertexVar和 中的单个邻居NeighboursList是“参考变量”。例如:

    [A-[B, C, D], B-[A, C], C-[A, B], D-[A]]意思是b, c,da等的邻居。

然后在一些可以使用从原始图构建的某种树的图算法(如搜索组件,或简单的 DFS/BFS 等)之前,可以使用一些谓词,将这些对unify_neighbours统一为. 之后,顶点变量可以被解释为它的邻居列表,其中每个邻居又是它的邻居列表。VertexVar-NeighbourListVertexVar = NeighboursList

因此,这将在遍历图时产生良好的性能,因为不需要为图中的每个顶点线性搜索某些顶点及其邻居。

但我的问题是:如何比较那些顶点变量?(检查它们是否相同。)我尝试使用A == B,但存在一些冲突。对于上面的示例,(使用unify_neighbours谓词)Prolog 在内部将图形解释为:

在哪里:

问题在于S_1and S_2(又名band cX = [something, Y], Y = [something, X], X == Y原样true。同样的问题也会出现在共享相同邻居的顶点上。例如U-[A, B]V-[A, B]

所以我的问题是:有没有其他方法可以比较变量,可以帮助我解决这个问题?比较“变量本身”而不是内容的东西,比如比较过程编程语言中的地址?或者这是否过于程序化并破坏了 Prolog 的声明性思想?

例子

这个例子并没有真正起作用,但它的想法。(另外,检查是否找到顶点是线性完成的,所以性能仍然不好,但这只是为了演示。)现在为变量找到对应顶点的谓词实现为:

\==运营商并不是我真正想要的,它会产生这些冲突。