我无能地尝试使用 GHC 7.8 的新封闭类型系列功能,我想找到一种在类型级别构造上进行分支的好方法。
我有类似的东西
data (:::) :: Symbol -> * -> * where
data Result = Pre | Post | Match
type family Cmp a b :: Result where
Cmp (s ::: t) (s ::: t) = Match
Cmp (s1 ::: t1) (s2 ::: t2) = ???
Run Code Online (Sandbox Code Playgroud)
我想根据CmpSymbolGHC.TypeLits 中的结果返回不同的类型
。感觉就像
Cmp (s1 ::: t1) (s2 ::: t2) = (CmpSymbol s1 s2 ~ LT) => Pre
Cmp (s1 ::: t1) (s2 ::: t2) = (CmpSymbol s1 s2 ~ …Run Code Online (Sandbox Code Playgroud) 我想要一个简单的方法来创建一个String标记自己.现在我可以这样做:
data TagString :: Symbol -> * where
Tag :: String -> TagString s
deriving Show
tag :: KnownSymbol s => Proxy s -> TagString s
tag s = Tag (symbolVal s)
Run Code Online (Sandbox Code Playgroud)
并使用它
tag (Proxy :: Proxy "blah")
Run Code Online (Sandbox Code Playgroud)
但这并不好,因为
tag由GADT提供.有没有办法改善这一点,最好是朝着相反的方向,即从?String到Symbol?我想写,Tag "blah"并有ghc推断类型
TagString "blah".
GHC.TypeLits提供了someSymbolVal看起来有点相关的函数,但是它生成了SomeSymbola Symbol而不是a ,我可以完全掌握如何使用它.
我有以下运行良好的简化程序:
\n{-# LANGUAGE Rank2Types #-}\nmodule Temp where\n\nimport Control.Monad.ST\nimport Control.Monad\nimport Data.STRef\n\nmystery :: Int -> Int\nmystery start =\n let\n run :: ST s Int\n run = do\n count <- newSTRef (1::Int)\n loop count start\n readSTRef count\n in\n runST run\n\nloop :: STRef s Int -> Int -> ST s ()\nloop cnt n = when (n /= 1) \n (modifySTRef cnt succ >> \n if n `mod` 2 == 0 \n then loop cnt (n `div` 2) \n else loop cnt (n * …Run Code Online (Sandbox Code Playgroud) haskell existential-type type-signature type-variables scoped-type-variables