重复作为一个Hylomorphism

时间:2018-06-13 18:08:29

标签: haskell recursion-schemes catamorphism anamorphism

所以我一直试图转换这个Haskell函数,检查列表是否没有任何重复进入Hylomorphism,但是有一些奇怪的事情。

valid :: [a] -> Bool
valid [] = True
valid (h:t) = if (not (elem h t)) then valid t else False  

如果有人能提供帮助,我会很高兴的! THX

1 个答案:

答案 0 :(得分:3)

hylomoprhism 是一个函数 h:A→C ,可以在anamoprhism中定义( g p < / em>)和catamorphism( c )部分。

变形部分由函数 g:A→B×A 组成,它将对象“展开”成更小的部分,而 p:A→Bool 是一个谓词确定我们是否完成了展开。

catamorphism 部分由值c∈C和运算符 consists组成:B×C→C

(此文字是Wikipedia page

的略微修改版本

在您的情况下,展开意味着我们展开了某个值的列表(类型为 B ,以及递归部分,即这里是列表的 tail

谓词 p 可以从您的定义中派生出来:如果列表为空,那么我们已经终止了。很明显,在这种情况下,我们会返回True,这意味着 c True

那么现在 B 部分是什么?好吧,如果我们查看您的函数,我们需要访问列表的 head tail ,因此 B 可以看作是2 -tuple包含头部(作为第一个元素)和一个尾部(作为第二个元素)。

所以现在剩下的问题是的作用了吗?它需要输入一个2元组的类型 E×[E] (伪Haskell表示法)和一个布尔值(类型 C ,它是Bool )。我们可以看到,它检查头部是否是尾部的元素。如果是这种情况,则返回False,并忽略递归部分,否则返回递归部分。

所以我们可以在Haskell中写这个:

-- types
type A e = [e]
type B e = (e, [e])
type C = Bool

-- functions
p :: A e -> Bool
p [] = True
p (_:_) = False

g :: A e -> (B e, A e)
g (h:t) = ((h, t), t)

c :: C
c = True

plus :: Eq e => B e -> C -> C
plus (h, t) r | elem h t = False
              | otherwise = r

hylo :: Eq e => A e -> C
hylo a | p a = c
       | otherwise = plus b (hylo a')
    where (b, a') = g a
因此,

hylo是基于定义的直接实现,因此我们将函数pcplusg作为“构建块” ”