<*> 如何与 Function Applicative 一起使用?
How does <*> work with Function Applicative?
我正在尝试用 lambda 演算找出以下代码的函数结果的原因
(,) <$> (+1) <*> (+1)
类型为 Num a => a -> (a, a) 而不是 Num a => a -> a -> (a, a)
这就是我得到的,我是不是做错了什么,还是 <*> 只是这样连接的?
( \x, y -> (,) x y ) <$> ( \x -> x + 1 ) <*> ( \x -> x + 1 )
-- fmap applies first
(\x y -> (,) ((+1) x) y ) <*> ( \x -> x + 1 ) -- substituted the lambda with (+1) for better clarity
-- then goes apply
( \x y -> (,) ((+1) x) ((+1) y) )
lambda的参数是如何统一的,在什么时候统一?
让我们看看您示例中的类型:
(,) <$> (+1) <*> (+1)
^ ^ ^
| | |
a -> b -> (a, b) Num a => a -> a Num a => a -> a
(<$>)
的 Rhs 和 (<*>)
的 Rhs/Lhs 必须是 Applicative Functor。你的仿函数是 Num a => (->) a
(monad Reader)。
那么,(<$>)
申请后会是什么类型(伪代码):
a -> b -> (a, b) <$> Num a => (->) a a ==> Num a => (->) a (b -> (a, b))
(<*>)
之后(伪代码):
Num a => (->) a (b -> (a, b)) <*> Num a => (->) a a ==> Num a => (->) a (a, a)
但是 Num a => (->) a (a, a)
等价于 Num a => a -> (a, a)
.
正如@chi 在开头所写,(->) r
类型的实现 (<*>)
是:
(<*>) :: (->) r (a -> b) -> (->) r a -> (->) r b
f <*> g = \r -> f r (g r)
而且,如果您申请,您将获得:
(\x y -> (,) x y) <$> (\r -> r + 1) <*> (\r -> r + 1) =
= (\r y -> (,) (r + 1) y) <*> (\r -> r + 1) =
= \r -> (,) (r + 1) (r + 1)
我正在尝试用 lambda 演算找出以下代码的函数结果的原因
(,) <$> (+1) <*> (+1)
类型为 Num a => a -> (a, a) 而不是 Num a => a -> a -> (a, a)
这就是我得到的,我是不是做错了什么,还是 <*> 只是这样连接的?
( \x, y -> (,) x y ) <$> ( \x -> x + 1 ) <*> ( \x -> x + 1 )
-- fmap applies first
(\x y -> (,) ((+1) x) y ) <*> ( \x -> x + 1 ) -- substituted the lambda with (+1) for better clarity
-- then goes apply
( \x y -> (,) ((+1) x) ((+1) y) )
lambda的参数是如何统一的,在什么时候统一?
让我们看看您示例中的类型:
(,) <$> (+1) <*> (+1)
^ ^ ^
| | |
a -> b -> (a, b) Num a => a -> a Num a => a -> a
(<$>)
的 Rhs 和 (<*>)
的 Rhs/Lhs 必须是 Applicative Functor。你的仿函数是 Num a => (->) a
(monad Reader)。
那么,(<$>)
申请后会是什么类型(伪代码):
a -> b -> (a, b) <$> Num a => (->) a a ==> Num a => (->) a (b -> (a, b))
(<*>)
之后(伪代码):
Num a => (->) a (b -> (a, b)) <*> Num a => (->) a a ==> Num a => (->) a (a, a)
但是 Num a => (->) a (a, a)
等价于 Num a => a -> (a, a)
.
正如@chi 在开头所写,(->) r
类型的实现 (<*>)
是:
(<*>) :: (->) r (a -> b) -> (->) r a -> (->) r b
f <*> g = \r -> f r (g r)
而且,如果您申请,您将获得:
(\x y -> (,) x y) <$> (\r -> r + 1) <*> (\r -> r + 1) =
= (\r y -> (,) (r + 1) y) <*> (\r -> r + 1) =
= \r -> (,) (r + 1) (r + 1)