27 votes

Pourquoi n'ont-Haskell 98 standard classes rendu inférieur à Haskell 1.3 s?

Avant de Haskell 98, il y avait Haskell 1.0 à 1.4. Il est assez intéressant de voir le développement à travers les années, que des fonctionnalités ont été ajoutées pour les premières versions de standards de Haskell.

Par exemple, la notation a d'abord été standardisée par Haskell 1.3 (publié 1996-05-01). Dans l' Prelude, nous trouvons les définitions suivantes (page 87):

-- Monadic classes

class  Functor f  where
    map         :: (a -> b) -> f a -> f b

class  Monad m  where
    (>>=)       :: m a -> (a -> m b) -> m b
    (>>)        :: m a -> m b -> m b
    return      :: a -> m a

    m >> k      = m >>= \_ -> k

class  (Monad m) => MonadZero m  where
    zero        :: m a

class  (MonadZero m) => MonadPlus m where
    (++)        :: m a -> m a -> m a

Les mêmes définitions sont trouvés en Haskell 1.4. J'ai quelques problèmes avec ce (par exemple, l' MonadPlus réforme n'est pas arrivé ici encore), mais dans l'ensemble, c'est une très belle définition.

C'est très différent de Haskell 98, où la définition suivante est trouvé:

-- Monadic classes


class  Functor f  where
    fmap              :: (a -> b) -> f a -> f b


class  Monad m  where
    (>>=)  :: m a -> (a -> m b) -> m b
    (>>)   :: m a -> m b -> m b
    return :: a -> m a
    fail   :: String -> m a

        -- Minimal complete definition:
        --      (>>=), return
    m >> k  =  m >>= \_ -> k
    fail s  = error s

C'est aussi la définition en Haskell 2010. J'ai les problèmes suivants avec cette définition:

  • MonadZero et MonadPlus sont partis. Ils étaient classes utiles.
  • Dans le cas d'une correspondance de modèle de l'échec en notation...

    • Haskell 1.3 utilisations zero. La Gauche Zéro s'applique la loi (zero >>= k = zero), de sorte que vous savez ce qui est censé se produire.
    • Haskell 98 fail msgmsg est généré par le compilateur en cas de GHC. Tout peut arriver, aucune garantie à propos de sa sémantique. Par conséquent, il n'est pas beaucoup d'une fonction pour les utilisateurs. En conséquence, le comportement de mise en correspondance du modèle échecs en Haskell 98 do-la notation est imprévisible!
  • Les noms sont moins générales (par exemple, map vs fmap). Pas un gros problème, mais c'est une épine dans mon œil.


Dans l'ensemble, je pense que ces changements n'étaient pas pour le meilleur. En fait, je pense qu'ils ont été un pas en arrière à partir de Haskell 1.4. Pourquoi ces choses ont changé pour Haskell 98, et pourquoi de cette façon?


En aparté, je peux imaginer la suite des défenses:

  • "fail permet de localiser les erreurs." Seulement pour les programmeurs, et seulement au moment de l'exécution. L' (portables!) message d'erreur n'est pas exactement quelque chose que vous voulez analyser. Si vous tenez vraiment à ce sujet, vous devez suivre explicitement. Nous avons maintenant Control.Failure de la failure paquet, qui fait un bien meilleur travail à ce (failure x se comporte essentiellement comme zero).
  • "Un trop grand nombre de classes rend le développement et l'utilisation trop dur." Ayant trop peu de cours sauts de leurs lois, et ces lois sont tout aussi importantes que les types.
  • "Exemple restreint de fonctions sont plus faciles à apprendre." Alors pourquoi n'est-il pas un SimplePrelude au lieu de cela, avec la plupart des classes supprimées? C'est seulement un magique déclaration à l'écart pour les élèves, ils peuvent gérer que beaucoup. (Peut - {-# LANGUAGE RebindableSyntax #-} est nécessaire, mais encore une fois, les étudiants sont très bon à copier-coller des trucs.)
  • "L'Instance restreinte par les fonctions d'erreurs plus lisible." J'utilise fmap beaucoup plus souvent que l' map, alors pourquoi ne pas l' map et listMap à la place?

23voto

Don Stewart Points 94361

Pourquoi ces choses ont changé pour Haskell 98, et pourquoi de cette façon?

Haskell 98 implique beaucoup de simplification de la langue (qui a depuis été inversés). L'objectif était d'améliorer Haskell en tant que langue d'enseignement, et relativement conservateur choix.

Voir, par exemple,

Nous avons considéré Haskell 98 comme raisonnablement conception conservatrice. Pour exemple, en ce moment multi-paramètres des classes de type ont été largement utilisé, mais Haskell 98 seul a seul paramètre de type de cours (Peyton Jones et coll., 1997).

Dans: Histoire de Haskell

Et:

Haskell 98 sera en aucun cas être la dernière révision de Haskell. Sur le contraire, nous concevons en sachant que de nouvelles extensions de langage (multi-paramètre type de classes, universelle et existentielle la quantification, le motif, les gardes, etc, etc) sont bien sur le chemin. Cependant, Haskell 98 ont un statut particulier: l'objectif est que Haskell compilateurs continuera à soutenir Haskell 98 (étant donné le indicateur approprié), même après les versions ultérieures de la langue ont été défini, et donc le nom de "Haskell 98' se réfère à un fixe, stable de langue.

Dans: Haskell98 rapport

Donc, les choses ont été simplifiées, avec l'objectif de produire plus simple standard.

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