2017-03-03 3 views
1

Betrachten Sie die folgenden:Explizit den Rückgabetyp einer Klassenmethode angeben?

class Test m a where 
    t :: Int -> m a 

instance Test [] Int where 
    t i = [i] 

instance Test Maybe Int where 
    t i | i == 0 = Nothing 
     | otherwise = Just i 

main = do 
    print $ t (22 :: Int) --Error! 

Dies wurde mit folgendem Fehler werfen:

Ambiguous type variables ‘m0’, ‘a0’ arising from a use of ‘print’ 
    prevents the constraint ‘(Show (m0 a0))’ from being solved. 

Dies ist auf die Tatsache zurückzuführen ist, der Compiler verwenden keine Möglichkeit, zu identifizieren, welche Instanz von m a hat. Wie kann ich dies explizit angeben?

Antwort

8

Beschriften der volle Aufruf t:

print (t 22 :: Maybe Int) 

oder t selbst mit Anmerkungen versehen

print $ (t :: Int -> Maybe Int) 22 

Als fortgeschritteneren Alternative, mit den richtigen Erweiterungen auf, kann man die Typebene Argumente explizit

geben
print $ t @Maybe @Int 22 

abhängig von der Klasse an ha Dies kann Sie davor bewahren, eine sehr lange Anmerkung einzugeben.

Verwandte Themen