【发布时间】:2014-05-30 19:40:05
【问题描述】:
我想要一种简单的方法来创建带有自身标签的String。现在我可以
做类似的事情:
data TagString :: Symbol -> * where
Tag :: String -> TagString s
deriving Show
tag :: KnownSymbol s => Proxy s -> TagString s
tag s = Tag (symbolVal s)
并像使用它
tag (Proxy :: Proxy "blah")
但这并不好,因为
- 关于标签的保证仅由
tag提供,GADT 不提供。 - 每次我想创建一个值时,我都必须提供一个类型签名,它 如果该值是某个更大表达式的一部分,则会变得笨拙。
有什么办法可以改善这一点,最好是从相反的方向,即从String 到Symbol?我想写Tag "blah" 并让 ghc 推断类型
TagString "blah"。
GHC.TypeLits 提供了someSymbolVal 函数,看起来有点
相关但它产生SomeSymbol,而不是Symbol,我可以完全掌握如何使用
它。
【问题讨论】: