怎么< *>使用Function Applicative?

时间:2016-12-20 10:06:01

标签: haskell applicative reader

我试图找出lambda calculus为什么以下代码的函数结果

(,) <$> (+1) <*> (+1)

的类型为Num a =&gt; a - &gt; (a,a)代替Num a =&gt; a - &gt; a - &gt; (a,a)

这就是我所拥有的,我做了一些可怕的错误或是&lt; *&gt;只是这样连线?

( \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 个答案:

答案 0 :(得分:5)

让我们看一下你的例子中的类型:

(,)            <$> (+1)            <*> (+1)
^                  ^                   ^
|                  |                   |
a -> b -> (a, b)   Num a => a -> a     Num a => a -> a
(<$>)的Rhs和(<*>)的Rhs / Lhs必须是应用函数。你的函子是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)