【发布时间】:2019-10-15 16:57:13
【问题描述】:
我正在阅读 Graham Hutton 关于 Haskell 的书,并且不知道如何在练习的一部分中进行。练习如下:
给定以下类型表达式
data Expr a = Var a | Val Int | Add (Expr a) (Expr a) deriving Show
包含某种类型 a 的变量,展示如何使这种类型成为 Functor、Applicative 和 Monad 类的实例。借助一个例子,解释一下>>=这个类型的操作符是做什么的。
我在定义 Applicative 的 <*> 运算符时遇到了问题。 <*> 的类型为:
(<*>) :: Expr (a -> b) -> Expr a -> Expr b
我不明白(Val n) <*> mx 是如何工作的,因为理论上我需要提供一个Expr b,但我只有一个Expr a 并且没有可转换的函数(a -> b)。
我也不明白在(Add l r) <*> mx 的情况下该怎么办。
这是我的实现。
instance Functor Expr where
--fmap :: (a -> b) -> Expr a -> Expr b
fmap g (Var x) = Var (g x)
fmap g (Val n) = Val n
fmap g (Add l r) = Add (fmap g l) (fmap g r)
instance Applicative Expr where
--pure :: a -> Expr a
pure = Var
-- <*> :: Expr (a -> b) -> Expr a -> Expr b
(Var g) <*> mx = fmap g mx
--(Val n) <*> mx = ???
--(Add l r) <*> mx = ???
instance Monad Expr where
-- (>>=) :: Expr a -> (a -> Expr b) -> Expr b
(Var x) >>= g = g x
(Val n) >>= g = Val n
(Add l r) >>= g = Add (l >>= g) (r >>= g)
expr = Add (Add (Var 'a') (Val 4)) (Var 'b')
最后,我对 monad 中的 >>= 有疑问。这个操作符的想法是做一些诸如替换变量之类的事情?喜欢:
expr >>= (\x -> if x == 'a' then Val 6 else Var x) >>= (\x -> if x == 'b' then Val 7 else Var x)
【问题讨论】:
-
(Val n) <*> mx中,n的类型是什么? (注意<*>的类型) -
数据 Expr a = Var a |瓦尔诠释 | ...这是一个 Int
-
啊抱歉我看错了我以为是
Var...
标签: haskell monads applicative