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,所以这不会真正起作用。
| 归档时间: |
|
| 查看次数: |
175 次 |
| 最近记录: |