我一直在为 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()); // ""
首先,我不确定这是否是正确的实现。除此之外,还有两件事困扰着我:
- 我不确定是否有适用于所有可能场景的默认值。
""
是String
s 的中性元素 - 但是对于任何类型,是否存在像中性或零这样的元素? - 因为
head
现在返回一个二进制函数,它不再是可组合的
除此之外,我发现这种方法非常有前途,因为它完全依赖于高阶函数,并且不引入花哨的新类型,这些新类型在某种程度上与语言格格不入。
Chruch 编码只是一个很好的智力挑战,还是能够解决实际问题的技术?
对不起,如果这个问题太宽泛或太混乱或两者兼而有之,但我觉得自己陷入了死胡同。