教会编码和类型是否是无类型语言的正确选择?

时间:2017-05-10 19:03:15

标签: javascript functional-programming higher-order-functions discriminated-union church-encoding

我在Javascript中总结类型的想法已经挣扎了很长时间。该语言既不包括本地和类型也不包括模式匹配。虽然您可以使用普通的旧Javascript Object和原型系统来模仿总和类型,并引入模式匹配的原始形式(鸭子打字和通过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 s的中性元素 - 但对于任何类型,是否存在中性或零等元素?
  • 因为head现在返回二进制函数,所以它不再可组合

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

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

对不起,如果这个问题过于宽泛或混淆,或两者兼而有之,但我觉得自己处于死胡同。

1 个答案:

答案 0 :(得分:0)

首先,在Smalltalk中,它的“真的一切都是一个对象”approch,booleans and conditionals不是语言结构,而是由教会布尔代表(尽管没有人这样称呼它们,我想)。 Smalltalk布尔值是接受两条消息(又名“有两种方法”)ifTrue:ifFalse:的对象,然后根据对象truefalse中的哪一个进行处理实际上是。

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