两个函数如何同时使用一个参数

时间:2017-11-19 20:21:20

标签: haskell

我正在阅读有关应用仿函数的文章,并找到了这样一句话:

(+) <$> (+3) <*> (*100) $ 5

输出508。

(+3)和(* 100)如何同时使用5? 为什么我们不需要传递两个5&#39;作为参数,如:

(+) <$> (+3) <*> (*100) $ 5 5

4 个答案:

答案 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会传递给fg

答案 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会产生114应用于我们的仿函数(*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

这里有几张幻灯片: enter image description here enter image description here