具有类型变量的 Haskell 函数的模式匹配

Pattern matching on a Haskell function with type variable

在Haskell中,是否可以对具有外部类型变量而非内部类型变量的函数进行模式匹配?例如,在这里,funky 采用任何采用 Bar 的类型构造函数。虽然这适用于解构这两个案例,但我不确定如何在底部编写全局案例,理想情况下应该 return 解构的结果。我在 q 之前打了一个问号,因为这让我很困惑——我不确定如何解构最后一个模式匹配以获得 Bar。预先感谢您的帮助!

data Bar = Bar
data Foo = AA Bar | BB Bar | CC Bar | DD Bar

funky :: x Bar -> Bar
funky (AA z) = z
funky (BB z) = z
funky (? q) = q

你不能对外部类型变量的函数进行模式匹配。要了解原因,让我们看看您的代码:

data Bar = Bar
data Foo = AA Bar | BB Bar | CC Bar | DD Bar

funky :: x Bar -> Bar

funky 的类型签名表明它采用 x Bar 类型的值,returns 采用 Bar 类型的值。重要的是,它可以为适当类型的 any 类型 x 执行此操作——这就是类型变量的含义。

现在,要查看此问题,请考虑以下类型:

data Ignore a = Ignored

也就是说,对于任何类型 a,只有一个类型 Ignore a 的值,并且该值是 Ignored.

所以使用这个类型,如果我们取x ~ Ignore,那么funky就变成了funky :: Ignore Bar -> Bar。这里的问题应该很明显了:Ignore Bar里面没有存储Bar类型的值!所以没有办法在 Ignore Bar 上进行模式匹配并得到 Bar。因此,通常没有办法编写一个函数 funky :: x Bar -> Bar 来做你想做的事。