我尝试使用STStrMap purescript模块来维护长时间运行的服务器应用程序的映射。它是一个非常简单的String map。以下是我到目前为止的情况:
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
MyMap
的签名是Eff
,但是poke期望STStrMap
作为第一个参数。我不确定如何正确编码。注意:我是purescript的新手。
答案 0 :(得分:1)
初始化的STStrMap具有Eff monad跟踪的副作用,因此我们必须使用它的bind实例来运行我们的计算(例如peek,poke),其类型为:
forall e a b. Eff e a -> (a -> Eff e b) -> Eff e b
在psci中你可以看到它是如何工作的:
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
所以你的代码变成了:
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