我正在尝试使用我自己的类型别名和数据构造函数实现一个eval函数。这个函数应该返回一个更新的字典Dict和程序计数器Counter,根据输入的Func。基本上,我希望它在输入正确的情况下递增计数器。下面是我的类型别名:
type Counter = Int
type Name = String
type Dict = Map Name Const
这是我创建的一个类型,用于后面我在下面提到的类中:
data Func = GET_INT Int
| GET_DICT Name
| JUMP Counter
deriving Show
这是一个包含函数的类,我把Func作为它的示例:
class Evaluate a where
eval :: Func -> (Dict, Counter) -> Maybe (Dict, Counter)
instance Evaluate Func where
eval (GET_INT a)(d, c) = Just(d, c+1)
eval (GET_DICT a)(d, c) = Just(d, c+1)
eval (JUMP a)(d, c) = Just(d, c+1)
eval = Nothing
然而,我得到了一些错误。首先,我得到了以下内容:应为类型,但“Counter”具有种类“Const”
其次,我不确定我输入的Evaluate类的参数是否正确,因为a没有在任何地方使用。另外,我认为函数的输入不会像上面那样工作。
有人能帮我弄清楚如何让这个函数工作吗?
1条答案
按热度按时间qacovj5a1#
我喜欢的类型有:
这些都是类型别名,但没关系。
这是我的数据类:
术语“dataclass”没有任何意义。Func是一个类型。有两个数据构造函数。好的。
这是我要创建的函数的类:
这没有多大意义。什么是
eval
,为什么要用a
来参数化它?我认为最好先定义eval :: Func -> (Dict, Counter) -> Maybe (Dict, Counter)
,然后仔细考虑为什么要使它更具多态性。这是我得到的错误:'eval'的方程式有不同数目的参数。
不。您提供的代码不是错误。您应该始终提供用于产生导致您混淆的错误的实际代码。
第一个实际错误:
这是因为,除了一个小的例外,语法
[ ... ]
是一个列表,而不是一个Map。你不能在Map上进行模式匹配,而应该只匹配一个变量,比如env
。(a,b)
的元组与Maybe (a,b)
不一样。遗憾的是,你显然已经知道这一点,但粘贴了分散注意力的代码-在问这个问题之前清理代码。如果我们解决了这两个问题,那么我们得到的代码加载良好,但完全没有价值: