【问题标题】:Haskell notation for composing two functions f and g where g takes multiple arguments用于组合两个函数 f 和 g 的 Haskell 表示法,其中 g 接受多个参数
【发布时间】:2014-05-14 19:34:50
【问题描述】:

我经常发现我想组合两个函数 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
...

最多合理数量的参数

【问题讨论】:

  • 您可能对composition 库感兴趣
  • 你能举个具体的例子吗?
  • @bheklilr 谢谢,这就是我正在寻找的答案。它是 (.:) (.::) 等。我尝试使用谷歌搜索“haskell compose function multiple arguments”,但谷歌没有提供任何有用的链接
  • @dspyz 没问题。老实说,我通常只在需要时在我的代码中定义.:,因为它需要的字符比设置库和导入那个函数要少。如果我需要.::,那么我会拉入图书馆。另一个有趣的消息是.: 运算符是fmap fmap fmap 的更具体版本,其类型为(Functor f, Functor g) => (a -> b) -> f (g a) -> f (g b),可用于(+1) .: [Just 1, Nothing] === [Just 2, Nothing] 等有用的情况。

标签: haskell operators variadic-functions currying function-composition


【解决方案1】:

我知道你得到了你想要的答案,但我想指出这些组合器有以下可爱的实现:

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

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

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

不定义运算符,直接使用这些表达式似乎并没有那么糟糕。至少第一个 (f .) . g 对我来说足够可读。

【讨论】:

  • 哇!我喜欢这个,但我完全迷失了。你介意一步一步地解释这个吗?我不知道如何打开它。
  • 好的,我在将所有内容都移到前缀符号并评估 (.) (.) (.) f g x y 只是不假思索地将 (.) f g x 表达式替换为 f (g x) 直到我到达 f (g x y)
【解决方案2】:

从@bheklilr 的评论中,我正在寻找的答案在作文库中:http://hackage.haskell.org/package/composition-1.0.1.0/docs/Data-Composition.html

函数 (.:)、(.:.)、(.::)、(.::.) 等完全符合我的想法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多