【发布时间】:2018-12-18 23:46:54
【问题描述】:
我想要一个类型类来表示 reified Data.Map.Map 中的成员身份。所以像:
class Reifies s (Map Text v) => IsMember (x :: Symbol) s where
value :: Proxy s -> Proxy x -> v
然后我想实现一个函数,只要存在符号,它就会返回此类的 Dict 实例:
checkMember :: forall s x v. (KnownSymbol x, Reifies s (Map Text v))
=> proxy x -> Maybe (Dict (IsMember x s))
checkMember sx =
let m = reflect (Proxy @s)
in (_ :: v -> Dict (IsMember x s)) <$> Map.lookup (symbolVal sx) m
我不介意使用unsafeCoerce 来实现checkMember,但即便如此,我仍然无法弄清楚如何执行此操作(填写类型漏洞)。
大概的序言:
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE UndecidableInstances #-}
import Data.Constraint(Dict(..))
import Data.Map (Map)
import qualified Data.Map as Map
import Data.Proxy (Proxy(..))
import Data.Reflection (Reifies, reflect)
import GHC.TypeLits (KnownSymbol, Symbol, symbolVal)
【问题讨论】:
标签: dictionary haskell reflection typeclass singleton-type