Haskell足以阅读它(第1部分)

最近,我和来自Wix的同事一起开始阅读有关类型化无标签最终解释器的文章。 与任何有关编程范例的好材料一样,它充满了复杂的代码示例和复杂的单词构造。 因此,我决定通过至少解释代码中使用的某些Haskell构造来减轻一些复杂性。

代数数据类型

定义用于描述代数的语法。

 数据布尔=真| 假 

在上面的示例中, Bool表示数据类型, TrueFalse表示可以对其求值的值。 因此,如果您在代码中使用Bool类型,则该类型将为TrueFalse

 数据可能是=只是| 没有 

在某些情况下,我们希望数据类型也支持类型参数。 为此,我们为该类型提供了一个占位符。 在上面针对Maybe的示例中,我们提供了一个类型参数a ,该参数用于描述Just的类型。 因此, Maybe Int将是Just IntNothing

 数据ab =左a | 右b 

这也不仅限于单个参数。 您可以轻松地提供它们的多个,并在表示值的构造函数上使用它们。 所以Either Int String可以是Left IntRight String

功能签名

当我开始使用Haskell时,最难读的一件事是函数签名。 最初,它们似乎是不透明和神秘的,甚至可能阻止读者尝试理解它们。

 添加::整数->整数->整数 
加ab = a + b

因此,上面的函数描述了一个简单的加法。 将类型描述为一连串的箭头和类型可能会造成混淆。 这是因为Haskell处于咖喱状 (每个函数只有一个参数,如果有更多传递的参数返回一个函数,则您可以传递其余的参数)。 如果您知道->是正确的关联,则更容易阅读。 这只是意味着上面的类型签名与add :: Integer -> (Integer -> Integer) `相同。

  addFn ::(整数->整数)->整数 
addFn fn = fn 2

通过在类型参数周围添加方括号,我们说的是我们将传递一个接受Integer并返回Integer的函数。 这样我们可以描述传递函数。

  foo ::(显示a)=> a-> a->字符串 
foo xy =显示x ++显示y

看到类型约束被添加到函数中以使其更加通用是很常见的 对我来说,这里的复杂之处在于类型和函数参数存在于不同的空间中。 因此(Show a)约束仅适用于类型级别。 您可能想知道show方法是从哪里来的? 答案很简单,这是类型约束Show将任何传递的类型转换为String ,因此在上面的函数类型中,我们声明,以xy传递给此函数的任何参数都需要具有show方法,并且由于我们对两个参数使用了相同的类型,因此这些类型必须匹配。 如果您想使用其他类型,则可以像上面这样表达函数:

  foo ::(显示a,显示b)a-> b->字符串 
foo xy =显示x ++显示y

您可能想知道,我如何知道显示约束允许的方法? 我将在下一篇文章中介绍!

摘要

可能会觉得您刚刚学到的东西并不多,但这是使用Haskell阅读任何优秀的计算机科学论文的基石。 如果您喜欢这篇文章,请在Medium上关注我,并从我的Twitter个人资料中获取最新更新。