【发布时间】:2014-04-22 13:13:29
【问题描述】:
我尝试连接两个列表,使得结果列表中的元素只出现一次。 我不想使用预定义的函数,因为那样太容易了。所以因为我正在学习haskell,所以我编写了以下代码:
import Data.List
add :: [Int] -> [Int] -> [Int]
add xs ys = zs ++ ws
where
zs = if elem x (x:xs) == True then x:(elem x xs)
else elem x xs
ws = if elem y (y:ys) == True then y:(elem y ys)
else elem y ys
我只使用预定义的函数 elem 告诉我一个元素是否出现在列表中。 我的想法是先获取一个列表并使用“elem”来确定列表 xs 的第一个元素 x 是否多次存在于列表中。如果是这样,那么我使用该 x 并使用 ":"-operator 和 (elem x xs) 建立一个新列表,直到检查所有元素。 我对第二个列表做同样的事情。 如果完成,那么我使用“++”- 运算符将无重复列表与 zs ++ ws 连接起来。所以当我编译它时,ghci 告诉我 x 和 y 不在范围内。我的错误在哪里?
【问题讨论】:
-
这里的情况很混乱。例如,
elem x xs的类型是Bool,所以表达式x:(elem x xs)没有任何意义。此外,x这个词突然出现——你还没有定义它是什么。 -
好吧,
x和y确实不在范围内,您在使用它们之前不要在任何地方定义它们。在您看来,x和y应该是什么?也许你的意思是你的模式匹配是add (x:xs) (y:ys)? -
我尝试用 elem x (x:xs) 表达,我检查列表 xs 的第一个元素是否在列表中出现多次。因此,x 和 y 应该是列表 xs 和 ys 的第一个元素。
-
不,
x和y是列表x:xs和y:ys的第一个元素。
标签: haskell