GHCi中分步定义部分函数报错,如何正确实现?
GHCi中定义多模式函数的正确方法
你遇到的问题根源是GHCi的交互特性:每次单独输入一行函数定义,都会覆盖该函数之前的绑定,而不是追加模式。比如先定义fact 0 = 1,此时fact仅能处理0的情况;再输入fact n = n * fact (n-1),会直接替换掉之前的定义,导致fact 0进入无限递归(最终栈溢出),列表长度函数同理,后续定义覆盖了空列表的匹配,调用空列表就会触发非穷尽模式错误。
以下是几种在GHCi中正确定义多模式函数的技巧:
多行let定义:输入
let后换行,依次写下每个模式,最后输入空行完成定义:GHCi> let GHCi| fact 0 = 1 GHCi| fact n = n * fact (n-1) GHCi|这种方式会把所有模式作为一个完整的函数绑定,不会覆盖之前的模式。
单行分号分隔:把多个模式写在同一行,用分号分隔:
GHCi> let fact 0 = 1; fact n = n * fact (n-1)适合模式较少的简单函数。
使用:edit命令:输入
:edit(或:e)打开默认编辑器,在编辑器中完整编写函数的所有模式,保存后GHCi会自动加载这个定义。这种方式最适合复杂函数,和源文件定义体验一致。
内容的提问来源于stack exchange,提问作者NotAName
相关产品推荐
相关产品推荐

