首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell函数组合-两个一维函数转换为一个二维函数

Haskell函数组合-两个一维函数转换为一个二维函数
EN

Stack Overflow用户
提问于 2020-11-11 06:02:20
回答 2查看 44关注 0票数 1

假设我在Haskell中有一个函数f,它接受一个双精度值并返回一个双精度值,我有一个函数g,它也接受一个双精度值并返回一个双精度值。

现在,我可以像这样将f应用于g:f . g

现在,让我们来看一个更高维的函数f,它接受两个双精度值并输出一个:

f :: Double -> Double -> Double

f :: (Double, Double) -> Double

我还有两个g函数:

g1 :: Double -> Doubleg2 :: Double -> Double

现在,我想组合函数以获得如下内容:

composition x = f (g1 x) (g2 x)

是否仅使用点(.)即可实现此目的?操作员?

EN

回答 2

Stack Overflow用户

发布于 2020-11-11 06:10:09

您可以使用 来执行以下操作:

代码语言:javascript
复制
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)

因此,这将被解析为:

代码语言:javascript
复制
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)
票数 3
EN

Stack Overflow用户

发布于 2020-11-11 06:10:46

您可以尝试这样做:

代码语言:javascript
复制
import Control.Arrow

composition = f . (g1 &&& g2)

(&&&)g1 :: a -> bg2 :: a -> c转换为g1 &&& g2 :: a -> (b, c)。然后你就可以应用正常的合成了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64777422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档