繁体   English   中英

Haskell - 这个平均函数是如何工作的?

[英]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->)实例作为“扇出”,将参数传递给两个单独的函数。 本质上这两个函数是sumlength ,然后结果由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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM