不能使用美元($)代替parens

时间:2018-05-27 12:23:25

标签: haskell

我总是试图摆脱可能的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)

这里可以使用美元吗?

2 个答案:

答案 0 :(得分:9)

由于运算符优先级,您会收到错误。 $具有最低可能优先级,而函数应用程序具有最高可能性。即你的原始代码:

(fst spaned) : groupElems (snd spaned)

相当于:

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

虽然您尝试删除parens的目的如下:

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

另见this question

答案 1 :(得分:4)

重新定义(或者更换)spaned,您无需致电fstsnd,取消括号对{的需求{1}}。

($)