【发布时间】:2020-01-28 08:40:10
【问题描述】:
为了准备在 Haskell 中的函数式编程考试,我正在重写递归函数以列出推导(不使用 map 和 filter 等高阶函数),这可能是考试中的一项任务。
我重构了我写的这个函数,作为一个练习的解决方案,它接受一个列表和一个元素,如果该元素尚未包含在列表中,则附加该元素
noDupsApp :: Eq a => [a] -> a -> [a]
noDupsApp [] y = [y]
noDupsApp [x] y = if x == y then [x] else [x,y]
noDupsApp (x:xs) y
| x == y = x:xs
| otherwise = [x] ++ noDupsApp xs y
到
noDupsAppComp :: Eq a => [a] -> a -> [a]
noDupsAppComp xs y
| [x | x <- xs, x /= y] == xs = xs ++ [y]
| otherwise = xs
据我所知,这似乎确实有效,但在考虑解决方案时,我问自己是否有办法在 Haskell 中“中断”/“返回”一个函数。如果有这样的选择,我可以在两个元素相同时立即中断,然后将生成的列表与“xs”进行比较,这将提高效率(如果包含“y”而不是最后)。类似问题的其他答案也建议使用条件,但这也会导致整个列表的迭代。
有没有办法打破列表推导式(或者用一个更简单的方法来编写这个函数,用一个列表comp,但不使用高阶函数)?
【问题讨论】:
-
你看过
elem吗?它检查一个元素是否在列表中。
标签: haskell