如何在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
相关产品推荐
相关产品推荐

