我正在为顺式194做作业。
我被困在家庭作业5,问题6。
类型类Expr用于表示表达式,而类型类HasVars用于任何包含变量的表达式。
这个问题要求实现Expr for M.Map String Integer -> Maybe Integer的一个实例,其中M是Data.Map。
class Expr a where
add :: a -> a -> a
mul :: a -> a -> a
lit :: Integer -> a下面是Expr for 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,而从ShowVars中提取的var用于将String转换为上述函数。
我不会对问题的其他部分提出解决方案,因为它可能包含剧透。
发布于 2014-07-23 13:08:38
好吧,先把签名写出来,这样才能弄清楚应该是什么东西。为了提高它的可读性,
type MS2I = M.Map String Integer
type Integer' = Maybe Integer然后
add :: (MS2I -> Integer') -> (MS2I -> Integer') -> (MS2I -> Integer')所以你可以从
add m n = o
where m, n, o :: MS2I -> Integer'所以o是一个用地图.你可以定义:
add m n = o
where o ms2i = ...在这一点上你有一张地图。您可以将其提供给参数:
add m n = o
where o ms2i = let i1 = m ms2i
i2 = n ms2i
i1, i2 :: Integer'
in ...? 其余的应该是显而易见的,您只需要将两个Maybe Integer组合成一个新的。(最好使用Applicative.)
为了好玩和参考,这里有一个超浓缩的版本:
import Control.Arrow
instance Expr (Kleisli Maybe MS2I Integer) where
add m n = arr (uncurry(+)) . (m&&&n)https://stackoverflow.com/questions/24911097
复制相似问题