7
votes

Les comptoirs sont initialisés à chaque fois?

J'essaie de faire un compteur simple. Mes compteurs ne montent pas cependant. Il me semble que si elles sont réinitialisées à chaque fois par la fonction "INC" ou peut-être que le (n + 1) ne fonctionne pas. Comment résoudre ce problème? XXX


0 commentaires

4 Réponses :


7
votes

dans les données HASKELL sont immuables par défaut. Cela signifie que le C in Inc est toujours zéro.

Pour obtenir des variables mutables dans HASKELL, vous devez leur demander explicitement , c'est-à-dire en utilisant iOREFS . Utilisez-les, vous pouvez écrire quelque chose comme: xxx


2 commentaires

Merci! Ça marche. Je vais lire dessus. Un autre problème au code est que cela indique une exécution d'E.G. 2sec mais exécute 15 secondes jusqu'à ce qu'il retourne à la console :-(. Mais merci pour votre solution, c'est une bonne aide.


Iorefs ici ne sont pas idiomatiques et un mauvais style. Les variables mutables ne sont pas nécessaires pour mettre en œuvre la tâche qu'il souhaite.



5
votes

Tout comme dans le code en dehors de io code>, vous pouvez organiser une série de calculs à l'aide d'un pli. FILEM code > fonctionne dans une monade, par exemple

main = do
    conn <- connect "192.168.35.62" 8081
    let tryOnePing (c, f) i = do
        p <- ping conn "ping"
        return $ if p == "pong" then (c+1, f) else (c, f+1)
    (c, f) <- foldM tryOnePing (0, 0) [0 .. 10000]
    print (c, f)


1 commentaires

Je suppose que Foldm est au-delà de la compréhension disponible de l'OP à ce stade.



2
votes

Les variables sont immuables dans HASKELLL. Lorsque vous appelez inc F Il renvoie une valeur de 0 + 1 que vous ignorez rapidement. La valeur de f est 0 et le restera pour tous les temps.


0 commentaires

21
votes

Bien que les variables mutables peuvent être utilisés dans Haskell comme indiqué par d'autres commentateurs, ce n'est pas un bon style: mutation ne doit pas être utilisé dans la plupart des cas

La fonction inc code> accepte son argument. valeur, qui est, elle ne modifie pas son argument. En outre, les variables déclarées par let code> garder leurs valeurs initiales, de sorte que vous ne pouvez pas les modifier. P>

Comment écrivez-vous si aucune variable ne peut jamais être changé? La réponse est: p>

  1. au lieu de modifier quelque chose en place, le retour d'une nouvelle valeur li>
  2. pour les boucles, récursivité utilisation li> Ol>

    Heureusement, vous avez rarement besoin d'écrire récursivité vous, comme la plupart des modèles récursifs sont déjà dans la bibliothèque standard. P>

    Dans votre cas, vous devez effectuer plusieurs actions IO et le retour de la finale la valeur des deux compteurs. Commençons d'une action: p>

    main = do
        conn <- connect "192.168.35.62" 8081
        c <- fmap (length . filter (== "pong")) $ mapM (const $ ping conn "ping") [0 .. 10000]
        print (c, 10000 - c)
    


6 commentaires

Merci! À ma "défense", je dois dire que je sais sur l'immuabilité. Cependant, j'ai trouvé le "n + 1" ici: hackage.hakell.org/packages/archive/mtl/1.1.0.2/doc/html/... et ici haskell.org/tatudial/goodies.html et je me demandais de cela pourrait fonctionner. Depuis qu'il a compilé, je pensais, - wooow, cela fonctionne. Ces tiques visent-elles à résoudre le même problème, des compteurs qui sont?


Merci. Au fait: lors de la synchronisation de l'extrait de réponse # 1 w iorefs, je reçois la moitié de l'exécution comparée à la synchronisation Pings <- heure (MapM Testyping [0. 1000000]) . Je suppose que dans le premier cas, cela n'attends pas le temps d'attente pour les réponses dans le timing. Cela pourrait-il avoir à faire avec la nature paresseuse ou pourrait-il être que cette construction iOREF s'exécute plus rapidement ??


Cela pourrait être les deux. Utilisez le profilage et / ou regarder un langage de base généré sur Haskell de niveau inférieur à voir. Utilisez également -O2 car mon code plus court dépend fortement de la présence d'optimisations.


Quant à l'état Monad que vous avez mentionné - Oui, il est là pour résoudre le problème des compteurs aussi.


Cette chose mapm, est-ce que cela sera toujours réalisable si le nombre de pings est défini sur 10 millions ou des effets, tels que la consommation de mémoire en font un choix sous-optimal?


Avec des optimisations à ce sujet devrait être réalisable. Le [0. 10000] Définit une énorme liste de chiffres, de sorte que tous les exemples s'appuient sur l'élimination des listes intermédiaires par Haskell Optimizer.