Является ли операция 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]
Другие вопросы по тегам