真实世界Haskell书:不明白这个例子

时间:2011-11-28 12:56:17

标签: functional-programming haskell

在第3章中,有一个名为“MySecond.hs”的例子,我真正不理解的是这样的代码:

safeSecond :: [a] -> Maybe a

它总是在文件的第一行,并删除它不会造成任何麻烦。任何人都可以通过这意味着什么来启发我?我只是任何函数式编程语言的新手。

3 个答案:

答案 0 :(得分:8)

这是类型注释。如果你不写它,Haskell会推断它。

在这种情况下,safeSecond是某事物的名称。 ::将名称与类型分开。它需要一个类型a的列表(a是一个类型变量,此函数将在任何类型的列表上工作。) - >是函数应用程序,也许a是返回类型。

请注意,'a'表示单个类型,因此如果传入int列表,则必须获得Maybe int out。也就是说,所有类型中的'a'必须同意。

也许只是一种有两种选择的类型只是一个或没什么。

答案 1 :(得分:5)

这是该功能的类型签名。它旨在显示函数的输入和输出应该是什么/期望的。对于大多数Haskell代码,如果您没有指定它,编译器可以推断它,但强烈建议始终指定它。

除了帮助你记住函数应该实际执行的操作之外,它还是让别人了解函数功能的好方法。

除此之外,它对调试也很有用,例如当函数的类型不是您期望的那样时。如果您有该功能的类型签名,您将在该功能的定义站点上收到错误,如果您没有在该呼叫站点获得一个错误。请参阅Type SignaturesWhy use type signatures

此外,由于您正在阅读RWH,第2章将介绍这一点。

答案 2 :(得分:2)

这是一种类型注释;它就像C中的函数声明一样。

在Haskell中,类型声明通常不是绝对必要的,因为Haskell通常可以从正确的代码中推断出一个好的类型。但是,为重要值声明类型通常是个好主意,因为:

  • 如果您的代码正确,那么您往往会获得更多有用的错误消息(否则编译器会在尝试推断您的类型时感到困惑,并且生成的失败消息可能与此无关实际的错误)。如果您收到模糊/详细的错误消息,添加类型注释可能会改善它们。
  • 特别是作为初学者,声明重要类型可以让你对你正在做的事情不那么困惑 - 这会迫使你在编写程序时澄清你的想法。
  • 正如其他人所提到的,类型注释充当活动文档,使其他人对您的代码不那么困惑。像往常一样,“其他人”可能是你,几个月后。