7
votes

Prendre des sous-tableaux à Haskell

Comment puis-je obtenir un sous-réseau à Haskell?


5 commentaires

Savez-vous comment obtenir un tableau en premier lieu? De quelle bibliothèque de tableau parle-t-on? Data.vector? Data.Array? Cette question a vraiment besoin de tailler.


@TOMMD SUBARRAY DE DONNÉES.Array


Data.Array est plutôt maladroite et n'a pas de fusion, je vous suggère de regarder des données.


newarray_ (0, x) :: io (ioarray int sous) :-p


N'oubliez pas d'accepter la réponse qui vous a aidé à la fin;)


3 Réponses :


2
votes

Je n'ai trouvé aucun moyen direct d'obtenir une sous-tableau (c'est-à-dire une tranche de suivi), mais voici une façon de le faire via une liste intermédiaire.

import Data.Array

subArray :: Int -> Int -> Array -> Array
subArray i j a = listArray (0,j-i) $ map (a!) [i..j]


0 commentaires

13
votes

Je pense que vous recherchez est la section « dérivées de livres em> 'dans la documentation Data.Array: http://hackage.hakell.org/Arcackages/archive/array/latest/doc/html/data-array.html# 5 qui abrite la fonction:

ixmap strong> :: (ix i, ix j) => (i, i) -> (i -> j) -> array j e -> array i e p>

ixmap permet des transformations sur les indices de tableau. On peut penser que la fourniture de la composition de fonction à droite avec le mappage que le tableau d'origine incarne. P>

Une transformation similaire de valeurs de matrice peut être obtenue à l'aide de FMAP à partir de l'instance de tableau> de la classe de fonctions. P> blockQuote>

Le code suivant: p> xxx pré>

retournerait un tableau avec limites novices code>, et lorsqu'il est indexé avec i code>, la fonction de transformation index em> est appliquée sur l'index i code> avant d'être utilisé pour indexer Backingarray code>. P>


Exemple fort> Si vous aviez le tableau "Hello World" (HelloworLLDARRAY ci-dessous) et que vous voulez seulement voir "ell" comme un em> dérivé em> basé em> (sous-) Array: P>

> let helloWorldArray = listArray (0,length str - 1) str    -- 0-based array
     where str = "Hello World"

> let ellArray = ixmap (0,2) succ helloWorldArray           -- also 0-based array

> ellArray ! 0
'e'
> ellArray ! 1
'l'
> ellArray ! 2
'l'


0 commentaires

4
votes

Prendre des sous-tableaux à l'aide du Vecteur Package est probablement l'approche la plus facile (en supposant que votre question ne soit pas 't en fait de demander des sous-listes).

Les fonctions pertinentes de l'interface Vector / Array General sont les suivantes:

  • Slice :: vecteur VA => int -> int -> VA -> VA

    Mais vous devriez aussi savoir de prendre et de tomber. Slice prend un index et une longueur et extrait la sous-tableau.


0 commentaires