Вы можете спросить GHCI об информации неподвижности:
> :i :
data [] a = ... | a : [a] -- Defined in ‘GHC.Types’
infixr 5 :
Игнорирование первой линии на мгновение, вторая линия говорит infixr 5
, что означает, что :
правоассоциативным и имеет приоритет 5. «Ассоциированные к right "означает группу операторов" вправо ", поэтому e1 : e2 : e3
означает e1 : (e2 : e3)
.
Другие варианты включают infixl
(группировка «влево») и infix
(если вам потребуется группировка, сообщите об ошибке). Например, e1 + e2 + e3
означает (e1 + e2) + e3
, потому что +
является infixl
:
> :i +
class Num a where
(+) :: a -> a -> a
...
-- Defined in ‘GHC.Num’
infixl 6 +
И True == True == True
ошибка синтаксического анализа, поскольку ==
является infix
:
> :i ==
class Eq a where
(==) :: a -> a -> Bool
...
-- Defined in ‘GHC.Classes’
infix 4 ==
При наличии нескольких операторов, старшинство используется, чтобы сказать, как они сгруппированы, но ваше выражение включает только один оператор, а именно (:)
, поэтому приоритет не требуется, чтобы решить, что означает ваше выражение.
Конечно, вы всегда можете использовать явные скобки для устранения неоднозначности или группировать операторы «по-другому»; например (e1 : e2) : e3
также является действительным выражением и означает что-то отличное от e1 : (e2 : e3)
, и (True == True) == True
действителен и оценивается как True
, хотя True == True == True
недействителен.
Вот некоторые примеры, показывающие разницу:
> 1 : 2 : [3,4]
[1,2,3,4]
> 1 : (2 : [3,4])
[1,2,3,4]
> (1 : [2]) : [[3,4],[5]]
[[1,2],[3,4],[5]]
Или, еще до точки:
> let e1 = []; e2 = ["ab","cd"]; e3 = [["ef","gh"],["ij"]]
> e1 : e2 : e3
[[],["ab","cd"],["ef","gh"],["ij"]]
> e1 : (e2 : e3)
[[],["ab","cd"],["ef","gh"],["ij"]]
> (e1 : e2) : e3
[["","ab","cd"],["ef","gh"],["ij"]]
(Cooking до значений, которые делают оба из этих выражений хорошо типизированных было весело!)
в '[[x, y]]' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'должны иметь одинаковый тип. Но в '[x, [y]]', 'x' должен быть того же типа, что и' [y] ', то есть список, с элементами того же типа, что и' y'. –