2
votes

Comment accéder à un élément de matrice spécifique ou avec un index spécifique Haskell

J'essaye d'accéder à un élément spécifique de la matrice. Par exemple, pour récupérer un élément sur deux de la sous-liste et renvoyer une seule liste.

data Matrix a = M [[a]]
rowMatrix :: [[Int]] -> Int -> a

pour ex rowMatrix [[1,2,3,4], [5,6,7 , 8], [9,10,11,12]] 3 ---> [3,7,11]


0 commentaires

3 Réponses :


1
votes

Pour chaque sous-liste, extrayez son n ème élément avec l'opérateur !! :

rowMatrix :: [[a]] -> Int -> [a]
rowMatrix listOfLists n = listOfLists >>= ((:[]) . (!! n))

Par exemple:

rowMatrix [[1,2,3], [2,3,4]] 2
[3,4]

Vous pouvez aussi rendre cela un peu plus fou, mais aussi plus concis:

rowMatrix [] _ = []
rowMatrix (row:others) n = (row !! n) : (rowMatrix others n)


4 commentaires

en quelque sorte, je reçois une erreur du compilateur, l'avez-vous testé?


@mWelt: Je pense que vous confondez votre type de données Matrix et la signature de votre fonction.


@mWelt, ceci est écrit pour le type de liste sous-jacent, et il ne devrait pas être difficile de faire fonctionner cela pour Matrix : une correspondance de modèle devrait faire l'affaire.


vous avez tous les deux raison, j'ai vu où j'ai échoué. merci @WillemVanOnsem était exactement mon point de confusion



1
votes

On peut, pour chaque ligne, obtenir le k -ième élément, donc on peut effectuer un mapping, comme:

romMatrix :: Matrix a -> Int -> [a]
rowMatrix (M m) k = map (!! k) m

Ou pour un Matrice type:

romMatrix :: [[a]] -> Int -> [a]
rowMatrix m k = map (!! k) m

Nous créons donc ici une liste d'éléments où chaque élément est le k -ème élément de la sous-liste correspondante .


0 commentaires

0
votes

Puisque les lignes sont des colonnes dans la matrice transposée; pour correspondre à votre exemple; c'est juste

> rowMatrix [[1,2,3,4], [5,6,7,8], [9,10,11,12]]  3
[3,7,11]
it :: [Int]

Je devais aussi corriger votre type. Notez également le problème de la mise hors ligne.

rowMatrix :: [[a]] -> Int -> [a]
rowMatrix xs m = transpose xs !! (m-1)


2 commentaires

En fait, cela fonctionne aussi avec mon type, l'entrée ne doit pas nécessairement être Int, pourrait être n'importe quelle liste de. mais votre solution est également cool.


dans ce cas, il doit être [[a]] -> Int -> [a] .