39 votes

Documentation de STArray pour les débutants et questions relatives à State/ST

J'ai du mal à comprendre STArray à partir de la documentation et d'autres howtos/discussions que j'ai trouvés sur Google. J'ai d'autres questions connexes ci-dessous.

Selon la documentation, STArray sont

Tableaux mutables encadrés et non encadrés dans la monade ST.

Cela m'a donné l'impression, que STArray est destiné à être utilisé comme un état qui circulent entre les fonctions (imaginez que vous avez un vecteur qui doit être mis à jour souvent).

Apparemment, il est utilisé différemment :

ST s (STArray s a e)

Quel est l'état s ici ? S'il est utilisé en interne, pourquoi n'est-il pas caché à l'utilisateur ?

Cela signifie également que, si nous voulons utiliser une STArray s Int Int que l'on fait passer pour un état, on pourrait définir

type StateArray a = Control.Monad.State (ST s (STArray s Int Int)) a

ce qui semble plutôt encombrant.

Enfin,

  • quelle est la différence entre ST y State ?
  • quelle est la différence entre STArray y IOArray si le ST y IO sont destinés à un usage "interne" ?

Merci !

72voto

hammar Points 89293

ST est une monade dans laquelle un type limité d'effets secondaires est autorisé, à savoir les références mutables et les tableaux mutables. Elle vous permet donc d'implémenter des fonctions qui sont pures vues de l'extérieur, mais qui utilisent la mutation en interne.

Ceci est différent de State qui ne fait que simuler une mutation en faisant passer l'état dans votre calcul sous forme d'entrées et de sorties supplémentaires. La différence est importante lors de la mise en œuvre de certains algorithmes impératifs, car ils nécessitent parfois une mutation pour être mis en œuvre efficacement. Par exemple, l'utilisation d'un tableau régulier dans un State vous ne pouvez le modifier qu'en faisant une copie, alors qu'avec la monade ST vous pouvez avoir une véritable mutation en place.

La raison pour laquelle nous avons à la fois ST y IO c'est que ST offre des garanties plus solides que IO à savoir :

  1. ST ne permet pas d'effets secondaires arbitraires comme, par exemple, l'accès au système de fichiers.
  2. Nous pouvons garantir que les effets secondaires ST fait ne peut pas échapper à la portée de runST et il peut donc être considéré comme pur par rapport au monde extérieur.

La raison pour laquelle nous pouvons garantir que les effets secondaires ne peuvent pas s'échapper est liée à la variable de type s . Puisque toute action ST doit être polymorphe en s vous ne pouvez pas écrire de code qui permette à des références mutables d'entrer ou de sortir du champ d'application d'un fichier de type runST car le vérificateur de type se plaindra qu'il ne peut pas garantir que l'option s de votre action et celle de la référence ou du tableau sont les mêmes sauf si ils viennent du même runST l'étendue.

À titre d'exemple d'utilisation du ST avec des tableaux mutables, voici une implémentation du tamis d'Erathostenes :

import Control.Monad
import Control.Monad.ST
import Data.Array.ST
import Data.Array.Unboxed

primesUpto :: Int -> [Int]
primesUpto n = [p | (p, True) <- assocs $ sieve n]

sieve :: Int -> UArray Int Bool
sieve n = runSTUArray $ do
    sieve <- newArray (2, n) True
    forM_ [2..n] $ \p -> do
        isPrime <- readArray sieve p
        when isPrime $ do
            forM_ [p*2, p*3 .. n] $ \k -> do
                writeArray sieve k False
    return sieve

<code>runSTUArray</code> est une forme spécialisée de <code>runST</code> qui vous permet de construire un tableau en utilisant la mutation à l'intérieur, avant de le geler et de le retourner sous forme de tableau immuable. <code>newArray</code> , <code>readArray</code> y <code>writeArray</code> font ce que l'on attend d'eux.

Comme vous pouvez le voir, la signature de type de sieve indique qu'il s'agit d'une fonction pure, et c'est le cas. Cependant, elle utilise fortement la mutation à l'intérieur pour l'implémenter efficacement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X