Выведите все случаи от 1 до 8, где длина написания числа больше, чем длина написания значения, превышающего его? - PullRequest
0 голосов
/ 19 марта 2019

Я полный новичок на Хаскеле, и я пытался делать это целый день.

Таким образом, один выход может быть:

Три, шесть

(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 Ответ

3 голосов
/ 19 марта 2019

Звучит так, будто вы хотите что-то вроде этого:

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

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

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

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

...