2017-04-06 1 views
0

Als Lernübung, ich versuche, eine newtype zu definieren als Inhaber von Funktionen zu dienen, die Show -able Werte Eff ects umwandeln kann, das heißt:Unifying Satzart

newtype ShEff a = ShEff (forall eff. Show a => a -> Eff eff Unit) 

Dies ist jedoch:

f :: forall a. ShEff a 
f = ShEff logShow 

nicht mit diesem Fehler kompilieren:

Could not match type 

    (console :: CONSOLE 
    | t2 
    ) 

    with type 

    eff1 


while trying to match type Eff 
          (console :: CONSOLE 
          | t2 
          ) 
    with type Eff eff1 
while checking that expression logShow 
    has type t0 -> Eff eff1 Unit 
in value declaration f 

können Sie mir zeigen im Rigg Richtung?

Antwort

1

Die Art der logShow ist

forall eff. Show a => a -> Eff (console :: CONSOLE | eff) Unit 

so können Sie es nicht speichern innerhalb ShEff, denn das ist für arbeiten muss jedereff und logShow funktioniert nur für die Zeilen mit dem CONSOLE Wirkung.

Sie haben zwei Möglichkeiten:

  1. Bewegen Sie den eff Typ Argument außerhalb ShEff:

    newtype ShEff eff a = ShEff (a -> Eff eff Unit) 
    
    f :: forall a eff. Show a => ShEff (console :: CONSOLE | eff) a 
    f = ShEff logShow 
    
  2. Fügen Sie die Einschränkung innerhalb ShEff:

    newtype ShEff a = ShEff (forall eff. a -> Eff (console :: CONSOLE | eff) Unit) 
    
    f :: forall a eff. Show a => ShEff a 
    f = ShEff logShow 
    

Beachten Sie auch, dass ich in beiden Fällen die Show a Einschränkung außerhalb ShEff verschoben habe.

+0

Ok, ich hatte das dann rückwärts, danke. –

Verwandte Themen