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.Equality
和Data.Type.Bool
分别创建类型系列来创建类似无标记和类型的内容.