gpt4 book ai didi

javascript - Church 编码的总和类型是无类型语言的合适替代方案吗?

转载 作者:行者123 更新时间:2023-12-04 00:30:50 24 4
gpt4 key购买 nike

我已经为 Javascript 中的求和类型的想法苦苦挣扎了很长一段时间。该语言既不包括本地和类型也不包括模式匹配。虽然您可以使用普通的旧 Javascript Object 和原型(prototype)系统来模拟求和类型,并引入一种原始形式的模式匹配(鸭子类型和通过 switch 的分支),但这种方法很乏味并且结果看起来完全不符合习惯 - 至少在我看来是这样。

所以我想到了使用教堂编码来表达总和类型的想法 - 但是,不是以严格的方式,即允许条件运算符等语言功能。我将选项类型实现为练习:

const some = a => _ => f => f(a);
const none = x => _ => x

const head = xs => 0 in xs ? some(xs[0]) : none;

head(["foo"]) ("") (x => x.toUpperCase()); // "FOO"
head([]) ("") (x => x.toUpperCase()); // ""

首先,我不确定这是否是一个正确的实现。除此之外,还有两件事困扰着我:

  • 我不确定是否有适用于所有可能情况的默认值。 ""String 的中性元素 - 但是否存在任何类型的中性或零这样的元素?
  • 因为 head 现在返回一个二进制函数,所以它不再是可组合的

除此之外,我发现这种方法非常有前途,因为它完全依赖于高阶函数,并且不会引入奇特的新类型,这些新类型在某种程度上与语言格格不入。

Chruch 编码只是一个很好的智力挑战,还是能够解决实际问题的技术?

很抱歉,如果这个问题过于宽泛或令人困惑,或者两者兼而有之,但我觉得自己走进了死胡同。

最佳答案

首先,在 Smalltalk 中,以其“真正的一切都是对象”的方法,booleans and conditionals不是语言构造,而是由教会 bool 值表示(尽管我认为没有人这样调用它们)。 Smalltalk bool 值是一个接受两条消息(又名“有两种方法”)ifTrue:ifFalse: 的对象,然后根据 true< 中的哪一个来处理它们false 对象实际上是。

此外,还有一个名为 daggy 的 JS 库标记总和,它在内部使用类似 Church 编码的东西:它将总和类型编码为它称为 catamorphisms 的东西,这实际上只是选择正确标签的函数,尽管还有更多关于它的内容,处理 JS 特性。

关于javascript - Church 编码的总和类型是无类型语言的合适替代方案吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43900780/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com