我无能地尝试使用 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