Question

Existe-t-il un moyen de " soulever " une instance de classe en Haskell facilement?

J'ai souvent eu besoin de créer, par exemple, des occurrences Num pour certaines classes simplement "en train de" lever ". la structure Num à travers le constructeur de type comme ceci:

data SomeType a = SomeCons a

instance (Num a)=>Num SomeCons a where
    (SomeCons x) + (SomeCons y) = SomeCons (x+y)
    negate (SomeCons x) = SomeCons (negate x)
    -- similarly for other functions.

Existe-t-il un moyen d'éviter ce type de passe-partout et "d'ascenseur"? cette structure de Num automatiquement? Je dois généralement faire cela avec Show et d’autres classes également lorsque j’essayais d’apprendre le existentiel et que le compilateur ne me permettait pas d’utiliser deriving (Show) .

Était-ce utile?

La solution

L'extension dérivée généralisée newtype correspond à ce que vous voulez ici:

{-# LANGUAGE GeneralizedNewtypeDeriving #-}

module Main where

newtype SomeType a = SomeCons a deriving (Num, Show, Eq)

main = do
  let a = SomeCons 2
      b = SomeCons 3
  print $ a + b

Sortie:

*Main> main
SomeCons 5

Autres conseils

GHC met en œuvre ce que vous souhaitez: extensions du produit dérivé mécanisme . Ces modifications sont souvent montrées pour l’extension future du langage standard (voir wiki de haskell )

Pour activer cette extension, vous devez utiliser le pragma suivant

{-# GeneralizedNewtypeDeriving #-}

puis utilisez un dérivé sur votre déclaration newtype, comme d'habitude

data SomeType a = SomeCons a deriving (Num)

GeneralizedNewtypeDeriving

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top