Массив Хаскелл (матрица) Доступ к элементу

#arrays #haskell #matrix #element

#массивы #haskell #матрица #элемент

Вопрос:

В настоящее время я работаю над проектом, которому потребуется получить доступ к элементам в массиве-матрице в Haskell. Итак, я попытался погуглить это, поискав везде.

Функция должна быть такой:

 getElementIndex :: Int -> Array (Int,Int) Int -> (Int,Int)
  

И он должен возвращать I и J индексы элемента в матрице.

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

1. Итак, учитывая элемент в 2D-массиве, вам нужно найти этот элемент (предположительно, уникальный?) и вернуть индексы, по которым вы его нашли? Это, безусловно, возможно (но немного странно для массивов, поскольку это будет означать линейное сканирование). Как далеко вы продвинулись на данный момент?

2. Да, он уникален.. Я думаю, мне придется выполнить итерацию по всему массиву и проверить, является ли значение ожидаемым, а затем, если это так, вернуть его. Но я не знаю, как получить доступ к элементам (по отдельности) в массиве.

Ответ №1:

Для чтения элементов из Array типов в Haskell используется (!) оператор, как в:

 Prelude Data.Array> let v = listArray (0,9) [1..10]
Prelude Data.Array> v ! 3
4
  

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

 assocs' x y arr = [ ((i,j), arr ! (i,j))
                  | i <- [0..x-1]
                  , j <- [0..y-1]
                  ]
  

который является всего лишь специализированной версией Data.Array.assocs :

 assocs :: Ix i => Array i e -> [(i, e)]
  

который возвращает отложенный список индексов и элементов. Итак, вызываем assocs , а затем берем первый подходящий элемент.

Ответ №2:

Как насчет

 x -> map fst . filter ((==x) . snd) . assocs
  

Ответ №3:

Простые матрицы исключают http://www.haskell.org/haskellwiki/Prelude_extensions#Matrices