用的Haskell 98个decls,整个datatype必须为newtype
或data
。 但是,数据的家庭可以拥有的混合newtype instance
, data instance
。 这是否意味着是newtype
是数据的构造,而不是数据类型的属性? 难道还有一个Haskell的东西,如:
data Foo a = MkFoo1 Int a
| MkFoo2 Bool a
| newtype MkFoo3 a
我知道我不能写以下,但为什么/什么不顺心?:
data family Bar a
newtype instance Bar (Maybe Int) = MkBar1 (Maybe Int)
-- MkBar1 :: (Maybe Int) -> Bar (Maybe Int), see below
newtype instance Bar [Char] = MkBar2 [Char]
data instance Bar [Bool] where
MkBar3 :: Int -> Bool -> Bar [Bool]
-- can't be a newtype because of the existential Int
-- we're OK up to here mixing newtypes and data/GADT
data instance Bar [a] where
MkBar4 :: Num a => a -> Bar [a]
-- can't be a newtype because of the Num a =>
我不能写,因为实例头Bar [a]
重叠的两个头的MkBar2, MkBar3
。 然后,我可以通过移动这两个构造decls内修复where ...
对Bar [a]
但随后MkBar2
成为GADT(因为它的结果类型不是Bar [a]
所以不能是newtype
。
然后就是作为一个newtype
结果类型的属性,而不是构造的? 但考虑推断NEWTYPE实例的类型MkBar1
以上。 我不能写一个顶级newtype
与同类型
newtype Baz a where
MkBaz :: (Maybe Int) -> Baz (Maybe Int)
-- Error: A newtype constructor must have a return type of form T a1 ... an
咦? MkBar1
是NEWTYPE构造类型为的不是形式。
如果可能的话,请不用潜水解释到角色的谈话:我试图理解他们; 它只是让我头疼。 讲起这些构造函数构造和模式匹配的条款。
你可以把数据家庭为更强的版本(射和开)型家庭。 正如你可以看到从这个问题我问过了一段时间后 ,数据的家庭几乎可以用射型家庭伪造。
这是否意味着是NEWTYPE是数据的构造,而不是数据类型的属性? 难道还有一个Haskell的东西,如:
data Foo a = MkFoo1 Int a | MkFoo2 Bool a | newtype MkFoo3 a
号作为一个newtype
是明确的类型构造的属性,而不是数据构造。 数据家人,很喜欢一个类型的家庭,有一个类型构造函数的两个层次:
- 类型构造
data/type family FamTyCon a
- 的类型构造的实例的
data/type instance FamInstTyCon a = ...
相同的不同实例data/type
的家庭构造仍然有着根本的不同类型-它们发生在一种类型的构造函数来统一(这类型构造将是射和生成-看到更多关于该链接的问题)。
由式家庭的比喻,你不会想到会能够匹配的类型的东西TyFam a
,对不对? 因为你可以有type instance TyFam Int = Bool
和type instance TyFam () = Int
,你就不能静态地知道,如果你正在寻找在Bool
或Int
!
这是等价的:
newtype NT a b = MkNT (Int, b)
data family DF a b
newtype instance DF a b = MkDF (Int, b)
-- inferred MkNT :: (Int, b) -> NT a b
-- MkDF :: (Int, b) -> DF a b
此外,你不能宣布家庭中的任何其他实例/构造DF
,是因为它们的实例首长将重叠DF ab
。
在Q重新独立NEWTYPE错误消息Baz
误导
-- Error: A newtype constructor must have a return type of form T a1 ... an
(可能从之前有数据家属日期)。 一个NEWTYPE构造函数必须有一个返回类型完全一样的情况下头(如果它使用GADT语法模阿尔法重命名)。 对于独立NEWTYPE“例如头”是指newtype
头。
对于非NEWTYPE数据的情况下,不同的构造函数可能有返回类型严格大于例如,头更具体的(这使得他们GADTs)。
(在数据/ NEWTYPE例如头部声明的类型在不同的文献称为“类型的方案”,“单一型” - 因为没有约束,“免费功能型” - 在2008年的论文“用型开放式功能检查“)是,所有的构造的主要类型”返回类型必须统一。 (有可能不是用正是返回类型的任何构造函数。)
如果您的实例是newtype
,规则更严格:只能有一个构造函数,它的返回类型必须是完全的主要类型。 因此,要回答原来的q
这是否意味着是newtype
是数据的构造,而不是数据类型的属性? ......可是......然后是一个newtype
结果类型的属性,而不是构造的?
不,不是的构造; 是更像结果:作为一个NEWTYPE是一个数据族实例/其主要类型的属性。 这只是对于独立newtypes,有可能实际上只有一个实例,其主要类型是类型构造最普遍的类型。 Derivatively,我们可以说NEWTYPE的主要类型/返回类型唯一标识数据构造。 这是类型安全是至关重要的,因为这种类型的股票价值及其与NEWTYPE的数据构造函数中的类型,即没有包装的表示 - 如@ AlexisKing的评论指出。 然后,模式匹配不需要去寻找构造:比赛是无可辩驳/构造函数是虚拟的。
这让我感到更精确的输入/更好的文档的利益,你可能要声明一个NEWTYPE的数据与家庭只有一个实例,他的头比你必须把一个独立的NEWTYPE更具体。