【发布时间】:2015-12-24 22:20:32
【问题描述】:
我正在尝试使用 foldr 函数在 Haskell 中创建 elem 函数的新实现。
到目前为止,我有这个:
count :: Eq a => a -> [a] -> Integer
count x (y:ys) = foldl (\counter y -> if y == x then counter + 1 else counter) 0 ys
count _ [] = 0
elem' :: Eq a => a -> [a] -> Bool
elem' x (y:ys) = foldr (\i elem-> if (count x (y:ys)) > 0 then True else False) False ys
elem' _ [] = False
count 函数使用foldl 计算 x(我写的另一个函数)的出现次数。这适用于有限列表,但问题是我想利用无限列表的 foldr 惰性计算。如果我尝试使用无限列表作为输入,程序将永远挂起。
基本上,一旦我在列表中找到任何 x 实例并返回 true,我想“突破”,否则返回 false。
感谢您的帮助。
【问题讨论】:
-
是的,尝试使用
foldr而不是foldl。尽管计算一个无限的列表总是会挂起。我不知道你为什么要在你的elem实现中使用count? -
你在那个 lambda 中既没有使用
i也没有使用elem。那么,你折叠到底是为了什么?另外,如果你使用折叠,你不应该使用结构递归(带有模式匹配) -
试试
elem' x = foldr (\el elemInRest -> el == x || elemInRest) false -
@Bergi,它可能会在依赖类型设置中节省一些证明,使用归纳列表和惰性自然,但计算无限列表的元素意义不大。
-
@dfeuer:我知道有人会抓住“总是” :-) 是的,用懒惰的 Peano 数字它可能是适用的,无论如何在证明中是肯定的,但它没有意义OP。
标签: haskell functional-programming find element fold