我总是试图摆脱可能的parens。这是一个简单的代码:
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]]
而且很好。现在我尝试用美元替换parens:
groupElems :: Eq a => [a] -> [[a]]
groupElems [] = []
groupElems (x:xs) = (fst spaned) : groupElems $ snd spaned where
spaned = span (== x) (x:xs)
然后我变得很奇怪(对我而言)错误:
hello.hs:83:21: error:
• Couldn't match expected type ‘[a] -> [[a]]’
with actual type ‘[[a]]’
• The first argument of ($) takes one argument,
but its type ‘[[a]]’ has none
In the expression: (fst spaned) : groupElems $ snd spaned
In an equation for ‘groupElems’:
groupElems (x : xs)
= (fst spaned) : groupElems $ snd spaned
where
spaned = span (== x) (x : xs)
这里可以使用美元吗?
答案 0 :(得分:9)
由于运算符优先级,您会收到错误。 $
具有最低可能优先级,而函数应用程序具有最高可能性。即你的原始代码:
(fst spaned) : groupElems (snd spaned)
相当于:
(fst spaned) : (groupElems (snd spaned))
虽然您尝试删除parens的目的如下:
((fst spaned) : groupElems) $ (snd spaned)
答案 1 :(得分:4)
重新定义(或者更换)spaned
,您无需致电fst
或snd
,取消括号和对{的需求{1}}。
($)