Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 假人的类型族_Haskell - Fatal编程技术网

Haskell 假人的类型族

Haskell 假人的类型族,haskell,Haskell,有人能举一个超级简单(几行)的例子来基本了解什么类型的族可以使用,它们是什么吗 类型族的2+2类型示例?以下是一个示例: {-# Language TypeFamilies, DataKinds, KindSignatures, GADTs, UndecidableInstances #-} data Nat = Z | S Nat type family Plus (x :: Nat) (y :: Nat) :: Nat where Plus 'Z y = y Plus ('S x

有人能举一个超级简单(几行)的例子来基本了解什么类型的族可以使用,它们是什么吗

类型族的2+2类型示例?

以下是一个示例:

{-# Language TypeFamilies, DataKinds, KindSignatures, GADTs, UndecidableInstances #-}

data Nat = Z | S Nat

type family Plus (x :: Nat) (y :: Nat) :: Nat where
  Plus 'Z y = y
  Plus ('S x) y = 'S (Plus x y)

data Vec :: Nat -> * -> * where
  Nil :: Vec 'Z a
  Cons :: a -> Vec n a -> Vec ('S n) a

append :: Vec m a -> Vec n a -> Vec (Plus m n) a
append Nil ys = ys
append (Cons x xs) ys = Cons x (append xs ys)
请注意,类型族的许多/最有趣的应用程序需要
不可判定实例
。你不应该害怕这个扩展


另一种有用的类型族是与类关联的类型族。作为一个真正做作的例子

class Box b where
  type Elem b :: *
  elem :: b -> Elem b
Box
的实例是一种可以从中提取某些内容的类型。比如说,

instance Box (Identity x) where
  type Elem (Identity x) = x
  elem = runIdentity

instance Box Char where
  type Elem Char = String
  elem c = [c]
现在
elem(Identity 3)=3
elem'x'=“x”

还可以使用类型族生成奇怪的skolem变量。这最好在尚未发布的GHC 8.0.1中完成,它看起来像

type family Any :: k where {}

Any
是一种特殊类型。它是无人居住的,不可能(特别地)是一个类的实例,而且它是多类的。事实证明,这在某些方面非常有用。此特定类型被宣传为
unsafectoerce
的安全目标,但
Data.Constraint.Forall
使用类似的类型族用于更有趣的目的。

不幸的是,类型族不适用于假人。即使是顶级GHC类型的系统开发人员Richard Eisenberg也发现有些方面有点难以确定。不过,我想我可以试着展示一些基本的东西。@dfeuer:幸运的是,掌握一些简单的例子和正确地把握事物的各个方面是有区别的。我不太明白这句话:
Plus('sx)y='s(plusxy)
@jhegedus,
是从数据构造函数
S
创建的类型构造函数。您可以省略
,但鼓励使用它。这一行基本上是说,
(1+x)+y=1+(x+y)
。那么对于类型族,我可以在类型级别上进行模式匹配和递归?提升模式匹配和递归到类型级别?那么类型族在类型级别上基本上是一个完全成熟的函数?@jhegedus,在某种程度上,是的。然而,模式匹配是通过类型统一来完成的,因此它并不总是像您所期望的那样工作。例如,您可以在左侧使用同一类型变量两次。更令人烦恼的是,有时候GHC不能将一个类型减少到足以匹配一个模式的程度,从而导致一些令人困惑的错误和更令人困惑的解决方法。例如,如果使用的是
Plus('sm)n=Plus m('sn)
,我在定义
append
时会遇到问题。啊,那么在第二个框示例中,
elem
的返回类型取决于实际实例?从这个意义上讲,我们再次使用类型族来定义类型级函数?现在该函数的域(elemb)是{Char,Identity a}。我想知道
elem
的类型是否应该是
b->elem b