cons操作cons元素是从右到左吗?

时间:2018-06-20 05:16:44

标签: haskell operator-precedence syntactic-sugar cons

我们知道1:2:[]将返回[1,2]

我刚刚尝试过1:2,这给了我一个错误。

<interactive>:48:1: error:
    ? Non type-variable argument in the constraint: Num [a]
      (Use FlexibleContexts to permit this)
    ? When checking the inferred type
        it :: forall a. (Num a, Num [a]) => [a]

我知道这可能不是一个合适的示例,因为:操作包含一个元素和一个列表。但我只是想知道它如何在1:2:[]

中工作

1 个答案:

答案 0 :(得分:6)

错误消息可能会更好。但是1 : 2不会创建列表。您需要:

1 : [2]

[2]2:[]的语法糖。

因此,现在您可以推断出1:2:[]被扩展为1 : (2 : [])。您还可以通过在:info中使用ghci命令来发现此行为:

Prelude> :info (:)
data [] a = ... | a : [a]   -- Defined in ‘GHC.Types’
infixr 5 :

它表示(:)运算符是正确的关联。

还存在TemplateHaskell技巧,可让您了解如何在结果表达式中指定括号:

$ ghci -ddump-splices -XTemplateHaskell
Prelude> $([| 1:2:[] |])  -- put expression with bunch of operators here
<interactive>:1:3-14: Splicing expression
    [| 1 : 2 : [] |] ======> (1 GHC.Types.: (2 GHC.Types.: []))
[1,2]