cons操作cons元素是从右到左的吗?
Is the cons operation cons elements from right to left?
我们知道 1:2:[]
会 returns [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 : 2
不会创建列表。您需要:
1 : [2]
而[2]
是2:[]
的语法糖。
所以现在你可以推断 1:2:[]
被展开为 1 : (2 : [])
。您还可以通过在 ghci
:
中使用 :info
命令来发现此行为
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]
我们知道 1:2:[]
会 returns [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 : 2
不会创建列表。您需要:
1 : [2]
而[2]
是2:[]
的语法糖。
所以现在你可以推断 1:2:[]
被展开为 1 : (2 : [])
。您还可以通过在 ghci
:
:info
命令来发现此行为
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]