我正在阅读有关应用仿函数的文章,并找到了这样一句话:
(+) <$> (+3) <*> (*100) $ 5
输出508。
(+3)和(* 100)如何同时使用5? 为什么我们不需要传递两个5&#39;作为参数,如:
(+) <$> (+3) <*> (*100) $ 5 5
答案 0 :(得分:7)
在(->) a
应用实例中,我们发现:
instance Applicative ((->) a) where
pure = const
(<*>) f g x = f x (g x)
liftA2 q f g x = q (f x) (g x)
因此,根据定义,x
会传递给f
和g
。
答案 1 :(得分:3)
这是一种取消装箱的方法。我们从
开始e = ((+) <$> (+3)) <*> (*100)
(请注意,我遗漏了$ 5
)。我们在此使用的<$>
和<*>
的Applicative Functor是函数类型(->)
(部分应用于,我猜,Integer
)。这里,<$>
和<*>
的含义如下:
f <$> g = \y -> f (g y)
g <*> h = \x -> g x (h x)
我们可以将其插入到第一行的术语中并获取
e = \x -> (\y -> (+) ((+3) y)) x ((*100) x
我们可以对这个术语进行一些简化:
e = \x -> (x+3) + (x*100)
因此,如果此函数的值为(+) <$> (+3) <*> (*100)
,那么将此函数应用于5
并不再令人惊讶
e 5 = (5+3) + (5*100) = 508
答案 2 :(得分:0)
问题是,您首先必须了解函数如何成为仿函数。考虑一个像容器这样的函数,只有当你用参数提供它时才会显示它的内容。换句话说,当使用参数调用此applicative functor(函数)时,我们只会知道它的内容。所以这个函数的类型就是两个不同类型的r -> a
。但是对于仿函数,我们只能对单一类型产生影响。因此,应用仿函数是部分应用的类型,就像Either
类型的仿函数实例一样。我们对函数的输出感兴趣,因此我们的applicative functor在前缀表示法中变为(->) r
。记住<$>
是fmap
(+3) <$> (*2) $ 4
会产生11
。 4
应用于我们的仿函数(*2)
,结果(应用仿函数上下文中的值)与(+3)
一起映射。
但在我们的情况下,我们fmap
(+)
(+3)
到(+) = \w x -> w + x
。为了更清楚,我们可以用lambda格式重新编写函数。
(+3) = \y -> y + 3
和(+) <$> (+3)
。
然后\y -> y + 3
部分应用w
代替fmap
我们\y x -> (y + 3) + x
应用的应用仿函数变为<*>
。
现在来到应用运算符g <*> h = \x -> g x (h x)
。如前面的答案所述,定义为g
,它采用两个参数函数g
,并部分应用h
的第二个参数及其第二个参数函数(\y x -> (y + 3) + x) <*> (*100)
。现在我们的操作看起来像
(\y x -> (y + 3) + x) <*> (\z -> z*100)
可以改写为;
\z -> z*100
这意味着现在我们必须将x
部分应用于\y z -> (y + 3) + (z*100)
,我们的功能变为\x -> (\y z -> (y + 3) + (z*100)) x x
。
最后,applicative操作符返回一个函数,该函数接受一个参数并将其应用于上述两个参数函数的两个参数。所以
/**
* Wordpress has a known bug with the posts_per_page value and overriding it using
* query_posts. The result is that although the number of allowed posts_per_page
* is abided by on the first page, subsequent pages give a 404 error and act as if
* there are no more custom post type posts to show and thus gives a 404 error.
*
* This fix is a nicer alternative to setting the blog pages show at most value in the
* WP Admin reading options screen to a low value like 1.
*
*/
function custom_posts_per_page( $query ) {
if ( $query->is_archive('cpt_name') || $query->is_category() ) {
set_query_var('posts_per_page', 1);
}
}
add_action( 'pre_get_posts', 'custom_posts_per_page' );
答案 3 :(得分:0)
这是一个专用于 Applicative 类型类的 ((->) r) 实例主题的幻灯片:https://www2.slideshare.net/pjschwarz/function-applicative-for-great-good-of-palindrome-checker-function-polyglot-fp-for-fun-and-profit-haskell-and-scala