我正在阅读Graham Hutton 的《Programming in Haskell》一书。我有一个关于练习 12.7 的问题。任务是展示如何将类型
data Expr a = Var a | Val Int | Add (Expr a) (Expr a)
变成 Functor 和 Applicative 类的实例。
将其变成 Functor 的实例很简单:
instance Functor Expr where
--fmap :: (a -> b) -> Expr a -> Expr b
fmap f (Var x) = Var $ f x
fmap f (Val i) = Val i
fmap f (Add e e') = Add (fmap f e) (fmap f e')
但是,我不确定如何实现该<*>
运算符,特别是当它的一个或两个输入都有构造函数 Val 时,我不清楚如何定义它:
instance Applicative Expr where
--pure :: a -> Expr a
pure x = Var x
--(<*>) :: Expr (a -> b) -> Expr a -> Expr b
(Var f) <*> (Var x) = Var (f x)
(Var f) <*> (Add e1 e2) = Add (fmap f e1) (fmap f e2)
(Add fe1 fe2) <*> e = Add (fe1 <*> e) (fe2 <*> e)
_ <*> _ = ???
我的问题是:我怎样才能完成我的实施<*>
以使应用定律成立?