【发布时间】:2014-04-26 01:11:40
【问题描述】:
我在 Python 之后学习 Haskell,我认为创建一个函数来查找一个序列中不在另一个序列中的所有项目(其中两个序列都有可以比较的元素)将是一个有趣的练习。我很容易在 Python 中为此编写了一些代码:
def inverse(seq, domain):
ss = iter(seq)
dd = iter(domain)
while True:
s = next(ss)
while True:
d = next(dd)
if d != s:
yield d
if d >= s:
break
(seq 和 domain 均已排序)
但是,我很难将这段代码转换为 Haskell。我想我只会使用列表(可能是无限的)而不是ss 和dd,我想我会使用s = next(ss) 与s = head ss 和ss = tail ss 相同,但我可以'不知道如何将其翻译成 Haskell。我也无法弄清楚如何处理两个 while 循环。我想我可以使用无限递归,但由于有两个循环,我不知道是否需要两个函数或什么。
【问题讨论】:
-
filter (not . (`elem` domain)) seq。或者用简单的英语:filterout all that isnotelement ofdomain -
我不太确定您的 python 代码是否符合您的想法。这不仅仅是两个列表的区别。顺便说一句,您可以在 Haskell 中使用
Data.List.(\\)进行计算 -
您可以使用
pipes获得类似协程的行为。您可以使用Foldable.toList获得类似iter的行为。
标签: python haskell code-translation