繁体   English   中英

Haskell-以奇怪的方式组成三个函数

[英]Haskell- composing three functions in weird way

我有三个函数xyz和一个名为functionComposer的函数。

我希望functionComposer将函数xyz作为参数,并返回一个函数,该函数使用y和z的结果作为x的参数并应用x。

在数学符号中: x(y(a),z(b))

我不是要求这个: functionComposer xyz = xyz

例如:

double x = x + x

summer x y = x + y

functionComposer summer double double = summer (double) (double) 

如果x = 2,结果应为8(2 + 2)+(2 + 2)

你也可以使用(->) a的应用实例

import Control.Applicative


funcComp summer double1 double2 = summer <$> double1 <*> double2

或monad实例

funcComp summer double1 double2 = liftM2 summer double1 double2

理解这一点的方法是,对于(->) a ,applicative和monad实例都是为了“参数化” double1double2都接受的函数值。

使用你的符号:

functionComposer summer double1 double2 = \x -> summer (double1 x) (double2 x) 

\\x -> ...表示将x映射到...的函数。

注意我必须给double函数参数赋予不同的名称,因为通常你想要组合不同的函数。

不管怎样,我觉得好像你想要一系列令人困惑的点,所以:

functionComposer :: (c -> d -> e) -> (a -> c) -> (b -> d) -> a -> b -> e
functionComposer x y z = (. z) . (x . y)

这是“自然地”来自

functionComposer x y z a = (x . y) a . z

但为何停在那里?

functionComposer x y = (. (x . y)) . flip (.)

不再:

functionComposer x = (. flip (.)) . flip (.) . (x .)

更多!

functionComposer = (((. flip (.)) . flip (.)) .) . (.)

你基本上是在评估yz “并行1 ”。 表达这个的最基本的组合是(***) :: Arrow f => fac -> fbd -> f (a, b) (c, d) 你想要提供给x ,所以基本上你想写

           x . (y***z)            -- or  x <<< y***z

现在这并没有完全解决问题,因为箭头组合器与元组一起工作。 所以你需要uncurry x 大致相同的方式,如果你想让整个事物以正常的方式接受论证,那么你必须讨论(a,b)元组。 虽然很容易:

functionComposer :: (c -> d -> e) -> (a -> c) -> (b -> d) -> a -> b -> e
functionComposer x y z = curry $ uncurry x <<< y *** z

1介意,我不是指多线程意义上的并行,只是“语义平行”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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