-->

数据家庭情况:NEWTYPE,数据(data family instances: newtype,

2019-10-29 05:48发布

用的Haskell 98个decls,整个datatype必须为newtypedata 。 但是,数据的家庭可以拥有的混合newtype instancedata 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构造类型为的不是形式。

如果可能的话,请不用潜水解释到角色的谈话:我试图理解他们; 它只是让我头疼。 讲起这些构造函数构造和模式匹配的条款。

Answer 1:

你可以把数据家庭为更强的版本(射和开)型家庭。 正如你可以看到从这个问题我问过了一段时间后 ,数据的家庭几乎可以用射型家庭伪造。

这是否意味着是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 = Booltype instance TyFam () = Int ,你就不能静态地知道,如果你正在寻找在BoolInt



Answer 2:

这是等价的:

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更具体。



文章来源: data family instances: newtype, data