在第3章中,有一个名为“MySecond.hs”的例子,我真正不理解的是这样的代码:
safeSecond :: [a] -> Maybe a
它总是在文件的第一行,并删除它不会造成任何麻烦。任何人都可以通过这意味着什么来启发我?我只是任何函数式编程语言的新手。
答案 0 :(得分:8)
这是类型注释。如果你不写它,Haskell会推断它。
在这种情况下,safeSecond是某事物的名称。 ::将名称与类型分开。它需要一个类型a的列表(a是一个类型变量,此函数将在任何类型的列表上工作。) - >是函数应用程序,也许a是返回类型。
请注意,'a'表示单个类型,因此如果传入int列表,则必须获得Maybe int out。也就是说,所有类型中的'a'必须同意。
也许只是一种有两种选择的类型只是一个或没什么。
答案 1 :(得分:5)
这是该功能的类型签名。它旨在显示函数的输入和输出应该是什么/期望的。对于大多数Haskell代码,如果您没有指定它,编译器可以推断它,但强烈建议始终指定它。
除了帮助你记住函数应该实际执行的操作之外,它还是让别人了解函数功能的好方法。
除此之外,它对调试也很有用,例如当函数的类型不是您期望的那样时。如果您有该功能的类型签名,您将在该功能的定义站点上收到错误,如果您没有在该呼叫站点获得一个错误。请参阅Type Signatures和Why use type signatures
此外,由于您正在阅读RWH,第2章将介绍这一点。
答案 2 :(得分:2)
这是一种类型注释;它就像C中的函数声明一样。
在Haskell中,类型声明通常不是绝对必要的,因为Haskell通常可以从正确的代码中推断出一个好的类型。但是,为重要值声明类型通常是个好主意,因为: