我在我的程序中编译了以下代码:
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeFamilies #-}
class (Show (Data a)) => HasData (a :: *) where
type Data a :: *
data Foo :: * -> * where
Foo :: (HasData a) => String -> Data a -> Int -> Foo a -- bunch of args
deriving instance Show (Foo a)
由于构造函数的参数数量Foo
可能很多,我想使用记录语法编写代码,但我不知道如何使用 GADT 语法来做到这一点(GHC 不推荐使用数据类型上下文,所以我试图避免它们) :
data Foo :: * -> * where
Foo {
getStr :: String,
getData :: Data a, -- want (HasData a)
getInt :: Int
} :: Foo a -- want (HasData a)
我需要像上面那样在没有记录语法的情况下限制a
in的构造函数。Foo
我怎样才能做到这一点?