Je suis en train de travailler sur la mise en œuvre de l' UCT algorithme en Haskell, ce qui nécessite une quantité considérable de données de jonglage. Sans entrer dans trop de détails, c'est un algorithme de simulation où, à chaque "étape", un nœud feuille dans l'arbre de recherche est sélectionné en fonction de certaines propriétés statistiques, un nouveau nœud enfant est construit à que les feuilles, et les statistiques correspondant à la nouvelle feuille et tous ses ancêtres sont mis à jour.
Compte tenu de tout ce que la jonglerie, je ne suis pas assez forte pour comprendre comment faire de l'ensemble de l'arbre de recherche une belle immuable structure de données à la Okasaki. Au lieu de cela, j'ai été jouer avec l' ST
monade un peu, la création de structures composées de mutable STRef
s. Un exemple artificiel (sans rapport avec l'UCT):
import Control.Monad
import Control.Monad.ST
import Data.STRef
data STRefPair s a b = STRefPair { left :: STRef s a, right :: STRef s b }
mkStRefPair :: a -> b -> ST s (STRefPair s a b)
mkStRefPair a b = do
a' <- newSTRef a
b' <- newSTRef b
return $ STRefPair a' b'
derp :: (Num a, Num b) => STRefPair s a b -> ST s ()
derp p = do
modifySTRef (left p) (\x -> x + 1)
modifySTRef (right p) (\x -> x - 1)
herp :: (Num a, Num b) => (a, b)
herp = runST $ do
p <- mkStRefPair 0 0
replicateM_ 10 $ derp p
a <- readSTRef $ left p
b <- readSTRef $ right p
return (a, b)
main = print herp -- should print (10, -10)
Évidemment, cet exemple en particulier, serait beaucoup plus facile d'écrire sans l'aide d' ST
, mais j'espère que c'est clair là où je veux en venir... si je devais appliquer ce genre de style à mon UCT cas d'utilisation, c'est que de l'entêtement?
Quelqu'un a posé une question similaire ici une couple d'années en arrière, mais je pense que ma question est un peu différent... je n'ai pas de problème à l'aide de monades pour encapsuler mutable état lorsque cela est approprié, mais c'est que "lorsque cela est approprié, une clause" qui me fait. Je suis inquiet que je suis en train de revenir à un état d'esprit orienté objet prématurément, où j'ai un tas d'objets avec des getters et setters. Pas exactement idiomatiques Haskell...
D'autre part, s'il est raisonnable de style de codage pour un ensemble de problèmes, je suppose que ma question devient: est-il bien connu des façons de garder ce genre de code lisible et maintenable? Je suis un peu dégoûtés par tous les explicite les lectures et les écritures, et en particulier dégoûtés par avoir à traduire à partir de mon STRef
-les structures à l'intérieur de l' ST
monade à isomorphe mais immuable structures à l'extérieur.