问题标签 [curry]
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.
pattern-matching - Curry 中逆组合器/运算符的紧凑与完整/详细定义
Wolfgang Jeltsch撰写的关于基于 Haskell 的KiCS2实现Curry的相当引人入胜的 2013 年介绍性文章A Taste of Curry为组合器提供了以下定义inverse
:
(注意:对于不熟悉库里的路人来说,这会做类似inverse (+1) 3 == 2
and inverse (*3) 12 == 4
and之类的事情,以及无数其他令人难以置信的很棒的事情)inverse htmlHodeToStr == parseHtmlNode
此外,它还提供了 2 个替代但等效的(非确定性)split :: [a] -> ([a], [a])
函数定义:
和
以及其他一些颇具启发性的定义,但是超出了本文的范围。
然而,我的想法使我尝试了一种替代的、紧凑的定义,inverse
本着split
and的精神split'
:
另一方面,这会导致以下错误:
我的问题:为什么 Curryf
将潜在功能模式中的 in解释(f x)
为数据构造函数,而++
将(也是功能性)模式中的 in 解释(xs ++ ys)
为函数名称?
换句话说,xs
and ys
insplit' (xs ++ ys) = (xs,ys)
似乎与 in 完全x
类似inverse' f (f x) = x
。
或者,如果与的类比split'
不是很明显,请考虑prefix (xs ++ _) = xs
等等orig (1 + x) = x
,它们都可以编译和运行。
PS与原始帖子相比,我对名称和类型签名进行了一些调整,以使这个问题更容易理解。
parsing - 生成带有“逆”的解析器,对语法有约束
我最近完成了A Taste of Curry,然后决定通过编写一个更充实的解析器来测试这个简单的算术解析器示例:一个原始但正确且功能强大的 HTML 解析器。
我最终得到了一个node2string
可以操作的工作函数Node
(带有属性和子项),然后我inverse
将获得一个parse
函数,如文章中所示。
第一个幼稚的实现有一个错误,即它解析除了琐碎的<input/>
HTML 片段之外的任何东西都只是一个Node
表示。其他一切都不确定地产生了无效的东西,比如
等等。
经过一些最初的天真尝试从内部解决该问题后node2string
,我意识到了这一点,我相信所有经验丰富的逻辑程序员都会立即看到这一点,这parse = inverse node2string
比我更正确和更深入地了解情况:上述 2 解析结果<input type="submit"/>
确实是2 个有效且可构造的值Node
将导致 HTML 表示。
我意识到我必须限制Node
只允许传入字母 - 不是真的,但让我们保持简单 - 名称(当然也一样Attr
)。在比逻辑程序更基础的设置中(例如与纯声明式编程相比,具有更多手写和“指导性”的常规 Haskell),我会简单地将Node
构造函数隐藏在例如mkNode
哨兵函数后面,但我有这种感觉由于推理引擎或约束求解器的工作方式,在 Curry 中无法正常工作(我可能在这方面错了,实际上我希望是这样)。
所以我最终得到了以下结果。我认为 Curry 元编程(或 Template Haskell,如果 Curry 支持的话)可以用来清理手动样板,但表面处理只是摆脱这种情况的一种方法。
事实上,这非常有效(在我看来):
(Curry 没有类型类,所以我还不知道如何[NameChar]
更好地打印)
但是,我的问题是:
有没有办法使用类似的东西isAlpha
(或者更符合实际 HTML 规范的函数,当然)来实现与此等效的结果,而不必通过冗长的样板NameChar
及其“支持成员”?似乎没有办法在 ADT 中的任何地方放置“功能限制”。
在依赖类型的函数逻辑编程语言中,我只会在类型级别表达约束并让推理引擎或约束求解器处理它,但在这里我似乎不知所措。
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 在编译代码时的操作有何不同。
functional-programming - 咖喱的选择解决了什么问题?
我熟悉选择运算符 ( (?)
) 的作用,它需要两个参数并匹配它们。我们可以这样定义:
这可用于在两个值之间引入非确定性。但是,我不明白我们为什么要这样做。
可以通过使用解决的问题的示例是(?)
什么?
module - PAKCS REPL 考虑一些未定义的东西,但定义它的模块已加载
问题
我的代码包括一个名为 Tests 的模块,它定义了以下内容:
我可以broken
在 REPL 中进行评估:
但是,我无法评估broken
' 的定义的 RHS:
或者我相信,直到我尝试附加类型签名:
我可以在需要时附加类型签名,或者更一般地说,执行错误消息建议我应该执行的任何操作。但是我怎么知道将上述错误消息解释为“您必须附加类型签名”?更一般地说,鉴于(见下文)加载了 RedBlackTree,该类型错误甚至意味着什么?
我正在加载的内容
每次我启动 PAKCS 时,我都会运行:l All
. 加载一个模块,该模块在相关部分读取,
这个成语让我可以加载所有我需要的东西(还有其他东西),而不会产生很长的提示。
如果我运行:modules
它看起来应该定义 RedBlackTree:
functional-programming - 在咖喱(PAKCS)中反转“成员”没有答案
有了这个定义:
PAKCS 2.0.1(来自 Ubuntu 18.04)没有给出答案、警告或错误:
我希望看到 3 个值。我在这里做错了什么?
lodash - 咖喱 lodash 选择功能无法按预期工作
我是 Lodash curry 函数的新手,我正在努力弄清楚为什么curring一些 Lodash 函数,比如pick
,不起作用?
为什么第二个示例与第一个示例的输出不同?我将不胜感激您的帮助!
curry - 在 Curry 中,如何让逆向函数终止?
我正在使用 PAKCS Curry 编译器,版本 3.3.0。
这是 Curry 中的一个简单的列表反转功能(它也适用于 Haskell):
让我们尝试反转函数,即找到一个反转为 [1..5] 的列表 l:
库里能解方程真是太好了。然而,它进入了一个无限循环,寻找更多的解决方案。
这是 Prolog 中的等价谓词:
Prolog 谓词也无法以相反的方向终止:
在 Prolog 中,我可以通过添加 L 及其倒数具有相同长度的约束来帮助终止:
有了这个额外的约束,谓词在两个方向上都终止。
在 Curry 中,是否可以添加类似的约束,或者以其他方式帮助查询终止?
我尝试定义一个具有类似 same_length 约束的反函数:
但是它没有帮助:'rev2 [1 .. 5]' 也找到了一个解决方案,然后无法终止。