现实世界的 Haskell 书籍:不理解这个示例

3
在第三章中,有一个叫做"MySecond.hs"的例子,我真正不理解的是像这样的代码:
safeSecond :: [a] -> Maybe a

这句话中的“it”通常指文件的第一行,在删除它时不会产生任何问题。能否有人向我解释一下这是什么意思?因为我是一个对于任何函数编程语言都很新手的人。


2
这是在RWH中的解释:http://book.realworldhaskell.org/read/getting-started.html#starting.types - Sjoerd Visscher
你读过第一章和第二章了吗? - Ben
3个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
8
这是类型注释。如果您不编写它,Haskell会自动推断。 在这种情况下,safeSecond是某个东西的名称。::将名称与类型分开。它接受一个a类型的列表(a是类型变量,此函数将处理任何类型的列表。) -> 是函数应用程序,Maybe a是返回类型。 请注意,'a'表示单个类型,因此如果传入int列表,则必须获得Maybe int。也就是说,类型中的所有'a'必须一致。 Maybe只是具有两个选项Just a或Nothing的类型。

5
这是函数的类型签名,旨在显示函数的输入和输出应该/预期是什么。对于大多数Haskell代码,如果您不指定它,编译器可以推断出它,但强烈建议始终指定它。 除了帮助您记住函数实际应该做什么之外,这也是其他人了解函数作用的好方法。 此外,它还有助于调试,例如当函数的类型不是您预期的类型时。如果您为该函数提供类型签名,您将在函数定义位置收到错误提示,而如果您没有,则会在函数调用位置收到错误提示。请参见类型签名为什么使用类型签名 另外,由于您正在阅读RWH,第2章涵盖了这一点。

2

这是一种类型注释;它类似于C语言中的函数声明。

在Haskell中,类型声明通常不是必须的,因为Haskell通常可以从正确的代码中推断出一个好的类型。然而,对于重要的值,通常最好声明类型,因为:

  • 如果您的代码不正确,那么通过这种方式您会得到更有用的错误消息(否则编译器可能会在尝试推断类型时感到困惑,并且导致的失败消息可能与实际错误没有明显的关系)。如果您收到晦涩/冗长的错误消息,则添加类型注释可能会改善它们。
  • 特别是对于初学者,声明重要的类型可以让您更清楚地了解自己在做什么——它迫使您在编写程序时澄清思路。
  • 正如其他人所提到的,类型注释充当主动文档,使其他人更容易理解您的代码。通常情况下,“其他人”可能是在几个月后的您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,