You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 16:01:07