, когда вы разбиваете список, используя синтаксис x: xs, почему он заключен в круглые скобки? Каково значение круглых скобок? почему бы не [x: xs] или просто x: xs?Что означают круглые скобки (x: xs) при сопоставлении шаблонов?
ответ
минусов клетка не должен быть в круглых скобках в любом контексте, но в большинстве контекстов это потому, что
Функция приложение связывает сильнее, чем любой оператор инфиксного.
Зажигайте это в своем мозгу буквами огня.
Пример:
length [] = 0
length (x:xs) = 1 + length xs
Если скобки опущены компилятор думает, что вы поссорились x
, за которым следует неуместному оператор инфиксного, и было бы горько жаловаться. С другой стороны, это нормально
length l = case l of [] -> 0
x:xs -> 1 + length xs
В этом случае ни x
, ни xs
возможно не может быть истолковано как часть функции приложения, так нет скобок необходимы.
Обратите внимание, что то же самое прекрасное правило функции приложение связывает сильнее, чем любой инфиксный оператор является то, что позволяет нам писать length xs
в 1 + length xs
без скобок. Правило инфикса дается, и правило инфикса убирается.
+1 для писем огня. Мой код Haskell перестает выглядеть как Lisp после того, как я усвоил это правило. – Nefrubyr
+1. Любите последнее предложение –
Вы просто используете оператор cons :
, который имеет низкий приоритет. Скобки необходимы, чтобы все оставалось в порядке.
И вы не используете [x:xs]
, потому что это будет соответствовать списку, единственным элементом которого является список с головой x
и хвостом xs
.
Я никогда не пробовал этот конкретный шаблон '[x: xs]', но, конечно, вы правы; он совпадает с одним списком на верхнем уровне. Непринужденным обозначением шаблона будет: '((x: xs): [])'. –
Я не знаю точного ответа, но я думаю, что это связано с тем, что можно сопоставить в шаблонах. Только конструкторы могут быть сопоставлены. Конструкторы могут быть однословными или составными. Посмотрите на следующий код:
data Foo = Bar | Baz Int
f :: Foo -> Int
f Bar = 1
f (Baz x) = x - 1
Однословные конструкторы соответствуют как есть. Но составные конструкторы должны быть окружены паранами, чтобы избежать двусмысленности. Если пропустить скобки, похоже, соответствие против двух независимых аргументов:
f Baz x = x - 1
Так что, как (:)
Композиционно оно должно быть в круглых скобках. Пропуск паров для Bar
- это своего рода синтаксический сахар.
UPDATE: Я понял, что (как заметил сикора) это следствие приоритета оператора. Он разъясняет мои предположения. Функция-приложение (которое представляет собой просто пространство между функцией и аргументом) имеет наивысший приоритет. Другие, включая (:) имеют более низкий приоритет. Таким образом, f x:xs
следует толковать как ((:) (f x)) xs
, что, по-видимому, не то, что нам нужно. Хотя f (x:xs)
интерпретируется как f
, примененный к x:xs
, который в свою очередь (:)
применяется к x
и xs
.
Это связано с разбором.
Помните, что двоеточие: это просто конструктор, написанный синтаксисом оператора. Таким образом, функция, как
foo [] = 0
foo (x:xs) = x + foo xs
также может быть записана в виде
foo [] = 0
foo ((:) x xs) = x + foo xs
Если вы уронили скобку в этой последней строке, она становится очень трудно разобрать!
:
- это конструктор данных, как и любой другой шаблон, но написанный инфикс. Скобки заключаются исключительно из-за префикса infix; они фактически не требуются и могут быть безопасно опущены, если позволяют правила приоритета. Например:
> let (_, a:_) = (1, [2, 3, 4]) in a
2
> let a:_ = "xyzzy"
'x'
> case [1, 2, 3] of; a:b -> a; otherwise -> 0;
1
Интересно, что это не работает в голове лямбда. Не знаю, почему.
Как всегда, оператор «соседство» связывает крепче, чем все остальное, так что чаще всего не разделители нужны, но они на самом деле не части матча шаблона - иначе вы не сможете использовать рисунки, такие как (x:y:zs)
вместо (x:(y:zs))
.
- 1. Что означают круглые скобки в Regex?
- 2. Что означают скобки и круглые скобки после селектора jquery?
- 3. Что означают пустые круглые скобки после объявления «require» в Node.js?
- 4. В SQL, что означают круглые скобки в предложении 'as'?
- 5. Что означают круглые скобки, когда вы объявляете/называете свойство?
- 6. Что означают круглые скобки после INTEGER в sqlite?
- 7. Что означают скобки вокруг замыкания?
- 8. Что означают двойные скобки?
- 9. Что круглые скобки/круглые скобки() в попытке поймать в Java
- 10. Скобки в совпадении шаблонов в объявлении функции Haskell
- 11. Что означают эти фигурные скобки?
- 12. круглые скобки при печати списка
- 13. Использование масок при сопоставлении шаблонов
- 14. латекс удлиненные круглые скобки
- 15. Что означают квадратные скобки? в Java
- 16. Что означают цифры внутри скобки/терминал?
- 17. Две круглые скобки после переменной?
- 18. Что означают квадратные скобки в html?
- 19. Что означают квадратные скобки, «[]», означают в документации по функциям/классу?
- 20. Что такое() (круглые скобки) для regex python
- 21. Что означают скобки в объявлении переменной C?
- 22. Что означают скобки вокруг этой линии python?
- 23. Что означают свободные скобки внутри функции?
- 24. Что означают скобки в регулярном выражении?
- 25. Что означают квадратные скобки в PHP?
- 26. Что означают скобки после фигурных скобок?
- 27. Что означают скобки, окружающие имя функции?
- 28. Что означают [] скобки после селектора JQuery?
- 29. Что означают разные скобки в Ruby?
- 30. Что означают квадратные скобки в журналах LaTeX?
У вас есть пример того, где он завернут()? x: xs может использоваться как для описания списка с первым элементом списка. [x: xs] будет списком со списком x: xs в нем. –
Он говорит о сопоставлении с образцом, а не о создании списка. – Rorick