2015-10-28 36 views
0

我是一个新的哈斯克尔,我试图创建一个函数,将采取整数列表并返回一个列表包含两个子列表,第一个子列表包含偶数和其他包含奇数。我无法使用偶数,奇数或过滤器函数。我创建了我自己的函数如下哈斯克尔创建我自己的过滤功能

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)) 
+0

您的球拍代码没有意义。你测试过了吗? – dfeuer

+1

对我来说,它看起来像你的Haskell代码和你的球拍代码正在做两件完全不同的事情 - 球拍代码根据* value *是奇数还是偶数来划分输入列表,而Haskell代码根据该值的*索引*是奇数还是偶数(代码中的错误尽管)。你究竟想要实现哪两个? –

+0

@FrankSchmitt,球拍代码实际上并没有这样做。事实上,我很确定它也会抛出一个错误。 – dfeuer

回答

0

一个简单的方法是使用你的每一个手卷起到保护断言两次在列表中运行:

segregate :: [Integer] -> ([Integer], [Integer]) 
segregate [] = ([],[]) 
segregate xs = (evens, odds) 
    where evens = [x | x <- xs, myeven x] 
     odds = [x | x <- xs, myodd x] 

注意:你的问题要求列表的列表,但你的模式匹配segregate [] = ([],[])表明你想要一个元组,所以我给了一个元组解决方案。

+0

感谢您的回复。编译代码时遇到一些问题。它给出了一个编译错误如下:无法匹配预期类型'Bool' 与实际类型'Integer - > Bool' 可能的原因:'myodd'应用于太少的参数 在表达式中:myodd 在stmt列表理解:myodd –

+0

刚刚添加了一个修复程序。我太习惯scala的方式了...... –

1

这里有一个好办法:

segregate [] = ? 
segregate (x:xs) 
    | myEven x = ? 
    | otherwise = ? 
    where (restEvens, restOdds) = segregate xs 

你也可以使用

segregate = foldr go ([], []) where 
    go x ~(evens, odds) 
    | myEven x = ? 
    | otherwise = ? 
0

如果你真的需要这样的功能,而不是写它的教育目的,有partitionData.List,所以简单

import Data.List(partition) 

会让你走。

在教育案例中,您仍然可以将您的代码与代码partition进行比较。