gpt4 book ai didi

haskell - 使用具有并发 MVar 的管道/代理

转载 作者:行者123 更新时间:2023-12-02 17:56:56 25 4
gpt4 key购买 nike

Control.Proxy pipes-3.1.0的教程包中,作者提供了这个功能:

cache :: (Proxy p, Ord key) => key -> p key val key val IO r
cache = runIdentityK (loop M.empty) where
loop _map key = case M.lookup key _map of
Nothing -> do
val <- request key
key2 <- respond val
loop (M.insert key val _map) key2
Just val -> do
lift $ putStrLn "Used cache!"
key2 <- respond val
loop _map key2

因为我想要并发应用程序缓存请求,所以我有以下数据类型

newtype Cache k v = Cache (MVar (M.Map k v))

现在我想要一个新的cache带有签名的函数

cache :: (Proxy p, Ord k) => Cache k v -> k -> p k v k v IO r
cache (Cache c) k = readMVar c >>= \m -> runIdentityK $ loop m k
where loop m key = case M.lookup key m of
Nothing -> do
val <- request key
respond val >>= loop (M.insert key val m)
Just val -> respond val >>= loop m

但是,自 readMVar 以来,这无法进行类型检查位于 IO单子(monad),和runIdentityK位于 Proxy p => p k v k v IO r单子(monad)。我当然可以举起readMVar进入这个代理 monad,因为它是 IO 上的变压器,但我找不到合适的组合器。

最佳答案

解决方案是一个简单的电梯。我以前曾想过使用它,但显然没有足够努力。这是我想要的缓存

的粗略的类型检查版本
cache = runIdentityK . loop
where loop (Cache c) key = lift (takeMVar c) >>= \m -> case M.lookup key m of
Nothing -> do
val <- request key
lift . putMVar c $ M.insert key val m
respond val >>= loop (Cache c)
Just val -> do
lift $ putMVar c m
respond val >>= loop (Cache c)

关于haskell - 使用具有并发 MVar 的管道/代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14731741/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com