Haskell 重复作为一个Hylomorphism
所以我一直在尝试将这个Haskell函数转换成一个Hylomorphism,它检查一个列表是否没有任何重复,但它有点奇怪Haskell 重复作为一个Hylomorphism,haskell,recursion-schemes,catamorphism,anamorphism,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那么,hylomoprhism是一个函数h:a→可以定义为变构(g和p)和退化(C和p)⊕) 部分 变形部分由一个函数
valid :: [a] -> Bool
valid [] = True
valid (h:t) = if (not (elem h t)) then valid t else False
如果有人能帮忙,我会很高兴的!Thx那么,hylomoprhism是一个函数h:a→可以定义为变构(g和p)和退化(C和p)⊕) 部分
变形部分由一个函数g:a→B×a组成,该函数将对象“展开”为更小的部分,而p:a→Bool是一个谓词,用于确定是否已完成展开
反同构部分由一个值c∈c和一个算子组成⊕ : B×C→C
(此文本是对
在您的例子中,展开意味着我们以某种值(类型B)展开一个列表,以及一个递归部分,即列表的尾部
谓词p可以从您的定义中派生出来:如果列表为空,那么我们已经终止。很明显,在这种情况下,我们返回True
,因此这意味着c是True
那么B部分是什么呢?如果我们看一下你的函数,我们需要访问列表的头和尾,所以B可以被看作是一个包含头(作为第一个元素)和尾(作为第二个元素)的2元组
那么现在剩下的问题是什么⊕ 是吗?它接受一个类型为E×[E](伪Haskell表示法)的二元组和一个布尔值(类型C是Bool
)作为输入。我们可以看到,它检查头部是否是尾部的en元素。如果是这种情况,它返回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
是一个基于定义的straighforward实现,我们将函数p
、c
、plus
和g
视为“构建块”。这有什么奇怪的?我的想法是检查头是否在尾,比如aux(a,t)=>检查a是否出现在t中,但当我尝试这样做时,显然我正在构建布尔值列表。如果你错了,函数会按照你说的那样执行。