2016-08-07 14 views
1

Ich versuche, die STStrMap Purescript-Modul verwenden, um eine Karte für eine lange laufende Server-Anwendung zu verwalten. Es ist eine sehr einfache String-Map. Hier ist, was ich bisher:Einfachste Verwendung von STStrMap.poke in Purescript

import Data.StrMap.ST (new, STStrMap, poke) 
import Control.Monad.ST (ST, runST) 

type MyMap = forall h e. Eff (st :: ST h | e) (STStrMap h String) 

myMap :: MyMap 
myMap = new 

-- pokeAString :: String -> String -> MyMap ?? 
pokeAString k v = poke k v myMap 

Die Signatur von MyMap ist Eff, aber Poke erwartet einen STStrMap als ersten Parameter. Ich bin mir nicht sicher, wie ich das richtig schreiben soll. Hinweis: Ich bin ein Neuling für Purescript.

Antwort

1

Die STStrMap Sie initialisieren hat Nebenwirkungen durch die Eff Monade verfolgt, so müssen wir seine Instanz binden, um unsere Berechnungen (zB Peek, Poke) ausgeführt wird, was den Typ hat:

forall e a b. Eff e a -> (a -> Eff e b) -> Eff e b 

In GGB Sie können sehen, wie dies funktioniert:

import Prelude 
import Data.StrMap.ST 

let myMap = new 
let myPoke x = x >>= (\m -> poke m "key" "value") 
let myPeek x = x >>= (\m -> peek m "key") 
myPeek $ myPoke myMap 

So Ihr Code wird so etwas wie:

import Prelude 
import Data.StrMap.ST (new, STStrMap, poke) 
import Control.Monad.ST (ST) 
import Control.Monad.Eff (Eff) 

type MyMap = forall h e. Eff (st :: ST h | e) (STStrMap h String) 

myMap :: MyMap 
myMap = new 

pokeAString :: String -> String -> MyMap 
pokeAString k v = do 
    a <- myMap 
    poke a k v