使用Nat(单例库)的代数数据类型

时间:2018-02-13 21:46:47

标签: haskell gadt singleton-type

我一直在尝试使用单例库声明代数数据类型在类型级别上运行。如果我不在构造函数NatSymbolIntegerString中使用,我可以毫不费力地做到这一点。例如:

{-# LANGUAGE GADTs                #-}
{-# LANGUAGE ScopedTypeVariables  #-}
{-# LANGUAGE TemplateHaskell      #-}
{-# LANGUAGE TypeFamilies         #-}
{-# LANGUAGE TypeInType           #-}

import           Data.Singletons
import           Data.Singletons.TH

$(singletons [d|
  data Dim where
    NS :: Dim -- no size
    D  :: Bool -> Dim
   deriving (Eq, Show)
  |])

main :: IO ()
main = do
  let b = case toSing (D True) of
            (SomeSing d) -> show $ fromSing d
  putStrLn b

但如果我为BoolNat更改Integer,则会失败。

如何定义代数数据类型以与在类型级别采用NatInteger的构造函数一起使用?

1 个答案:

答案 0 :(得分:1)

从README我收集到,由于Nat的特殊状态,这是不可能直接的,但它也链接到可能的解决方法(请参阅下面Github问题中的最后一条评论):将Nat包裹在某些内容中单身人士可以处理的数据类型。

https://github.com/goldfirere/singletons/issues/76