Const Monoid 的应用实现
Applicative implementation of Const Monoid
instance Monoid m => Applicative (Const m) where
pure _ = Const mempty
Const f <*> Const v = Const (f `mappend` v)
我不明白 <*>
type-check.
的定义如何
左侧 f
受限于 <*>
的签名,如 Applicative
的定义
class Functor f => Applicative f where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
改名后现在的情况:
(<*>) :: c (m -> b) -> c m -> c b
=> f :: m -> *
.
左边f
是mappend
的[第一个]参数。
来自Monoid的定义
class Monoid a where
mempty :: a
-- ^ Identity of 'mappend'
mappend :: a -> a -> a
改名后现在的情况:
mappend :: m -> m -> m
=> f :: m
.
After changing the names to the current situation:
(<*>) :: c (m -> b) -> c m -> c b
=> f :: m -> *
.
不完全是。改名后现在的情况:
(<*>) :: Const m (a -> b) -> Const m a -> Const m b
由于 Const x y
类型的值是应用于 x
类型值的构造函数 Const
,这意味着 f :: m
(和 v :: m
) ,我们从实例上下文中知道 Monoid m
。
(<*>) :: f (a->b) -> f a -> f b
≡ (Const m) (a->b) -> (Const m) a -> (Const m) b
≡ Const m (a->b) -> Const m a -> Const m b
≅ m -> m -> m
这是 <>
(又名 mappend
)的签名。
instance Monoid m => Applicative (Const m) where
pure _ = Const mempty
Const f <*> Const v = Const (f `mappend` v)
我不明白 <*>
type-check.
左侧 f
受限于 <*>
的签名,如 Applicative
class Functor f => Applicative f where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
改名后现在的情况:
(<*>) :: c (m -> b) -> c m -> c b
=> f :: m -> *
.
左边f
是mappend
的[第一个]参数。
来自Monoid的定义
class Monoid a where
mempty :: a
-- ^ Identity of 'mappend'
mappend :: a -> a -> a
改名后现在的情况:
mappend :: m -> m -> m
=> f :: m
.
After changing the names to the current situation:
(<*>) :: c (m -> b) -> c m -> c b
=>
f :: m -> *
.
不完全是。改名后现在的情况:
(<*>) :: Const m (a -> b) -> Const m a -> Const m b
由于 Const x y
类型的值是应用于 x
类型值的构造函数 Const
,这意味着 f :: m
(和 v :: m
) ,我们从实例上下文中知道 Monoid m
。
(<*>) :: f (a->b) -> f a -> f b
≡ (Const m) (a->b) -> (Const m) a -> (Const m) b
≡ Const m (a->b) -> Const m a -> Const m b
≅ m -> m -> m
这是 <>
(又名 mappend
)的签名。