Haskell创建我自己的过滤功能

时间:2015-10-28 19:20:55

标签: haskell functional-programming

我是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))

3 个答案:

答案 0 :(得分:1)

这是一个好方法:

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

您也可以使用

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

答案 1 :(得分:0)

一种简单的方法是使用每个手动滚动函数作为保护谓词来运行列表两次:

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

注意:您的问题要求提供列表列表,但您的模式匹配segregate [] = ([],[])表示您想要一个元组,因此我提供了一个元组解决方案。

答案 2 :(得分:0)

如果您真的需要这样的功能而不是为了教育目的而编写它,partition中有Data.List,那么简单

import Data.List(partition) 

让你去。

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