你能在Haskell的类型级别进行模式匹配吗?

Nat*_*ell 6 haskell types algebraic-data-types

基本上,我想要的是一个函数,它接受一个函数类型(a - > b - > c - > ...),并返回该函数类型的所有右子集类型的列表,例如,让我们调用这个功能f:

x = f (a -> b -> c)

x
> [a -> b -> c, b -> c, c]
Run Code Online (Sandbox Code Playgroud)

这应该适用于多态类型,如我的示例,以及具体的函数类型.

如果您可以在类型级别上使用函数类型进行模式匹配,那么这将是相对简单的:

g (x -> xs) = xs
g (x) = x
Run Code Online (Sandbox Code Playgroud)

用作上面构造f的效用函数,并且函数类型上的模式匹配类似于在列表上进行模式匹配.

Dav*_*vid 15

封闭式家庭是您正在寻找的:

{-# LANGUAGE TypeFamilies #-}
type family F a where
    F (x -> xs) = xs
    F x         = x
Run Code Online (Sandbox Code Playgroud)

要完全回答您的问题,我们还需要DataKinds来获取类型级别列表:

{-# LANGUAGE TypeFamilies, TypeOperators, DataKinds #-}

type family F a :: [*] where
    F (x -> xs) = (x -> xs) ': (F xs)
    F x         = '[x]
Run Code Online (Sandbox Code Playgroud)

单引号表示我们在类型级别使用那些(列表)构造函数.

我们可以看到这给出了:kind!GHCi中命令的预期结果

?> :kind! F (Int -> Float -> Double)
F (Int -> Float -> Double) :: [*]
= '[Int -> Float -> Double, Float -> Double, Double]
Run Code Online (Sandbox Code Playgroud)

请注意,返回类型F[*].这意味着为了使用这些结果,您需要以某种方式从列表中提取它们.唯一有类型有人居住的是*(嗯,和#).

未加标点的类型

关于完整的上下文:您可以通过Elem使用类型级别(==)(||)来自Data.Type.EqualityData.Type.Bool分别创建类型系列来创建类似无标记和类型的内容.