Вывести все экземпляры от 1 до 8, где длина написания числа больше длины написания значения, превышающего его?

#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] совпадает с just numbers ) — но причина, по которой ваш код не работает, заключается в том, что x и y находятся только в области видимости внутри понимания списка, в котором вы их используете.

2. @RobinZigmond Да, я хочу вывести список пар, где написание первого элемента в паре длиннее написания второго элемента в паре, но также, первый элемент в паре в виде числа, меньше, чем второй элемент в паре в виде числа. Я понимаю область видимости в других языках, но не в Haskell. Я пытаюсь понять, как я могу использовать значения из понимания вложенного списка в общем понимании списка

Ответ №1:

Похоже, вы хотите что-то вроде этого:

 [(y1, y2) | (x1, y1) <- numbers, (x2, y2) <- numbers, length x1 > length x2, y1 < y2]
  

То есть это список пар чисел — с указанными вами требованиями. Я не могу проверить это в данный момент, я думаю, это должно сработать, но дайте мне знать, если у вас возникнут какие-либо проблемы с этим.

Ваши проблемы с областью были вызваны тем, что вы пытались выполнить вложенные понимания и получить доступ к переменным из внутреннего понимания во внешнем — это недопустимо, потому что переменная, используемая внутри понимания, находится в области видимости только в этом конкретном понимании.

Я также заменил ваше использование fst и snd явным сопоставлением с образцом для элементов пары, что почти всегда предпочтительнее, потому что оно более четкое.