2015-12-27 1 views
-4

У меня есть два списка в Haskell.Сравнение двух списков в Haskell

Оригинальный список: [ "привет", "HELLO", "мир", "МИР"]

только верхний регистр списка: [ "HELLO", "МИР"]

Не могли бы вы помочь мне создать функцию, которая должна вернуть список, содержащий индексы пересечения двух списков.

я могу получить первый индекс, делая это:

пусть upperIndex = findIndices (== (onlyUpper !! 0)) оригинальные

Однако, это работает только для одного экземпляра, в этом Я могу получить индекс «HELLO» только в исходном списке, но я хочу получить все из них.

Для этого примера, ответ должен быть: [1,3]

+0

Вы очень близки. Подумайте, какой предикат вам захочется дать 'findIndices'. Если у нас есть 'upperIndex = findIndices (\ x -> _) original', какое условие вы должны заменить' _'? Что это значит, если это условие верно? –

+0

Я новичок и честно не знаю :( – Orkun

ответ

0

Редактировать: Еще один вариант предложил Дэвид Янг является

findIndicesIn xs ys = findIndices (`elem` ys) xs 

который я p обратитесь к моему решению ниже.


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

findIndicesIn :: Eq a => [a] -> [a] -> [Maybe Int] 
findIndicesIn xs ys = map (`elemIndex` xs) ys 

elemIndex :: Eq a => a -> [a] -> Maybe Int находит индекс заданного элемента в списке (по сравнению с (==)). Если элемент не существует, вместо него возвращается Nothing. Чтобы найти все индексы, мы сопоставляем каждый элемент в ys и попытаемся найти его в xs с помощью elemIndex. Синтаксис секции используется вместо flip elemIndex xs или \y -> elemIndex y xs для заключения.

В результате список Maybe Int представляющих возможных индексов в xs каждого элемента в ys. Обратите внимание, что если вы не отслеживаете отсутствующие элементы, позиции индексов в результирующем списке больше не будут соответствовать положениям элементов в ys.

Вы также можете написать это, используя меньшее количество очков, как

findIndicesIn :: Eq a => [a] -> [a] -> [Maybe Int] 
findIndicesIn xs = map (`elemIndex` xs) 

YMMV, на которых один является более ясным. Оба эквивалентны. Эта версия довольно читабельная ИМО.Вы можете перейти на следующий шаг и написать

findIndicesIn = map . flip elemIndex 

, но лично я нахожу это менее читаемым. YMMV снова.

+0

Итак, почему я получаю «всего 1 «,« всего 3 »вместо 1 и 3? – Orkun

+0

Я обнаружил, что это был другой тип данных, поэтому я преобразовал его в Int, используя« map fromJust xs ». Спасибо за ответ, он отлично работает и намного короче !!! – Orkun

+0

@Orkun Не делайте этого, это приведет к сбою вашей программы, если элемент не найден в первом списке. Вы получаете «Just 1» и «Just 3», потому что нет никаких гарантий того, что элементы в второй список будет найден в произвольном списке, а 'Maybe' обрабатывает этот возможный сбой. –

-3
let upperIndex original onlyUpper = helper original 0 where helper [] _ = []; helper (x:xs) i = if elem x onlyUpper then i:(helper xs (i+1)) else helper xs (i+1) 

Пример использования:

Prelude> upperIndex ["hello", "HELLO", "world", "WORLD"] ["HELLO", "WORLD"] 
[1,3] 
+0

Работает безупречно, спасибо :) Я не понимаю, почему люди отдавали минус. Извините, что :( – Orkun

+3

В этом ответе должно быть объяснение, почему и как это работает. –

+0

О, я вижу. Но он приложил для меня усилия, я ценю это. Еще раз спасибо. – Orkun

 Смежные вопросы

  • Нет связанных вопросов^_^