Как оценивается это понимание списка Haskell?

Я изучаю Haskell и я наткнулся на этот пример, связанный с пониманием списков:
[x | xs <- [[(3,4)],[(5,4),(3,2)]], (3,x) <- xs]
Дан ответ:
[4,2].

Почему нет ответа [(3,4),(3,2)]?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
80
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Сопоставление (3,x) с (3,4) дает x = 4. Если вы хотели (3,4), вам следует написать [(3,x) | ...].

Хм, не хочу (3,4). Я просто хочу объяснить, как обрабатывается понимание. Текст книги, которую я использую, не дает никакого объяснения приведенному примеру.

kesarling 02.07.2024 21:14

Я только что дал один; это неясно? Почему вы ожидаете, что x будет (3,4) вообще?

Naïm Favier 02.07.2024 21:18

Э-э, нет. Я получил спасибо! Я просто жду тайм-аута «Принять ответ». Хотя синтаксис (3,x) <- xs для меня немного новый.

kesarling 02.07.2024 21:18

Левая часть <- всегда соответствует шаблону; в случае xs <- ..., xs — это неопровержимый шаблон, который просто присваивает x значение из правой части. (3, x) — это опровержимый шаблон: не все значения представляют собой 2-кортежи с 3 и другим значением, но те, которые есть, имеют другое значение, присвоенное x. (Это точно такой же тип сопоставления с образцом, который используется в определениях функций, например, f (3, x) = x вызывает f (3, 5) == 5.)

chepner 02.07.2024 23:29

@kesarling При использовании списков pat <- list элементы list сопоставляются с шаблоном pat. Те, которые не совпадают, молча отбрасываются. Те, которые совпадают, определяют значения переменных в pat. Итак, (3,x) <- xs означает «для всех элементов xs, имеющих форму (3,x) (для некоторых x), ...». Обратите внимание, что x привязан ко второму компоненту пары, а не ко всей паре.

chi 03.07.2024 00:08

Почему нет ответа [(3,4),(3,2)]?

Понимание списка:

[x | xs <- [[(3,4)],[(5,4),(3,2)]], (3,x) <- xs]

означает, что xs будет «присвоен» каждому элементу списка [[(3, 4)], [(5, 4), (3, 2)]], то есть в первой «итерации» xs есть [(3,4)], а во второй — [(5, 4), (3, 2)].

Затем тот же трюк происходит с частью (3, x) <- xs: она перебирает элементы в xs и пытается сопоставить их с (3, x), поэтому первым «кандидатом» является (3, 4), и он соответствует, поэтому x = 4 даст результат; Далее идет (5, 4), но это не работает, потому что первый элемент 2-кортежа равен 5, а не 3. И, наконец, делается попытка с помощью (3, 2), поэтому x даётся x = 2.

В результате мы получаем список с 4 и 2, то есть [4, 2].

Другие вопросы по теме