Haskell Can';Don’不要用美元代替美元

Haskell Can';Don’不要用美元代替美元,haskell,Haskell,我总是尽量在可能的地方摆脱帕伦斯。下面是简单的代码: groupElems :: Eq a => [a] -> [[a]] groupElems [] = [] groupElems (x:xs) = (fst spaned) : groupElems (snd spaned) where spaned = span (== x) (x:xs) 它获取一个列表并返回分组元素的列表。像这样- groupElems [1,2,2,2,4] > [[1],[2,2,2],[4]

我总是尽量在可能的地方摆脱帕伦斯。下面是简单的代码:

groupElems :: Eq a => [a] -> [[a]]
groupElems [] = []
groupElems (x:xs) = (fst spaned) : groupElems (snd spaned) where
  spaned = span (== x) (x:xs)
它获取一个列表并返回分组元素的列表。像这样-

groupElems [1,2,2,2,4]
> [[1],[2,2,2],[4]]
而且thas工作得很好。现在我试着用美元代替帕伦斯:

groupElems :: Eq a => [a] -> [[a]]
groupElems [] = []
groupElems (x:xs) = (fst spaned) : groupElems $ snd spaned where
  spaned = span (== x) (x:xs)
但后来我(对我来说)犯了一个奇怪的错误:


这里可以使用美元吗?

由于操作员的先例,您会得到错误<代码>$具有尽可能低的优先级,而函数应用程序具有尽可能高的优先级。即您的原始代码:

(fst spaned) : groupElems (snd spaned)
相当于:

(fst spaned) : (groupElems (snd spaned))
当您尝试删除参数时,分组如下:

((fst spaned) : groupElems) $ (snd spaned)

另请参见。

由于操作员的先例,您会得到错误<代码>$具有尽可能低的优先级,而函数应用程序具有尽可能高的优先级。即您的原始代码:

(fst spaned) : groupElems (snd spaned)
相当于:

(fst spaned) : (groupElems (snd spaned))
当您尝试删除参数时,分组如下:

((fst spaned) : groupElems) $ (snd spaned)
另请参见。

重新定义(或者更确切地说替换)
spaned
,您不需要调用
fst
snd
,省去了括号和对
($)
的需要

重新定义(或者更确切地说替换)
spaned
,您不需要调用
fst
snd
,省去了括号和对
($)
的需要


请注意,
(fst span)
不需要上面的括号。您可以在不使用任何
$
的情况下删除这些括号。对于
snd span
,我认为它们不容易删除。此外,每次都必须指出:
$
与括号没有任何关系。顺便说一句,您也可以使用它来简化表达式,使它们有时不再需要括号,但这只是因为
$
是一个低优先级运算符。@Cubic我知道,但我试图通过这种不平凡的方式去掉括号,这让我不顾一切地试图把美元放在几乎所有地方。注意,
(fst spaned)
不需要上面的括号。您可以在不使用任何
$
的情况下删除这些括号。对于
snd span
,我认为它们不容易删除。此外,每次都必须指出:
$
与括号没有任何关系。顺便说一句,你也可以用它来简化表达式,使它们有时不再需要括号,但那只是因为
$
是一个低优先级的运算符。@Cubic我知道,但尽管如此,我还是尝试用这种不平凡的方法来去掉括号,这导致我不顾一切地试图把美元放在几乎所有地方。