[英]Haskell - How does this average function work?
我发现了这个平均函数的实现:
avg :: [Int] -> Int
avg = div . sum <*> length
这是如何运作的? 我查看了由div . sum
产生的函数div . sum
div . sum
:
(div . sum) :: (Integral a, Foldable t) => t a -> a -> a
我明白这一点,但我无法说出<*> length
是如何工作的。
<*> :: Applicative f => f (a -> b) -> fa -> fb
是适用于Applicative
结构的顺序应用函数。 对于函数,这实现为 [src] :
instance Applicative ((->) r) where pure = const (<*>) fgx = fx (gx) liftA2 qfgx = q (fx) (gx)
所以f <*> g
是\\x -> fx (gx)
缩写。 因此,这意味着在avg
的情况下:
avg = div . sum <*> length
相当于:
avg x = (div . sum) x (length x)
因此相当于:
avg x = div (sum x) (length x)
所以它将sum x
除以length x
。
我不喜欢这种特殊的 pointfree-trick。 它使用Applicative (a->)
实例作为“扇出”,将参数传递给两个单独的函数。 本质上这两个函数是sum
和length
,然后结果由div
组合回来,这可以用箭头组合器很好地表达(虽然有点冗长,因为箭头并没有真正以 Haskell 的默认柯里化风格播放):
import Control.Arrow
avg = uncurry div . (sum &&& length)
在应用技巧中,您将组合函数合并到第一个共享参数的函数中。 所以div . sum
在这种情况下div . sum
,然后将另一个函数length
的结果传递给第一个函数的第二个参数。
你也可以使用
avg = liftA2 div sum length
它也使用Applicative
实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.