#haskell #scope #ghci
#haskell #область #ghci
Вопрос:
Я законченный новичок в Haskell и пытаюсь сделать это уже целый день.
Таким образом, один вывод может быть:
Три, шесть
(3 меньше 6, но его написание длиннее, чем написание 6)
Я придумал это в Haskell, но переменные выходят за пределы области видимости, я пока не совсем понимаю область видимости в Haskell. Это может быть совершенно неправильно, но любая помощь приветствуется.
let numbers = [("One",1),("Two",2),("Three",3),("Four",4),("Five",5),("Six",6),("Seven",7),("Eight",8)]
[([ x | x <- numbers], [y | y <- numbers]) | length (fst x) > length (fst y), snd x < snd y]
Может ли кто-нибудь помочь мне исправить это понимание вложенного списка? Или даже скажите мне, могу ли я вообще использовать понимание вложенного списка?
Для уточнения:
Я хочу вывести список пар, где написание первого элемента в паре длиннее написания второго элемента в паре, но также, первый элемент в паре в виде числа, меньше, чем второй элемент в паре в виде числа.
Комментарии:
1. «область видимости» просто означает часть программы, из которой вы можете получить доступ к определенной переменной. Оно существует в каждом языке программирования (и на самом деле обычно менее заметно в Haskell, чем в других языках, учитывая, что переменные Haskell неизменяемы). В любом случае, действительно непонятно, что вы пытаетесь вывести (похоже, это список пар списков? и
[x | x <- numbers]
совпадает с justnumbers
) — но причина, по которой ваш код не работает, заключается в том, чтоx
иy
находятся только в области видимости внутри понимания списка, в котором вы их используете.2. @RobinZigmond Да, я хочу вывести список пар, где написание первого элемента в паре длиннее написания второго элемента в паре, но также, первый элемент в паре в виде числа, меньше, чем второй элемент в паре в виде числа. Я понимаю область видимости в других языках, но не в Haskell. Я пытаюсь понять, как я могу использовать значения из понимания вложенного списка в общем понимании списка
Ответ №1:
Похоже, вы хотите что-то вроде этого:
[(y1, y2) | (x1, y1) <- numbers, (x2, y2) <- numbers, length x1 > length x2, y1 < y2]
То есть это список пар чисел — с указанными вами требованиями. Я не могу проверить это в данный момент, я думаю, это должно сработать, но дайте мне знать, если у вас возникнут какие-либо проблемы с этим.
Ваши проблемы с областью были вызваны тем, что вы пытались выполнить вложенные понимания и получить доступ к переменным из внутреннего понимания во внешнем — это недопустимо, потому что переменная, используемая внутри понимания, находится в области видимости только в этом конкретном понимании.
Я также заменил ваше использование fst
и snd
явным сопоставлением с образцом для элементов пары, что почти всегда предпочтительнее, потому что оно более четкое.