什么是 Haskell 中的 GADT(广义代数数据类型)?

Like
Like Love Haha Wow Sad Angry
3612

先看看没有 GADT 的时候我们在做啥。最简单的,比如定义一个列表:

List a = Nil | Cons a (List a)

它是在做啥呢?

  • 先看等号左边,它首先定义了一个叫 List 的 type constructor,它接受一个类型,并返回一个新的类型。其实就是类型的函数。
  • 再看右边,它告诉我们有两种方式获得一个类型为 List a 的值,一个叫 Nil,一个叫 Cons a (List a)。
    • Nil 的话,你直接写 Nil,它就是一个 List a 类型的值,至于这个 a 具体是啥,需要结合上下文推导才知道。
    • 而 Cons a (List a) 呢,它是接受两个参数,一个类型是 a,一个类型是 List a,然后返回一个 List a 类型的值。至于这个 a 是啥,我们同样是需要推导才能知道的,不过是这里的推导比较显著罢了,因为直接就是第一个参数的类型。

那么我们可以用函数形式给这俩表示出来: Continue reading “什么是 Haskell 中的 GADT(广义代数数据类型)?”

Like
Like Love Haha Wow Sad Angry
3612