在purescript

时间:2016-08-07 00:29:29

标签: purescript

我尝试使用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的新手。

1 个答案:

答案 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