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
可以自动导出的东西,而不是我必须为每个代数数据类型编写的东西.
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
,所以这不会真正起作用。