Проблема с пониманием списка Хаскелла

#haskell

Вопрос:

Теперь у меня есть два списка, содержащих местоположения, список 1 и список 2

Функция под названием generateDist, которая принимает два местоположения и генерирует расстояние от этих двух местоположений

Теперь я стремлюсь сгенерировать количество элементов в списке 1, которое находится всего в одной единице от конкретного элемента в списке 2 (выберите только ближайший).

Мое текущее выражение находится ниже:

 let l = [x|x <- list1, y <- list2, generateDist x y == 1]
 

Это не дает мне ожидаемого ответа, так как мне также нужны элементы, которые находятся всего в двух единицах от определенного элемента в списке 2 (местоположение может находиться на расстоянии одной единицы от местоположения a и на расстоянии двух единиц от местоположения b, я хочу, чтобы учитывался только ближайший).

Чтобы сделать это более ясным, если у меня есть два списка:

 list1 = [1,4,7] and list2 = [2,3,6]
number of elements that are 1 unit away should be: 3
number of elements that are 2 units away should be: 0 (instead of 2 if using my expression)
 

Кто-нибудь, пожалуйста, может мне помочь?
Как я должен реализовать эту функцию

Комментарии:

1. Можете ли вы добавить свои generateDist функции?

Ответ №1:

Я хочу, чтобы учитывался только самый близкий

Если вам нужен только самый близкий, вы, возможно, могли бы использовать такую функцию, как minimum :

 [ x | x <- list1, minimum [ generateDist x y | y <- list2 ] == 2 ]
 

Для этого требуется, чтобы тип расстояния, который вы используете (результат generateDist ), имел экземпляр Ord класса типа. Например, для целых чисел и абсолютного значения разницы в качестве расстояния, которое у вас есть:

 ghci> list1 = [1,4,7]
ghci> list2 = [2,3,6]
ghci> generateDist x y = abs (x - y)
ghci> [ x | x <- list1, minimum [ generateDist x y | y <- list2 ] == 1 ]
[1,4,7]
ghci> [ x | x <- list1, minimum [ generateDist x y | y <- list2 ] == 2 ]
[]
 

Комментарии:

1. Черт возьми, это было действительно полезно!