2015-10-28 67 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進行比較。