4 votes

Différence entre `newtype` et `data` avec une annotation de sévérité

Comment ce code

data D = D { _d :: ![P] } -- Note the strictness annotation!

Comparez à ceci

newtype D = D { _d :: [P] }

Un site réponse à une question connexe dit :

la principale différence entre data et newtype est que les constructeurs de data sont paresseux alors que ceux de newtype sont stricts.

Comment cette différence fonctionne-t-elle lorsque le data a une annotation de rigueur ?

(la question est basée sur un code réel sur lequel je suis tombé)

5voto

chi Points 8104

Par exemple,

case undefined of
   D d -> "hello"

se trompera pour data (strict ou non strict), mais seront évalués à "hello" pour les nouveaux types.

En effet, au moment de l'exécution, l'application d'un newtype ou le filtrage sur celui-ci ne correspond à aucune opération. Pas même le fait de forcer la valeur que nous case sur.

En revanche, le filtrage sur un data force toujours la valeur que nous case sur.

Je pense que c'est la seule différence d'exécution entre le strict data y newtype . Il existe quelques différences statiques, telles que certaines extensions GHC qui n'affectent que les fichiers newtype , Coercible etc., mais au moment de l'exécution, les deux types sont isomorphes (mais le filtrage fonctionne différemment, comme indiqué ci-dessus).

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