对于我在哈斯克尔的第一次演讲,我们给出了一系列问题。其中之一是在列表中存在n个数字时返回True,否则返回False。我设法得到了我认为在那里的一半,但是得到了不同的编译错误,并且非常沮丧,因为我甚至可以理解它们的意思。Haskell:写一个函数来复制``ellem'
到目前为止,我已经做了以下
// No problem with this function
matches :: Int -> [Int] -> [Int] // This function is to return the matches
matches x y = [a | a <-y, a==x] // ie. main> 1 [1,3,5,7,1,4] outputs [1,1]
// Here am stuck
myelem :: Int -> [Int] -> Bool
myelem x [] = False
myelem x (y:ys)
| x == y = y : x myelem ys // Am not sure about recursion as
// we have not yet covered
显然,这是一类,所以请不要发布答案。但也许有一些例子可以帮助我推理Haskell的运作以及如何解决这个问题。任何指针都将被大量赞赏。
SOLUTION
matches :: Int -> [Int] -> [Int]
matches x y = [a | a <-y, a==x]
myelem :: Int -> [Int] -> Bool
myelem x [] = False
myelem x (y:ys)
| x == y = True
| otherwise = myelem x (ys)
干杯家伙
@pelotom,@Jeremiah Willcock,@ 9000:非常感谢这么多人,我只是觉得把我的推理从强制性转变为陈述性是非常具有挑战性的。只是为了澄清;当`myelem x(ys)`被执行时,它实际上是否从列表中删除了元素直到为空,还是仅仅评估列表上剩余的元素,直到没有剩下的元素为止? – Carlos 2011-02-19 03:13:17