#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. Черт возьми, это было действительно полезно!