提问人:user4779 提问时间:6/21/2020 最后编辑:sshineuser4779 更新时间:6/22/2020 访问量:527
Graham Hutton 的“Programming in Haskell”中的 Haskell 中的简单求和函数不起作用
Simple sum function in Haskell from Graham Hutton's "Programming in Haskell" not working
问:
在“Haskell 编程”中的第一个代码示例中,说明如下:
回想一下本章前面使用的函数 sum,它产生 数字列表的总和。在 Haskell 中,总和可以使用两个来定义 方程:
sum [] = 0 sum (n:ns) = n + sum ns
立即,此代码在 ghci 解释器中和编译时都失败,并出现错误:“函数总和中的非穷尽模式”
经过进一步的研究,这似乎是因为没有涵盖单个数字的情况。让我感到困惑的是,书中接下来的几个例子也不起作用。
我在这里遗漏了什么吗?这本书是在 2016 年最近出版的,我找不到其他人对此抱怨。
答:
10赞
user156548
6/21/2020
#1
当您输入定义的第一子句并按 Enter 键时,GHCI 假定您已经完成,它应该评估该程序。程序sum
sum [] = 0
不指定在参数为非空时要执行的操作,因此会出现“非详尽模式”错误。
GHCI 具有 和 命令,允许您输入多个子句(或其他跨越多行的代码::{
:}
Prelude> :{
Prelude| sum [] = 0
Prelude| sum (n:ns) = n + sum ns
Prelude| :}
Prelude> sum []
0
Prelude>
一般来说,我建议将您正在使用的定义保存在一个文件中,然后将该文件加载到 GHCI 中。然后,当您进行一些更改并使用各种参数调用您的函数时,您可以查看会发生什么。:reload
评论
1赞
bradrn
6/21/2020
@user4779 (1/2) 我想你可能对你在文件中放的东西有点困惑。Haskell文件只包含一个函数列表(可能还有一些import语句和一个模块头)——这是我自己的代码中的一个例子。您可以使用命令将此文件加载到 GHCi 中,然后您可以从 GHCi 调用函数。:load
1赞
bradrn
6/21/2020
@user4779 (2/2) 如果调用了某个函数,则当您使用 GHC 编译代码时,生成的独立可执行文件将首先自动调用 。但是,如果您将该文件加载到 GHCi 中,那么将只是另一个函数。请注意,它的定义方式与所有其他函数相同,因此,它不应影响用于定义其他函数的语法。(当然,你可以用它来定义你的函数,但这与你想做的不同。main
main
main
main
let
main
1赞
bradrn
6/21/2020
@user4779 (1/2) 没有理由不能两者兼而有之!许多Haskell程序(实际上可能是其中的绝大多数)在 中实现了程序的整体控制流,但随后调用其他函数来获取实际逻辑。例如,我的程序在这里的功能只是概述了整个处理过程——打开一个文件,解析它,转换它,将其呈现为文本,然后保存结果......main
main
1赞
bradrn
6/21/2020
@user4779 (2/2) ...同时调用函数,例如 和 (在其他地方定义)以获取实际逻辑。这使我能够保持代码的可读性,确保函数之间的关注点很好地分离,并允许我在 GHCi 中分别测试各个部分(每个部分对应一个函数),同时仍然允许我运行整个可执行文件。parse
convert
render
1赞
bradrn
6/21/2020
@user4779(顺便说一句,当使用 GHCi 时,它只是一个像其他所有函数一样的功能——没有理由不能加载模块然后从 GHCi 调用,尽管在实践中你并不经常需要这样做。但是,正如我已经暗示的那样,通常认为使用许多小函数而不是一个大函数来构建程序是很好的做法。其中一个原因是,如果需要,您可以在 GHCi 中测试每个小函数,而您不能轻松测试大型单体函数的一部分。main
main
main
评论