确保haskell类型A包含类型B的成员

toh*_*ava 7 generics haskell typeclass strong-typing uniplate

我们来看看以下代码:

transformBi (++"asdasd") [1,2,3,4]
Run Code Online (Sandbox Code Playgroud)

显然,这段代码什么都不做,但它仍然编译得很好.我想创建一个新版本的transformBi,如果编译器可以通过类型证明它是无操作,则不会编译.理想情况下,这可以通过调用的类型类来完成Contains,这样新的类型transformBi就可以了

transformBi :: (Biplate from to, Contains from to) => (to -> to) -> from -> from
Run Code Online (Sandbox Code Playgroud)

我们如何实施Contains

我正在寻找一个Contains可以自动导出的东西,而不是我必须为每个代数数据类型编写的东西.

Joh*_*n L 0

Contains可以是空类型类,因为它没有方法。您只提供您需要的实例。例如,在这种情况下,如果您只有

class Contains from to

instance Contains [a] a
Run Code Online (Sandbox Code Playgroud)

您的示例代码将无法编译,因为没有任何匹配的instance Contains [Int] String.

如果您打算广泛使用Contains,则可以将定义更改为class Biplate from to => Contains from to,然后只需要指定Contains约束。

请注意,如果您有大量嵌套类型,则可能需要编写大量Contains实例。

我希望您可以简单地省略Biplate实例,而不是添加这个额外的类,但是看起来有一个相当广泛的类instance (Data a, Data b, Uniplate b, Typeable a, Typeable b) => Biplate a b,所以这不会真正起作用。