2012-01-26 21 views
6

Örnekleri türeten de RebindableSyntax uzantısından etkilenen rahatsız edici bir "özellik" var. Ben yazmak istiyorum örneği:Haskell - "türetilen" örnekleri için yeniden yazılabilir sözdizimini kapatmanın herhangi bir yolu?

{-# LANGUAGE RebindableSyntax #-} 
import qualified Prelude 
data Color = Red | Green | Blue | Periwinkle | Fuschia deriving (Prelude.Eq, Prelude.Ord) 

Bu hata ile çıkageldi "Değil kapsamında:` ifThenElse'".

+1

Yapmaya çalıştığınız şeyden emin değilsiniz, ancak tanımı RebindableSyntax olmadan başka bir dosyaya taşımanıza yardımcı olur mu? –

cevap

7

Bu bana karşı bir yanlışlık gibi görünüyor - deriving tümcede zaten yerleşik sihir dolu, bu yüzden rebound sözdizimini kullanarak türetilen örnekleri pratikte yararlı olacağından kuşkuluyum. Şimdi, deriving maddesini kendiniz de kendiniz de yeniden ispatlayabilir ve bunun yerine bir TH ekini kullanabilirsiniz ... ama ben kazıyorum.

En basit ve en kolay çözümün farklı modüller kullanacağından şüpheleniyorum. Veri türü tanımını kendi modülüne koyun, oradaki Prelude işlevleri ile oradaki deriving maddesini kullanın ve sonra yeniden yazılabilir sözdizimini kullanarak modüldeki türü içe aktarın. Modüllerinizde daha fazla modülerliğe ihtiyacınız varsa, StandaloneDeriving'un da mevcut olduğunu unutmayın ve türleri tek bir modülde tanımlamanızı (RebindableSyntax etkinken), örnekleri başka bir modülde (RebindableSyntax olmadan) türetmenizi ve her ikisini de kullanan modüllerden almanızı sağlar. türü.

+0

Evet, bağımsız türetme, örnek gerektiren herhangi bir tanımdan önce gerçekleşmelidir, hayır? Eğer "Eq" örneğinin henüz içe aktarılmadığı durumlarda, "Renk" ... ve bazı "foo :: Renk -> Renk -> Bool", "foo c1 c2 = c1 == c2" verilerini yazamazsınız. – gatoatigrado