我一直在尝试使用单例库声明代数数据类型在类型级别上运行。如果我不在构造函数Nat
,Symbol
,Integer
或String
中使用,我可以毫不费力地做到这一点。例如:
{-# 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
但如果我为Bool
或Nat
更改Integer
,则会失败。
如何定义代数数据类型以与在类型级别采用Nat
或Integer
的构造函数一起使用?
答案 0 :(得分:1)
从README我收集到,由于Nat
的特殊状态,这是不可能直接的,但它也链接到可能的解决方法(请参阅下面Github问题中的最后一条评论):将Nat包裹在某些内容中单身人士可以处理的数据类型。