问题描述
我发现了平均值函数的这种实现:
kubectl get pods --field-selector=status.phase=Failed
这是如何工作的?我查看了avg :: [Int] -> Int
avg = div . sum <*> length
产生的功能:
div . sum
我理解这一点,但是我无法确定(div . sum) :: (Integral a,Foldable t) => t a -> a -> a
是如何工作的。
解决方法
<*> :: Applicative f => f (a -> b) -> f a -> f b
是在Applicative
结构上运行的顺序应用程序函数。对于函数来说,这是implemented as [src]:
function Do-SendKeys { param ( $SENDKEYS,$WINDOWTITLE ) $wshell = New-Object -ComObject wscript.shell; IF ($WINDOWTITLE) {$wshell.AppActivate($WINDOWTITLE)} Sleep 1 IF ($SENDKEYS) {$wshell.SendKeys($SENDKEYS)} } Do-SendKeys -WINDOWTITLE Print -SENDKEYS '{TAB}{TAB}' Do-SendKeys -WINDOWTITLE Print Do-SendKeys -SENDKEYS '%{f4}'
所以instance Applicative ((->) r) where
pure = const
(<*>) f g x = f x (g x)
liftA2 q f g x = q (f x) (g x)
是f <*> g
的缩写。因此,这意味着对于\x -> f x (g x)
:
avg
等效于:
avg = div . sum <*> length
因此等同于:
avg x = (div . sum) x (length x)
因此它将avg x = div (sum x) (length x)
除以sum x
。
我不喜欢这种特殊的无意义技巧。它使用<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Drag&droptodo</title>
</head>
<body>
<header class="header">
<h1>The Drag&Drop2Do</h1>
</header>
<section class="worksection">
<div class="workrow">
<div class="workheader">
<p>Dagens opgaver</p>
</div>
</div>
<div class="workrow">
<div class="workheader">
<p>Færdige opgaver</p>
</div>
</div>
<div class="workrow">
<div class="workheader">
<p>Udskudte opgaver</p>
</div>
</div>
</section>
<div class="buttonwrapper">
<button id="btn">+</button>
</div>
</body>
</html>
实例作为“扇出”,将参数传递给两个单独的函数。本质上,这两个函数是Applicative (a->)
和sum
,然后将结果合并到length
处,可以用箭头组合器很好地表示出来(尽管有点冗长,因为箭头没有真的以Haskell的默认咖喱风格演奏):
div
在应用技巧中,将合并函数合并到第一个参数共享函数中。因此,在这种情况下,import Control.Arrow
avg = uncurry div . (sum &&& length)
将另一个函数div . sum
的 result 传递给第一个函数的第二个参数。
您也可以使用
length
也使用avg = liftA2 div sum length
实例。