Haskell基于自定义类型实现eval函数的报错问题与实现咨询
问题修正
所有需要修正的点如下:
- 缺失
Const类型定义:你代码中Dict的定义依赖Const类型,但你没有给出该类型的实现,这是触发kind报错的核心原因,类型推导连锁错误导致编译器误判Counter的类型。 - 类型类定义冗余:
Evaluate类的类型参数a没有在eval函数签名中使用,属于无效定义,要么直接实现独立的eval函数,要么修正类型类签名让参数a生效。 - 兜底匹配语法错误:最后一行
eval = Nothing参数缺失,不符合Haskell语法要求,且你已经覆盖了Func的所有构造器,不需要额外兜底。 JUMP逻辑不符合语义:当前JUMP分支仍然让计数器自增,没有实现跳转逻辑,应该直接将计数器设为传入的参数值,若有跳转后自增需求可自行调整。
修正代码
简化实现(无需类型类,仅适配Func求值场景)
-- 导入Map依赖 import qualified Data.Map as Map import Data.Map (Map) -- 补全缺失的Const类型定义,可根据实际需求调整构造器 data Const = IntConst Int | StrConst String deriving (Show, Eq) -- 原有类型别名 type Counter = Int type Name = String type Dict = Map Name Const -- 原有Func数据类型 data Func = GET_INT Int | GET_DICT Name | JUMP Counter deriving (Show) -- 独立实现eval函数 eval :: Func -> (Dict, Counter) -> Maybe (Dict, Counter) eval (GET_INT _) (d, c) = Just (d, c + 1) eval (GET_DICT _) (d, c) = Just (d, c + 1) eval (JUMP target) (d, _) = Just (d, target)
保留类型类实现(适配后续扩展其他可求值类型场景)
import qualified Data.Map as Map import Data.Map (Map) data Const = IntConst Int | StrConst String deriving (Show, Eq) type Counter = Int type Name = String type Dict = Map Name Const data Func = GET_INT Int | GET_DICT Name | JUMP Counter deriving (Show) -- 修正类型类定义,让类型参数a参与签名 class Evaluate a where eval :: a -> (Dict, Counter) -> Maybe (Dict, Counter) -- 编写Func的Evaluate实例 instance Evaluate Func where eval (GET_INT _) (d, c) = Just (d, c + 1) eval (GET_DICT _) (d, c) = Just (d, c + 1) eval (JUMP target) (d, _) = Just (d, target)
内容的提问来源于stack exchange,提问作者m.18
相关产品推荐
相关产品推荐

