繁体   English   中英

是否有一个计算`fx(gx)`的标准函数?

[英]Is there a standard function that computes `f x (g x)`?

我在Hoogle上找不到任何东西,但有一个标准函数或运算符,其签名如下:

func :: (a -> b -> c) -> (a -> b) -> a -> c

即给出两个函数fg以及一个元素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)

...这与您的签名模数字母重命名相同。

这是因为函数类型(->)具有FunctorApplicativeMonad实例,它们被惯用地称为“reader”。 这些实例为所有参数设置了一个额外的参数,这正是你的函数所做的。

f <*> g ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀

请参阅https://wiki.haskell.org/Pointfree

是的,这是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减少( rx ):

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.

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