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]
3 Réponses :
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)
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
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 .
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)
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]
.