Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Functional programming 现实世界的哈斯克尔书:唐';我不理解这个例子_Functional Programming_Haskell - Fatal编程技术网

Functional programming 现实世界的哈斯克尔书:唐';我不理解这个例子

Functional programming 现实世界的哈斯克尔书:唐';我不理解这个例子,functional-programming,haskell,Functional Programming,Haskell,在第3章中,有一个名为“MySecond.hs”的示例,我真正不理解的是这样的代码: safeSecond :: [a] -> Maybe a 它总是在文件的第一行,删除它不会引起麻烦。有人能告诉我这意味着什么?我对任何函数式编程语言都只是个新手。这是类型注释。如果你不写,哈斯克尔会推断出来的 在这种情况下,safeSecond是某物的名称。::将名称与类型分开。它接受类型a的列表(a是一个类型变量,此函数将在任何类型的列表上工作。)->是函数应用程序,可能a是返回类型 请注意,“a”表

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

safeSecond :: [a] -> Maybe a

它总是在文件的第一行,删除它不会引起麻烦。有人能告诉我这意味着什么?我对任何函数式编程语言都只是个新手。

这是类型注释。如果你不写,哈斯克尔会推断出来的

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

请注意,“a”表示单个类型,因此如果传入int列表,则必须输出一个可能的int。也就是说,类型中的所有“a”必须一致


可能只是一个有两个选择的类型,一个或没有选择。

它是函数的类型签名。它旨在显示函数的输入和输出是什么。对于大多数Haskell代码,如果不指定它,编译器可以推断它,但强烈建议始终指定它

除了帮助您记住函数实际应该做什么之外,这也是让其他人了解函数功能的一个好方法

除此之外,它对调试也很有用,例如当函数的类型不是您期望的类型时。如果你有一个函数的类型签名,你会在函数的定义站点上得到一个错误,而如果你没有,你会在调用站点上得到一个错误。看到和


由于您正在阅读RWH,第2章将对此进行介绍。

这是一个类型注释;它的作用类似于C中的函数声明

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

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

以下是RWH中的解释:你读过第1章和第2章吗?