haskell - 我如何在haskell中实现[x if func(x,lst) for x in list]?
问题描述
好的,所以我来自 python 背景,并且是 haskell 的新手并正在做作业。我已经完成了问题本身,但我的逻辑/代码看起来很丑,想知道改进它的方法。我想要做的是以该列表作为参数迭代一个列表以调用另一个函数。
假设我想在haskell中实现以下目标。
input = [1,2,2,3,3,4,5]
output = [1,4,5] #occurs Once
所以我想从x->y
通常我会怎么做
def checksOnce(input):
lst = []
for val in input:
if occursOnce(val,input):
lst.append(val)
print(lst)
我如何在haskell中进行迭代?我有一个函数可以很好地用于发生事件,它接受一个值和列表并返回一个布尔值,就像 python 一样。
checksOnce :: [Int] -> [Int] -> [Int]
checksOnce [] lst = []
checksOnce (x:xs) lst
| occursOnce x lst = [x] ++ checksOnce xs lst
| otherwise = checksOnce xs lst
和类似mainFunc lst = checksOnce lst lst
调用上述函数的东西。
以上工作正常,就我的硬件而言就足够了,但是传递相同的参数一次是多余的!我如何像上面的python代码那样只使用一个列表checksOnce :: [Int] -> [Int] -> [Int]
来checksOnce :: [Int] -> [Int]
迭代而不是将同一个列表传递给函数?
谢谢
解决方案
Haskell 有列表推导,所以你可以这样做:
\f xs -> [x | x <- xs, f x xs]
您也可以使用过滤器执行此操作:
\f xs -> filter (\x -> f x xs) xs
推荐阅读
- python-3.x - 选择最高值列
- macos - 如何在终端中更改文件头
- raspberry-pi3 - Adafruit LPD8806m LED灯条防水吗?
- database - 为什么 Liquibase generateChangeLog 会生成一个空的 changelog 文件?
- javascript - 如何将外部 js 文件添加到我的布局页面
- javascript - 使用 Cloudflare Workers 将图像发送到 Telegram
- java - 如何成功导入包含所有依赖项的 AndroidX 包?
- c# - 无法使用 WordPressPCL 和 wp-api-jwt-auth 对 Linux 中托管在 Azure 中的 WordPress 进行身份验证
- performance - 了解 WebPageTest 瀑布
- python - 具有三向决胜局的 Python 高效排序算法