2
我正在为CIS 194的作业问题工作。
我停留在Homework 5,问题6.功能类型实例
的类型类Expr
用于表示表达和用于容纳变量中的任何表达式的类型类HasVars
。
该问题要求对M.Map String Integer -> Maybe Integer
实施Expr
的实例,其中M
是Data.Map
。
class Expr a where
add :: a -> a -> a
mul :: a -> a -> a
lit :: Integer -> a
这里是为Expr
实例Integer
的代码。
instance Expr Integer where
add m n = m + n
mul m n = m * n
lit m = m
和功能的HasVars
实例,
instance HasVars (M.Map String Integer -> Maybe Integer) where
var s = M.lookup s
我很困惑,如何为函数类型创建Expr
实例。 如何去模式匹配或从函数中提取数值? 该类型为a-> a -> a
,所以我没有Map
来提取这些值,var
来自ShowVars
用于将String
转换为上述函数。
我没有提出解决问题的其他部分,因为它可能包含破坏者。
在这个阶段也许太先进,但如果你使用'Applicative'到'Maybe'结合s,您也可以将它用于功能部分。 'add = liftA2 $ liftA2(+)'。 –
谢谢,这是有道理的。然而'lit :: Integer - > a'仍然让我失望。我需要使用一个整数来创建函数。所以我需要创建一个地图或添加到一个? –
@dare_take'lit'可能会让一个表达意思是不变的,所以让它使用一个映射参数但忽略它。 –