2009-11-29 24 views
13

Haskell'de bir sınıf örneğini kolayca "kaldırmak" için bir yol var mı?Haskell'de kaldırma sınıfı örneği

Sık sık, örneğin oluşturulmasına gerek ettik, böyle tür kurucusu içinden sadece "kaldırma" Num yapısı olan bazı sınıflar için Num örnekleri:

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. 

Bunu önlemek için bir yol var mı Bu Num yapısı otomatik olarak boilerplate ve "kaldır"? Ben genellikle mevcut olanları öğrenmek için çalışıyordum ve derleyici deriving(Show) kullanmama izin vermezken Show ve diğer sınıflar ile bunu yapmak zorundayım.

cevap

19

genelleştirilmiş newtype kaynaklanan uzatma burada istediğim şey:

{-# 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 

Çıktı:

*Main> main 
SomeCons 5 
+1

Hum ... Bu newtype ile değil verileri ile çalışır Neden? –

+3

Yeni bir tür herhangi bir kurucu veya alan ekleyemediğinden, yalnızca varolan bir türü siler. Bu, uzantının yalnızca herhangi bir veri türü için türetebileceğiniz sınıflar yerine herhangi bir sınıfla çalışabilmesini sağlar. – Martijn

5

GHC, ne istediğinizi uygular: Extensions to the deriving mecanism. Bu değişiklikler genellikle, (haskell' wiki görüldüğü gibi) gelecek standart dil uzatma

, aşağıdaki Pragma

{-# GeneralizedNewtypeDeriving #-} 

kullanmalıdır bu uzantıyı etkinleştirmek ve ardından newtype bildiriminde bir bundan türetilen kullanmak için için gösterilir Her zamanki

data SomeType a = SomeCons a deriving (Num) 
1

GeneralizedNewtypeDeriving