是否可以为任意数据类型自动定义此函数?

时间:2014-05-09 06:45:01

标签: haskell

请注意以下fold函数的定义:

data T = A | B T | C T T
fold up2 up1 up0 down accum x   = dig x accum where
    dig (C a b) accum           = up2 C a b accum (dig a (down (C a b) accum)) (dig b (down (C a b) accum)) 
    dig (B a) accum             = up1 B a accum (dig a (down (B a) accum))
    dig A accum                 = up0 A accum

此函数作为一种非常规则的定义方式,但它取决于该类型的数据构造函数具有的递归分支的最大数量。也就是说,T有一个带有2个递归点C T T的构造函数,所以" fold"收到三个" up"参数。如果C T T不属于该类型,那么fold的定义将少一个参数:

data T = A | B T
fold up1 up0 down accum x = dig x accum where
    dig (B a) accum = up1 B a accum (dig a (down (B a) accum))
    dig A accum     = up0 A accum

我的问题是,是否可以使用fold自动创建deriving的定义。

1 个答案:

答案 0 :(得分:1)

单独通过deriving定义这可能会有点痛苦。但是如果您知道算法,那么Generics包可以让您编写它,然后您可以使用默认签名来“自动驱动”具有略微不同但仍然很好的语法的实例。

在这方面可能为您提供良好服务的两个图书馆是:https://hackage.haskell.org/package/generic-derivinghttps://hackage.haskell.org/package/generics-sop