我有一个计算,我在其中将值插入Map
,然后再次查找它们。我知道我从来没有在插入密钥之前使用过密钥,但是(!)
无论如何随意使用都会使我感到紧张。我正在寻找一种获取总查询功能的方法,该方法不会返回Maybe
,并且类型系统可以防止我意外滥用。
我的第一个想法是制作一个类似于的monad转换器StateT
,其中状态为a Map
,并且在monad中有用于插入和查找的特殊功能。插入函数返回一个新类型Receipt s k
,其中s
是ST
monad 样式的幻像索引类型,并且k
是键的类型,而查找函数则使用a Receipt
而不是裸键。通过隐藏Receipt
构造函数并使用类似于的量化运行函数runST
,这应确保查找仅在插入同一映射后发生。(完整代码如下。)
但是我担心我已经重新发明了轮子,或者担心有另外一种获取安全的总地图查找的方法。在某个地方的公共包装中是否存在针对此问题的任何现有技术?
{-# LANGUAGE DeriveFunctor, LambdaCase, RankNTypes #-}
module KeyedStateT (KeyedStateT, Receipt, insert, lookup, receiptToKey, runKeyedStateT)
where
import Prelude hiding (lookup)
import Control.Arrow ((&&&))
import Control.Monad (ap, (>=>))
import Data.Map (Map)
import qualified Data.Map as Map
import Data.Maybe (fromJust)
newtype KeyedStateT s k v m a = KeyedStateT (Map k v -> …
Run Code Online (Sandbox Code Playgroud)