Является ли операция минусов элементами минусов справа налево?


Мы знаем, что 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 3

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]