【发布时间】:2016-01-28 17:48:11
【问题描述】:
我是 haskell 的新手,我正在尝试创建一个函数,该函数将获取整数列表并返回包含两个子列表的列表,第一个子列表包含偶数,另一个包含奇数。我不能使用偶数、奇数或过滤函数。我创建了自己的函数如下
myodd :: Integer -> Bool
myodd n = rem (abs(n)) 2 == 1
myeven :: Integer -> Bool
myeven n = rem (abs(n)) 2 == 0
segregate [] = ([], [])
segregate [x] = ([x], [])
segregate (x:y:xs) = (x:xp, y:yp) where (xp, yp) = segregate xs
我在尝试使用前两个函数并将其用于隔离函数时遇到了麻烦。我在球拍方面有更多经验,我创建的功能如下所示:
(define (myeven? x)
(= (modulo x 2) 0))
(define (myodd? x)
(= (modulo x 2) 1))
(define (segregate xs)
(foldr (lambda (x b)
(if (myeven? x)
(list (cons x (first b)) (second b))
(list (first b) (cons x (second b))))) '(()()) xs))
【问题讨论】:
-
您的球拍代码没有意义。你测试过吗?
-
对我来说,看起来你的 Haskell 代码和你的 Racket 代码正在做两件非常不同的事情 - Racket 代码根据 value 是奇数还是奇数来划分输入列表偶数,而 Haskell 代码根据值的 index 是奇数还是偶数来划分输入列表(尽管代码中存在错误)。您实际上想要实现这两者中的哪一个?
-
@FrankSchmitt,Racket 代码实际上似乎并没有这样做。事实上,我很确定它也会抛出错误。
-
@dfeuer 这就是为什么我写了“尽管代码中有错误”——对我来说,看起来代码应该按照我的描述进行(我可能弄错了,当然)。
-
很抱歉我发布了错误的代码。我刚刚修复了 (define (myeven?x) (= (modulo x 2) 0)) (define (myodd?x) (= (modulo x 2) 1)) (define (segregate xs) (foldr (lambda (xb) (if (myeven?x) (list (cons x (first b)) (second b)) (list (first b) (cons x (second b))))) '(()()) xs))
标签: haskell functional-programming