You need to enable JavaScript to run this app. 如何在ghci中调用接收特定自定义数据结构的Haskell函数
优惠活动
大模型
产品
解决方案
定价
更多

如何在ghci中调用接收特定自定义数据结构的Haskell函数

问题原因与解决方法

1. 原代码的语法错误修正

你提供的代码本身存在缩进、分支不完整的语法问题,修正后可正常运行的完整代码如下:

data Expr
  = Num Double
  | Add Expr Expr
  | Sub Expr Expr
  deriving (Show)

eval :: Expr -> Maybe Double
-- 补全Num分支的判断逻辑,这里按小于0返回Nothing的逻辑补全
eval (Num a) = if a < 0 then Nothing else Just a
eval (Add a b) = case eval a of
  Nothing -> Nothing
  Just a1 -> case eval b of
    Nothing -> Nothing
    Just b1 -> Just (a1 + b1)
-- 可选:补全Sub分支的实现
eval (Sub a b) = case eval a of
  Nothing -> Nothing
  Just a1 -> case eval b of
    Nothing -> Nothing
    Just b1 -> Just (a1 - b1)

2. 调用报错原因

你收到的报错是因为以下几个调用语法错误:

  • 你定义的Expr是类型名,不是数据构造器,不存在名为Expr的构造器,构造数值类型的表达式必须使用Num构造器
  • Haskell的函数、构造器调用不需要用括号包裹参数,也不需要用逗号分隔参数,多参数直接按空格分隔即可
  • eval只接收1个Expr类型的参数,你需要先构造完整的Expr表达式再传入eval

3. 正确调用示例

如果要计算1+2,正确的调用语句为:
eval (Add (Num 1) (Num 2))
在ghci中执行后将输出Just 3.0。

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 13:12:02