2014-09-29 20 views
8

var mı, varsayılan bir birim türü var, yani(). Ben örneğin bir polimorfik biri (tercihen Hackage olarak) arıyorum: belkiHaskell'de varsayılan bir polimorfik birim türü

data PUT a = PUT 

veya polimorfik sıfır türü:

data PZT a = PZT (PZT a) 

Yani evet, bir tane kendim yazabilirim, her iki tarafından Yukarıdaki ifadeler. Korsanlıkta bir tane arıyorum.

ben onlardan biri kullanmayan bir işlev içerir birden tip parametreler ile bir sınıf var çünkü ihtiyacım nedeni: GHC olamaz, bu işlev "bir_işlev" kullanılırken

class MyClass a b where 
    someFunction :: a 
    -- and some other functions 

Ben bir_işlev çağırdığınızda

class MyClass a b where 
    someFunction :: (PUT b) -> a 

Şimdi, ilk argüman olarak (PUT :: sometype) kullanabilir ve Haskell demek hangi örneği türetebilirsiniz: sağ örneğini bulmak, bu yüzden benim tanımını değiştirdi. Bu numarayı her kullanmamda, yeni bir polimorfik birim türü yazdım (bu sadece bir kod satırı), bu da bana farklı kütüphaneleri birleştirirken biraz fazladan iş verir (çünkü tercihen her yerde aynı kurucuyu kullanırdım). Diğer insanların bu soruna karıştığından emin olabilirim, belki de biri hackage (ghc'nin paket yöneticisi) bir çözüm getirdi? Onu almak istiyorum. Yanlış şeyi mi araştırıyorum yoksa hackage'de yok mu?

+1

"Polimorfik sıfır tipi" ile karıştırıldım. Unutulmamaları dışında, Void'in olduğu gibi, ıssız bir tür anlamına gelmesini beklerdim. Ama PZT türünüzün bir değerini, p = PZT p' ile ifade edebilirim ve üzerinde kalıp eşleşmesi yapabilirim, ya PZT ile ne demek istediğimi yanlış anladım, ya da PZT'niz bir değil. Bir polimorfik Void'i daha basit bir şekilde kurabilirsiniz, elbette ki: “Veriler a'dan kaçın”. – amalloy

+0

Orada bir eğlenceye ihtiyacın yok mu? MPTC'ler için çıkarımda yardımcı olur. –

+1

Gerçekten böyle bir şeye ihtiyacınız yok. aşağıdakiler de çalışır: birFonksiyon :: (fb) 'class Sınıfım ab -> a' f hakkında hiçbir bilgi olmadığı için (o Uygulanabilir değil veya bir şey), o Not bu orada anlamı için bir yol yoktur Tam olarak ihtiyacım olan b'ye git. – Sebastiaan

cevap

20

Aradığınızı genellikle Proxy olarak adlandırıyorum. taban-4.7 olduğundan, bu, örneğin, Data.Proxy

Proxy daha uzun yana bir baz mevcuttur benzer bir şey kullanılabilir Const olan Const()'u kullanabilirsiniz.

+6

Ayrıca, "Proxy b -> a" olarak değil, "Proxy" - "a" (not büyük/küçük harf) olarak değil, "Proxy" nin türünü ifade etmek için kullanılan ortak deyim olduğuna dikkat edin. –

İlgili konular