3

我一直在为 Javascript 中的 sum 类型的想法苦苦挣扎。该语言既不包括本机求和类型,也不包括模式匹配。虽然您可以使用普通的旧 Javascript 和原型系统来模拟 sum 类型,Object并引入一种原始形式的模式匹配(鸭子类型和分支 via 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()); // ""

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

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

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

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

对不起,如果这个问题太宽泛或太混乱或两者兼而有之,但我觉得自己陷入了死胡同。

4

1 回答 1

0

例如,在 Smalltalk 中,凭借其“真的一切都是对象”的方法,布尔值和条件不是语言结构,而是由 Church 布尔值表示(尽管我认为没有人这样称呼它们)。Smalltalk 布尔值是一个接受两个消息的对象(又名“有两个方法”)ifTrue:ifFalse:,然后根据对象实际是哪个true或对象来处理这些消息。false

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

于 2017-05-11T09:00:53.937 回答