Some(_)
这样的简短抽象的良好语法糖,那么这将不是那么有用。
构造函数是否应该被柯里化(您的“部分应用”备注)是一个不同且正交的问题,在我看来。
²:根据petebu的要求,这里提供更多(实际上是很多)关于“聚焦和极性”的信息。我想指出,我并不是这个主题的专家(因此是“我猜”)。
我首先推荐阅读Neelakantan Krishnaswami在2009年发表的论文Focusing on Pattern Matching (PDF)。它为那些不精通极化逻辑和聚焦的人提供了介绍(但您至少需要熟悉序列演算)。与序列演算中一样,类型/命题被引入到“右边”,并且被消除/解构到“左边”。但是,在这里,我们通过“极性”来区分类型,积和和为正,函数为负(我的直觉是积/和是数据,而函数是计算,但是这种分离是由它们在序列演算中的行为的非常自然的考虑所驱动的),论文表明箭头类型的左消除对应于函数应用,而和/积类型的左消除对应于模式匹配。有一个case
结构,其行为类似于模式匹配(有些差异),它消除了正数,因此不能应用于函数。
A→B ≡ ¬A∨B
),但可以引入不同的箭头,在左侧是“正面的”,因此是正极化的,可以进行模式匹配。结果发现,这个箭头非常适合表示变量绑定(如果您熟悉高阶抽象语法,那么左极性规则排除了试图在其变量上计算的“异类术语”),因此具有变量绑定的术语是可以像总和或乘积一样进行模式匹配的数据结构。首先需要解释值和类型之间的区别。
"因为 Haskell 是一种纯函数式语言,所有计算都是通过求值表达式(语法术语)来产生值(我们认为是答案的抽象实体)。每个值都有一个关联的类型。" -- 《Haskell 98 温柔入门》(这个教程并不十分温柔)
Haskell 值是“一等公民”,而 Haskell 类型不是。类型用于描述值,将值与其类型关联起来称为类型化。
数据/类型构造器之间的区别在于:应用数据构造器会产生一个值,但应用类型构造器会产生一个类型。
函数只是描述值的表达式,与一个类型相关联。当你评估一个函数时,你只是在评估描述值的表达式。
Haskell 确实简化了一些 OCaml 语法。但是 Haskell 语法可以明确区分构造函数和普通函数。函数以小写字母开头,构造函数以大写字母开头。对于中缀运算符,数据构造函数必须以冒号开头,而普通运算符则永远不能以冒号开头。
构造函数的接口看起来像简单的(可能是部分的)函数应用程序,这使得一个参数的构造函数和大多数新类型非常容易使用(Just "hello")。但是 Haskell 允许您使用类似 OCaml 的记录名称和 {field=value,field=value} 样式,尽管在 Haskell 中您不必强制使用字段名称或此语法。因此,OCaml 仅针对单个字段具有简单的语法,但是 Haskell 允许您拥有多个字段的简单语法。最终,避免字段名称对于大型类型来说是不好的,因为位置函数式语法更难重构。