9
votes

Est-il préférable d'utiliser la monade d'état ou de passer à l'état récursivement?

Je suis juste en train d'apprendre Haskell et j'essaie de comprendre le moyen le plus idiomatique de mettre en œuvre une gamme d'algorithmes de visibilité.

Le code de démonstration que j'ai trouvé utilise l'État monade, mais il me semble plus simple (je suis juste un débutant) pour passer de l'état récursivement. Qu'est-ce que j'oublie ici? Y a-t-il des problèmes de performance?

Recherchez le code à: http://www.finalcog.com/breResenham-algorithm- idiomatic-haskell

merci,

Chris.


3 commentaires

La récursion de puits peut être plus lente et provoquer sa croissance de votre pile


La récursion @Tnay peut également être plus rapide et fonctionner dans un espace de pile constant.


Il convient de souligner que la monade d'état et la ST ("thread d'état", que votre article utilise) monade n'est pas la même.


3 Réponses :


12
votes

Cela peut devenir un peu verbeux de passer l'état partout. En outre, la monade d'état est bien connue de la plupart des codeurs de haskell afin qu'ils sauront ce que vous faites. Si vous roulez à la main votre propre, à l'extérieur d'une monade, il peut être difficile de discerner ce que fait votre code.

Je trouve l'état Monad Neat pour encapsuler des changements d'état, il est assez évident à quelle partie de votre code est remarquable (c'est-à-dire ou dépend de l'état) W.R.T. le reste des trucs pure.


1 commentaires

Apprendre à utiliser les monades bien est également important, alors en les utilisant dans une situation où vous savez comment vous pourrez accomplir la même chose autrement peut être un bon moyen d'apprendre.



11
votes

Pour les programmes plus importants, il est préférable de cacher l'état qui passe la plomberie dans la monade. Il y a moins de risque d'erreur alors.


0 commentaires

3
votes

Un avantage d'utiliser une monade à transmettre sur l'état plutôt que de transmettre l'état explicitement, est qu'il existe de nombreux combinaisons utiles définis pour les monades que vous pouvez utiliser.


0 commentaires