【发布时间】:2020-04-28 04:20:39
【问题描述】:
应用程序通常作为提升多参数函数的一种方式呈现 进入函子并将函子值应用于它。但我想知道是否有一些 微妙的额外力量源于它可以通过提升来做到这一点 返回一个函数并应用函数参数的函数 一次。
想象一下,我们定义一个基于提升函数的接口,其参数是一个参数元组:
# from Functor
fmap :: (a -> b) -> Fa -> Fb
# from Applicative
pure :: a -> Fa
# combine multiple functor values into a functor of a tuple
tuple1 :: Fa -> F(a)
tuple2 :: Fa -> Fb -> F(a,b)
tuple3 :: Fa -> Fb -> Fc -> F(a,b,c)
(etc ...)
# lift multi-argument functions (that take a tuple as input)
ap_tuple1 :: ((a) -> b) -> F(a) -> Fb
ap_tuple2 :: ((a,b) -> c) -> F(a,b) -> Fc
ap_tuple3 :: ((a,b,c) -> d) -> F(a,b,c) -> Fd
(etc ..)
假设我们为我们可能遇到的每个大小的元组定义了相应的元组函数。 这个接口是否和 Applicative 接口一样强大,因为它允许 提升/应用到多参数功能但不允许提升/应用到功能 那返回一个函数?显然,可以对以元组作为参数的函数进行 curry 因此它们可以在应用程序中提升,并且可以取消返回函数的函数 为了将它们提升到上面的假设实现中。但在我看来,有一种微妙的 权力的差异。有什么区别吗? (假设这个问题甚至有意义)
【问题讨论】:
-
“应用程序”会分散注意力。我们已经可以在一个单纯的 Functor 中应用函数。所以
mult :: Monoidal f => (f a, f b) -> f (a,b)首先将两个函数值粉碎为一个,然后我们仅通过 Functor 的力量将函数的非柯里化版本 (uncurry g (x,y) = g x y) 应用到该函数值“内部”。一些法律将确保粉碎不会造成任何损失。与x $ y == uncurry ($) (x,y)相同,只是“在内部”。
标签: haskell higher-order-functions applicative