【问题标题】:Real World Haskell book: don't understand the example真实世界的 Haskell 书:看不懂的例子
【发布时间】:2011-11-28 12:56:17
【问题描述】:
在第3章,有一个例子叫“MySecond.hs”,我真的不明白是这样的代码:
safeSecond :: [a] -> Maybe a
它总是在文件的第一行,删除它不会有问题。任何人都可以启发我这意味着什么?我只是任何函数式编程语言的新手。
【问题讨论】:
标签:
functional-programming
haskell
【解决方案1】:
是类型注解。如果你不写它,Haskell 会推断它。
在这种情况下,safeSecond 是某事物的名称。 :: 将名称与类型分开。它需要一个 a 类型的列表(a 是一个类型变量,此函数将适用于任何类型的列表。) -> 是函数应用程序,Maybe a 是返回类型。
注意 'a' 代表单一类型,所以如果你传入一个 int 列表,你必须得到一个 Maybe int 。也就是说,类型中的所有 'a' 必须一致。
Maybe 只是一个有两种选择 Just a 或 Nothing 的类型。
【解决方案2】:
这是函数的类型签名。它旨在显示函数的输入和输出应该/预期是什么。对于大多数 Haskell 代码,如果您不指定它,编译器可以推断它,但强烈建议始终指定它。
除了帮助您记住函数实际应该做什么之外,这也是其他人了解函数作用的好方法。
除此之外,它对于调试也很有用,例如当函数的类型不是您期望的那样时。如果你有那个函数的类型签名,你会在函数的定义站点得到一个错误,如果你没有,你会在调用站点得到一个。见Type Signatures和Why use type signatures
此外,由于您正在阅读 RWH,第 2 章将介绍这一点。
【解决方案3】:
这是一个类型注解;它就像 C 中的函数声明。
在 Haskell 中,类型声明通常不是绝对必要的,因为 Haskell 通常可以从正确的代码中推断出好的类型。但是,为重要值声明类型通常是个好主意,因为:
- 如果您的代码不正确,您往往会以这种方式收到更多有用的错误消息(否则编译器可能会在尝试推断您的类型时感到困惑,并且生成的失败消息可能与实际错误)。如果您收到晦涩/冗长的错误消息,添加类型注释可能会改善它们。
- 特别是作为初学者,声明重要类型可以让您对自己正在做的事情不那么困惑——它会迫使您在编写程序时理清思路。
- 正如其他人所提到的,类型注释充当活动文档,使 other 人对您的代码不那么困惑。像往常一样,“其他人”可能就是你,几个月后。