Нахождение индекса элемента списка кортежей с подстановочным знаком - PullRequest
0 голосов
/ 25 апреля 2020

Я пытаюсь найти индекс элемента в списке кортежей с Haskell с использованием подстановочного знака.

Я адаптировал свои типы, чтобы их было проще объяснить. На данный момент мой способ мышления заключается в использовании elemIndex.

Например,

> elemIndex 2 [1,2,3,4,5]
Just 1

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

> elemIndex (2, 20) [(1, 10),(2, 20),(3, 30),(4, 40),(5,50)]
Just 1

Я хочу иметь возможность предоставить только первую часть кортежа и получить индекс, такой как это:

> elemIndex (2, _) [(1, 10),(2, 20),(3, 30),(4, 40),(5,50)]
Just 1

, но результат, который я получаю, таков:

<interactive>:58:15: error:
    • Found hole: _ :: Integer
    • In the expression: _
      In the first argument of ‘elemIndex’, namely ‘(2, _)’
      In the expression:
        elemIndex (2, _) [(1, 10), (2, 20), (3, 30), (4, 40), ....]
    • Relevant bindings include
        it :: Maybe Int (bound at <interactive>:58:1)

У меня проблемы с расшифровкой сообщения об ошибке, а также я не могу понять, как обойти эту ошибку. Любая помощь будет принята с благодарностью, спасибо!

1 Ответ

5 голосов
/ 25 апреля 2020

_ это не подстановочный знак, это типизированное отверстие [haskell -wiki] . Типизированные отверстия часто используются для определения типа заполнения.

Здесь можно использовать findIndex :: (a -> Bool) -> [a] -> Maybe Int. Здесь вместо указания элемента для поиска вы можете использовать предикат (a -> Bool), и функция затем вернет для заданного списка первый индекс, который удовлетворяет предикату (обернутый в конструктор данных Just), или Nothing если элемент не может быть найден.

Таким образом, вы можете реализовать это как:

Prelude Data.List> findIndex ((2 ==) . fst) [(1, 10),(2, 20),(3, 30),(4, 40),(5,50)]
Just 1
...