繁体   English   中英

有什么区别。 和 (.) 在 Haskell 中?

[英]What's the difference between . and (.) in Haskell?

我正在尝试编写一个管道 function ,它通过右侧的函数列表滚动一个值。 function 看起来像这样:

map . foldr (.) id 

但我不明白它在这里做什么? 我知道. 是 function 组成,但(.)有什么作用?

之间的区别. (.)+(+)-(-)以及所有其他之间的相同:

  • 没有括号,你有中缀形式,你把操作数放在符号之前和之后,就像在f. g f. g3 + 5 ;
  • 用括号你有 function 申请表,其中操作数 go 都在 function 名称之后,如(.) fg(+) 3 5

类似的情况也适用于具有“正常”名称的函数,例如myfunc 然而,在这种情况下,普通名称myfunc需要 arguments (就像(.)一样),并且通过将名称放在反引号之间来获得中缀形式。

以下是几个等式的例子:

f . g === (.) f g
a + b === (+) a b
a `fun` b === fun a b
i `elem` l === elem i l

作为附加信息,即使 function 需要超过 2 个 arguments,如

func x y z = whatever

你仍然可以用中缀风格调用它,但是写a `func` b会给你一个 function 带一个参数(对应于z的那个),就像你做func ab一样。 (这是部分应用程序。示例: f = (+) 3是有效的,它会导致 function f将 3 添加到您传递给它的任何参数,例如f 5 == 8 。)

正如@Enlico 在他们的回答中已经说过的那样,表单. 不带括号的是中缀运算符。 相比之下,带括号的形式(.)指的是function (.) ,它采用其他两个函数作为 arguments 并返回它们的组合。

为了说明这如何应用于您的示例,请考虑您可能尝试的四种可能的变体:

  1. map. foldr. id
  2. map. foldr (.) id
  3. map (.) foldr. id
  4. map (.) foldr (.) id

这些看起来很相似。 但是在 function 应用程序周围放置括号会显示差异:

  1. map. foldr. id
  2. map. (foldr (.) id)
  3. (map (.) foldr). id
  4. (map (.) foldr (.) id)

换句话说:variation (1) 运行id ,然后将foldr应用于其结果,然后将map应用于其结果。 显然这是相当无用的,尤其是因为带有id的组合什么都不做。 变化(2)是您所拥有的:它使用ZC1C1C425268E68385D1AB5074C174C17A94F14Z组成折叠列表 - IE使用ZC425268E683851AB5074C174C17A94F14F14F14F14Z (.):: (b -> c) -> (a -> b) -> a -> cid的情况下,在将其结果作为map的第一个参数传递之前,从而将这个新组合的 function 映射到一个列表上。 另一方面,变体 (3) 不仅没有意义,而且写得很糟糕:它不仅评估map (.) foldr ,这是一个甚至不进行类型检查的表达式,然后它尝试用id组合它,这正如我已经提到的那样,什么都不做。 Finally, variation (4) applies the function map — which as we all know only takes two arguments at most — to four arguments, namely the functions (.) , foldr , (.) and id . 显然,您所拥有的变体 (2) 是这里唯一有意义的变体。

暂无
暂无

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

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