Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 重复作为一个Hylomorphism_Haskell_Recursion Schemes_Catamorphism_Anamorphism - Fatal编程技术网

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)⊕) 部分 变形部分由一个函数

所以我一直在尝试将这个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)⊕) 部分

变形部分由一个函数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中,但当我尝试这样做时,显然我正在构建布尔值列表。如果你错了,函数会按照你说的那样执行。