Haskell符号用于组合两个函数f和g,其中g接受多个参数

8
通常我发现我想要组合两个函数f和g,但是g需要多个参数。Haskell是否提供了一组操作符来实现这个功能(我知道我可以自己编写,但这似乎相当普遍,我不想复制已经存在于Haskell中的运算符)。
例如:
(.@) = (.)
(.@@) f g x1 x2 = f $ g x1 x2
(.@@@) f g x1 x2 x3 = f $ g x1 x2 x3
(.@@@@) f g x1 x2 x3 x4 = f $ g x1 x2 x3 x4
...

最多有一些合理数量的参数


3
你可能对composition库感兴趣。 - bheklilr
你能否举个具体的例子? - Shoe
1
@bheklilr 谢谢,这就是我在寻找的答案。它是 (.:) (.::) 等等。我尝试过谷歌搜索“Haskell 组合函数多个参数”,但谷歌没有给出任何有用的链接。 - dspyz
2
@dspyz 没问题。说实话,每当我需要它时,我通常只是在我的代码中定义 .:,因为这比设置库并导入那个函数需要更少的字符。如果我需要 .::,那么我会引入该库。另一个有趣的细节是,.: 运算符是 fmap fmap fmap 的更具体版本,其类型为 (Functor f, Functor g) => (a -> b) -> f (g a) -> f (g b),可以在类似于 (+1) .: [Just 1, Nothing] === [Just 2, Nothing] 的有用情况下使用。 - bheklilr
2个回答

6

我知道你已经得到了想要的答案,但是我想指出这些组合器具有以下精妙的实现方式:

(.:)   = (.) . (.)
(.:.)  = (.) . (.) . (.)
(.::)  = (.) . (.) . (.) . (.)
(.::.) = (.) . (.) . (.) . (.) . (.)

如果你只需要完全应用它们:

f .: g   = (f .) . g
f .:. g  = ((f .) .) . g
f .:: g  = (((f .) .) .) . g
f .::. g = ((((f .) .) .) .) . g

直接使用这些表达式而不定义运算符似乎并不是那么可怕的事情。至少第一个表达式 (f .) . g 看起来对我来说足够易读。


1
哇!我喜欢这个,但是我完全迷失了。你介意一步一步地解释一下吗?我无法弄清楚如何拆包它。 - dspyz
好的,我在将所有内容移动到前缀表示法并评估 (.) (.) (.) f g x y 后弄清楚了。我只是不加思考地用 f (g x) 替换 (.) f g x 表达式,直到我得出 f (g x y)。 - dspyz

5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接