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