我正在学习存在量化,幻像类型和GADT.如何使用幻像变量创建数据类型的异构列表?例如:
{-# LANGUAGE GADTs #-}
{-# LANGUAGE ExistentialQuantification #-}
data Toy a where
TBool :: Bool -> Toy Bool
TInt :: Int -> Toy Int
instance Show (Toy a) where
show (TBool b) = "TBool " ++ show b
show (TInt i) = "TInt " ++ show i
bools :: [Toy Bool]
bools = [TBool False, TBool True]
ints :: [Toy Int]
ints = map TInt [0..9]
Run Code Online (Sandbox Code Playgroud)
具有以下功能可以:
isBool :: Toy a -> Bool
isBool (TBool _) = True
isBool …Run Code Online (Sandbox Code Playgroud) 我不熟悉GHC内部,但我有几个关于ConstraintKinds的问题.
它从那GHC.Exts说起
data Constraint :: BOX
Run Code Online (Sandbox Code Playgroud)
这是Constraint一种误导,因为它是一种排序BOX.这给我们带来了第一个问题:我们可以进口和出口种类吗?这是如何运作的?
如果我完全离开,请在下一部分纠正我.从尝试不同的进口和对hackage源扫视四周,我的猜测是,GHC.Exts进口Constraint从GHC.Base,谁反过来,进口它GHC.Prim.但是我没看到它的定义在GHC.Prim哪里?
通过阅读lambda 立方体和此线程的维基百科条目,当应用于 Haskell 时,我的理解是
\n\n如果我上面列出的示例有误,请纠正我。引用维基百科的那篇文章:
\n\n\n\n\n\n
\n- 术语取决于类型或多态性。系统 F,又名二阶 lambda 演算(图中写为 \xce\xbb2),是通过仅施加此属性获得的。
\n
我不知道 Haskell 如何适应上面的(2)。Haskell 在术语和类型以及类型擦除之间有很强的区别,因此 OOP 中没有反射的东西,例如typeof(a)或b.GetType(),然后在运行时根据类型信息返回一些值。
所以我在 Haskell 中唯一能想到的与 (2) 有关的可能是
\n\nmemptyin 中的返回类型多态性Data.Monoid,其中值取决于实例类型那是正确的吗?虽然我觉得我没有建立所有联系......
\n\n说特设多态性满足 (2) 而参数多态性满足 (3) 是否正确?但是,临时与参数与类型与数据系列的 RHS 差异有何关系? …