2014-09-29 12 views
8

w Haskell jest domyślny typ jednostki, a mianowicie(). Szukam jednego polimorficznego (najlepiej w Hackage), na przykład:Czy istnieje domyślny typ polimorficzny jednostki haskell

data PUT a = PUT 

czy może polimorficzny zerowy typ:

data PZT a = PZT (PZT a) 

Więc tak, mógłbym napisać sam, przez którąkolwiek powyższe stwierdzenia. Szukam jednego w hackage.

Powodem tego potrzebuję, to dlatego, że mam klasę z wielu parametrów typu, który zawiera funkcję, która nie korzysta z nich: W przypadku korzystania z tej funkcji „someFunction”

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

, GHC nie może znaleźć właściwą instancję, więc zmieniłem definicję:

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

teraz gdy zgłoszę someFunction, mogę użyć (PUT :: SomeType) jako pierwszy argument i Haskell może czerpać która instancja mi chodziło. Za każdym razem, gdy używam tej sztuczki, piszę nowy polimorficzny typ jednostki (to tylko jedna linia kodów), co daje mi trochę dodatkowej pracy przy łączeniu różnych bibliotek (ponieważ najlepiej, gdybym używał tego samego konstruktora wszędzie). Jestem pewien, że inne osoby wpadły na ten problem, więc może któryś z nich znalazł rozwiązanie w hackage'u (menadżer pakietów ghc)? Chciałbym to zaimportować. Czy szukam niewłaściwej rzeczy, czy też nie istnieje ona w hackage?

+1

Jestem zdezorientowany przez znaczenie "polimorficznego typu zerowego". Spodziewałbym się, że będzie to oznaczać typ niezamieszkały, z wyjątkiem nieokreślonego, jak w przypadku Voida. Ale mogę skonstruować wartość twojego typu PZT za pomocą 'let p = PZT p' i dopasować do niego wzór, więc albo źle rozumiem, co masz na myśli przez PZT, albo twoje PZT nie jest takie. Oczywiście można zbudować polimorficzną Pustkę: 'dane Unikaj' jest niezamieszkane. – amalloy

+0

Na pewno nie potrzebujesz funDep? Pomaga z wnioskami o MPTC. –

+1

Okazuje się, że tak naprawdę nie potrzebujesz takiego typu. Działa również: 'class MyClass ab gdzie someFunction :: (fb) -> a' Należy pamiętać, że ponieważ nie ma informacji o f (nie jest Applicative lub cokolwiek), oznacza to, że nie ma sposobu, aby dostać się do b, co jest dokładnie tym, czego potrzebowałem. – Sebastiaan

Odpowiedz

20

Myślę, że to, czego szukasz, jest zwykle nazywane Proxy. Ponieważ baza-4.7, dostępny jest w Data.Proxy

coś podobnego, który jest dostępny w bazie od więcej niż Proxy jest Const np możesz użyć Const().

+6

Należy również zwrócić uwagę na wspólny idiom wyrażania typu 'someFunction' nie jako' Proxy b -> a', ale jako 'proxy b -> a' (należy zwrócić uwagę na wielkie litery), aby nie wymagać samego" Proxy ". –

Powiązane problemy