假设我在Haskell中有一个函数f,它接受一个双精度值并返回一个双精度值,我有一个函数g,它也接受一个双精度值并返回一个双精度值。
现在,我可以像这样将f应用于g:f . g。
现在,让我们来看一个更高维的函数f,它接受两个双精度值并输出一个:
f :: Double -> Double -> Double
或
f :: (Double, Double) -> Double
我还有两个g函数:
g1 :: Double -> Double,g2 :: Double -> Double
现在,我想组合函数以获得如下内容:
composition x = f (g1 x) (g2 x)
是否仅使用点(.)即可实现此目的?操作员?
发布于 2020-11-11 06:10:09
composition = liftA2 f g1 g2由于function is an applicative [src]
实例应用((->) r)其中=常量(<*>) f g x=f x (g x) liftA2 q f g x=Q (f x) (g x)
和liftA2 is implemented as [src]
liftA2 ::(a -> b -> c) -> f a -> f b -> f c liftA2 f x= (<*>) (fmap F x)
因此,这将被解析为:
liftA2 f g1 g2 x = (<*>) (fmap f g1) g2 x
= (fmap f g1 <*> g2) x
= (f . g1 <*> g2) x
= (\fa ga xa -> fa xa (ga xa)) (f . g1) g2 x
= (f . g1) x (g2 x)
= f (g1 x) (g2 x)发布于 2020-11-11 06:10:46
您可以尝试这样做:
import Control.Arrow
composition = f . (g1 &&& g2)(&&&)将g1 :: a -> b和g2 :: a -> c转换为g1 &&& g2 :: a -> (b, c)。然后你就可以应用正常的合成了。
https://stackoverflow.com/questions/64777422
复制相似问题