我在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编码是一个很好的智力挑战还是能够解决实际问题的技术?
对不起,如果这个问题过于宽泛或混淆,或两者兼而有之,但我觉得自己处于死胡同。
答案 0 :(得分:0)
首先,在Smalltalk中,它的“真的一切都是一个对象”approch,booleans and conditionals不是语言结构,而是由教会布尔代表(尽管没有人这样称呼它们,我想)。 Smalltalk布尔值是接受两条消息(又名“有两种方法”)ifTrue:
和ifFalse:
的对象,然后根据对象true
或false
中的哪一个进行处理实际上是。
此外,有一个名为daggy的JS库用于标记和,它在内部使用像Church编码的东西:它将和类型编码为它调用的catamorphisms,它实际上只是选择正确标记的函数,虽然还有更多内容,处理JS特性。