![](/img/trans.png)
[英]What's the difference between 1 :| [2, 3, 4] and [1, 2, 3, 4] in Haskell
[英]What's the difference between . and (.) in Haskell?
我正在尝试编写一个管道 function ,它通过右侧的函数列表滚动一个值。 function 看起来像这样:
map . foldr (.) id
但我不明白它在这里做什么? 我知道.
是 function 组成,但(.)
有什么作用?
之间的区别.
和(.)
与+
和(+)
、 -
和(-)
以及所有其他之间的相同:
f. g
f. g
或3 + 5
;(.) 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 并返回它们的组合。
为了说明这如何应用于您的示例,请考虑您可能尝试的四种可能的变体:
map. foldr. id
map. foldr (.) id
map (.) foldr. id
map (.) foldr (.) id
这些看起来很相似。 但是在 function 应用程序周围放置括号会显示差异:
map. foldr. id
map. (foldr (.) id)
(map (.) foldr). id
(map (.) foldr (.) id)
换句话说:variation (1) 运行id
,然后将foldr
应用于其结果,然后将map
应用于其结果。 显然这是相当无用的,尤其是因为带有id
的组合什么都不做。 变化(2)是您所拥有的:它使用ZC1C1C425268E68385D1AB5074C174C17A94F14Z组成折叠列表 - IE使用ZC425268E683851AB5074C174C17A94F14F14F14F14Z (.):: (b -> c) -> (a -> b) -> a -> c
在id
的情况下,在将其结果作为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.