[英]Is there a standard function that computes `f x (g x)`?
我在Hoogle上找不到任何东西,但有一个标准函数或运算符,其签名如下:
func :: (a -> b -> c) -> (a -> b) -> a -> c
即给出两个函数f
和g
以及一个元素x
作为参数,它计算fx (gx)
?
您正在寻找的功能是(<*>)
。 为什么? 嗯, (<*>)
有一个更通用的类型:
(<*>) :: Applicative f => f (a -> b) -> f a -> f b
但是考虑到我们可以将f
专门化为(->) r
,它有一个Applicative
实例:
(<*>) :: (->) r (a -> b) -> (->) r a -> (->) r b
...然后我们可以重新排列类型->
是中缀而不是前缀,因为它通常是:
(<*>) :: (r -> a -> b) -> (r -> a) -> (r -> b)
...这与您的签名模数字母重命名相同。
这是因为函数类型(->)
具有Functor
, Applicative
和Monad
实例,它们被惯用地称为“reader”。 这些实例为所有参数设置了一个额外的参数,这正是你的函数所做的。
f <*> g
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
是的,这是ap :: Monad m => m (a -> b) -> ma -> mb
的特例
在这里你应该看到monad m
为(->) r
,所以带有参数的函数。 现在ap
定义为[source] :
ap m1 m2 = do
x1 <- m1
x2 <- m2
return (x1 x2)
因此,这是语法糖:
ap m1 m2 = m1 >>= (\x1 -> m2 >>= return . x1)
绑定函数>>=
被定义为(->) r
实例为[source] :
instance Monad ((->) r) where
f >>= k = \ r -> k (f r) r
return = const
(默认情况下return
等于pure
,定义为const
)。
这意味着:
ap f g = f >>= (\x1 -> g >>= const . x1)
= f >>= (\x1 -> (\r -> (const . x1) (g r) r))
= \x -> (\x1 -> (\r -> (const . x1) (g r) r)) (f x) x
现在我们可以执行beta减少( x1
是(fx)
):
ap f g = \x -> (\r -> (const . (f x)) (g r) r) x
和另一个beta减少( r
是x
):
ap f g = \x -> (const . (f x)) (g x) x
我们可以将const
为\\c _ -> c
,将(.)
为f . g
f . g
到`\\ z - > f(gz):
ap f g = \x -> ((\c _ -> c) . (f x)) (g x) x
= \x -> (\z -> (\c _ -> c) ((f x) z)) (g x) x
现在我们可以再次执行beta减少( z
是(gx)
, c
是((fx) (gx))
):
ap f g = \x -> ((\c _ -> c) ((f x) (g x))) x
= \x -> (\_ -> ((f x) (g x))) x
最后我们执行beta减少( _
是x
):
ap f g = \x -> ((f x) (g x))
我们现在将x
移动到函数的头部:
ap f g x = (f x) (g x)
在Haskell中, fxy
是(fx) y
缩写,因此这意味着:
ap f g x = (f x) (g x)
= f x (g x)
这是请求的功能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.