请注意以下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
的定义。
答案 0 :(得分:1)
单独通过deriving
定义这可能会有点痛苦。但是如果您知道算法,那么Generics
包可以让您编写它,然后您可以使用默认签名来“自动驱动”具有略微不同但仍然很好的语法的实例。
在这方面可能为您提供良好服务的两个图书馆是:https://hackage.haskell.org/package/generic-deriving和https://hackage.haskell.org/package/generics-sop