2010-05-24 7 views
3

J'apprends encore Haskell et j'ai besoin d'aide pour l'inférence de type s'il vous plaît!Signature de type "Peut-être un" n'aime pas "Juste [Événement]"

Utiliser des paquets SDL et Yampa je reçois la signature de type suivant de FRP.Yampa.reactimate:

(Bool -> IO (DTime, Maybe a)) 

et je veux l'utiliser pour:

myInput :: Bool -> IO (DTime, Maybe [SDL.Event]) 
myInput isBlocking = do 
    event <- SDL.pollEvent 
    return (1, Just [event]) 
... 
reactimate myInit myInput myOutput mySF 

mais il dit

 
Couldn't match expected type `()' 
     against inferred type `[SDL.Event]' 
    Expected type: IO (DTime, Maybe()) 
    Inferred type: IO (DTime, Maybe [SDL.Event]) 
In the second argument of `reactimate', namely `input' 
In the expression: reactimate initialize input output process 

Je pensais que Maybe a me permet d'utiliser n'importe quoi, veille n une liste SDL.Event? Pourquoi s'attend-il à Maybe() lorsque la signature de type est réellement ? Pourquoi veut-il un n-uplet vide, ou une fonction ne prenant pas d'arguments, ou que doit-on supposer être ()?

Répondre

8

Le type signature of reactimate complet est

IO a        -- # myInit 
-> (Bool -> IO (DTime, Maybe a)) -- # myInput 
-> (Bool -> b -> IO Bool)   -- # myOutput 
-> SF a b       -- # mySF 
-> IO() 

Le même a et b doit correspondre, cela signifie que si votre myInput est de type Bool -> IO (DTime, Maybe [SDL.Event]), alors tous les autres doivent aussi être a[SDL.Event]. Par conséquent, pour faire correspondre les types, vous devez vous assurer

myInit :: IO [SDL.Event]  -- # **not** IO(). 
mySF :: SF [SDL.Event] b 

BTW, () est le unit type.

+0

Il est préférable de l'appeler * le type d'unité *, au moins dans ce contexte. – Martijn

Questions connexes