パッケージの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
runIdentityK
Proxy p => p k v k v IO r
readMVar
IO