小编mon*_*ell的帖子

封闭类型家族内的模式匹配

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

haskell type-families

5
推荐指数
1
解决办法
372
查看次数

用相应的符号标记字符串

我想要一个简单的方法来创建一个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提供.
  • 每次我想创建一个值时,我都必须提供一个类型签名,如果值是某个更大表达式的一部分,它将变得难以处理.

有没有办法改善这一点,最好是朝着相反的方向,即从?StringSymbol?我想写,Tag "blah"并有ghc推断类型 TagString "blah".

GHC.TypeLits提供了someSymbolVal看起来有点相关的函数,但是它生成了SomeSymbola Symbol而不是a ,我可以完全掌握如何使用它.

haskell types gadt

4
推荐指数
1
解决办法
409
查看次数

为什么我不能为本地 let 绑定 ST 操作提供显式类型签名

我有以下运行良好的简化程序:

\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

2
推荐指数
1
解决办法
130
查看次数