Haskell 获取子列表的单例实例
使用package,我们有一个SingI类和类型级别列表的实例:Haskell 获取子列表的单例实例,haskell,Haskell,使用package,我们有一个SingI类和类型级别列表的实例: instance SingI '[] instance forall a (n1 :: a) (n2 :: [a]). (SingI n1, SingI n2) => SingI (n1 : n2) 似乎对于列表有SingI约束,我们可以在某种程度上得到子列表的相同约束。所以我想找到一种方法 也就是说,我需要函数之类的东西 f1 :: Sing (ns :: [Symbol]) -> Proxy (xs :
instance SingI '[]
instance forall a (n1 :: a) (n2 :: [a]).
(SingI n1, SingI n2) => SingI (n1 : n2)
似乎对于列表有SingI约束,我们可以在某种程度上得到子列表的相同约束。所以我想找到一种方法
也就是说,我需要函数之类的东西
f1 :: Sing (ns :: [Symbol]) -> Proxy (xs :: [Symbol]) -> Sing (ns :\\ xs)
或
我必须用哪种方法才能做到这一点?什么是
:\\
和交叉?假设它们是归纳型族,则可以通过归纳编写任一函数。请注意,SingI
类实际上根本不应该包含在这里。此外,如果:\\
和Intersect
是由单例
定义的失效符号,它们几乎肯定已经有值级别变量,因此您不需要做任何事情。是的,它们是来自单例
的类型族。它们有价值级别的变体。但是我没有为第二个参数xs
唱。从另一方面来说,我理解并可以“用手”证明(:\\)
和相交
都给我子列表。我可以证明,如果列表也属于任何子列表的SingI
。但是我不知道如何告诉编译器以及如何为Sing(sublist)
获取这个值,我没有注意到第二个参数是Proxy
,而不是Sing
<代码>代理(xs::[Symbol])
不包含关于实际是哪个[Symbol]
的信息,因此无法执行此操作。换句话说,具有这些类型的函数是无人居住的。事实上,您可以从SingI(x:xs)
证明singixs
,但是您没有SingI
约束。您必须将类型更改为(SingI xs)=>…
。什么是:\\
和相交
?假设它们是归纳型族,则可以通过归纳编写任一函数。请注意,SingI
类实际上根本不应该包含在这里。此外,如果:\\
和Intersect
是由单例
定义的失效符号,它们几乎肯定已经有值级别变量,因此您不需要做任何事情。是的,它们是来自单例
的类型族。它们有价值级别的变体。但是我没有为第二个参数xs
唱。从另一方面来说,我理解并可以“用手”证明(:\\)
和相交
都给我子列表。我可以证明,如果列表也属于任何子列表的SingI
。但是我不知道如何告诉编译器以及如何为Sing(sublist)
获取这个值,我没有注意到第二个参数是Proxy
,而不是Sing
<代码>代理(xs::[Symbol])
不包含关于实际是哪个[Symbol]
的信息,因此无法执行此操作。换句话说,具有这些类型的函数是无人居住的。事实上,您可以从SingI(x:xs)
证明singixs
,但是您没有SingI
约束。您必须将类型更改为(SingI xs)=>…
。
f2 :: Sing (ns :: [Symbol]) -> Proxy (xs :: [Symbol]) -> Sing (Intersect ns xs)