Является ли операция минусов элементами минусов справа налево?
Мы знаем, что 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 ответ:
Сообщение об ошибке может быть лучше. Но
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]