1

例如,假设我们有函数double(x) = 2 * x和。什么是函数?请注意,我问的是一个可用于任何数量的函数的函数。例如,您可以用, , into组成。square(x) = x ^ 2sum(x,y) = x + ycomposecompose(compose(sum, square), double) = x^2 + 2*xf(x,y,z)g(x)h(x)i(x)f(g(x), h(x), i(x))

4

1 回答 1

4

这是一个常见的 Haskell 习语,applicative functors

composed = f <$> g1 <*> g2 <*> ... <*> gn

(可以在这里找到更好的介绍)。

由于自动部分应用,这看起来非常干净,并且工作方式如下:

(<*>) f g x = f x (g x)
(<$>) f g x = f (g x) -- same as (.)

例如,

f <$> g <*> h <*> i ==>
(\x -> f (g x)) <*> h <*> i ==>
(\y -> (\x -> f (g x)) y (h y)) <*> i ==>
(\y -> f (g y) (h y)) <*> i ==>
(\z -> (\y -> f (g y) (h y)) z (i z)) ==>
(\z -> f (g z) (h z) (i z)).

不过,应用函子更通用。它们不是“算法”,而是一个概念。您也可以在树上执行相同的操作,例如(如果定义正确):

(+) <$> (Node (Leaf 1) (Leaf 2)) <*> (Node (Leaf 3) (Leaf 4)) ==>
Node (Leaf 4) (Leaf 6)

但我怀疑应用程序是否真的可以在大多数其他语言中使用,因为缺乏简单的部分应用程序。

于 2012-11-18T17:15:57.383 回答