2012-01-12 95 views
0

我試圖找出解決方案的Problem 27的99個Haskell問題。
以下是我希望它是:總是從後衛返回true

group :: (Eq a) => [Int] -> [[a]] -> [[[[a]]]] 
    group []  _ = [] 
    group (i:is) xs 
    | sum (i:is) /= length xs = error "invalid arguments" 
    | otherwise    = ... 

從鏈接的示例:

組[2,2,5] [ 「醛」, 「拍」, 「卡拉」, 「david」,「evi」,「flip」,「gary」,「hugo」,「ida」]
[[[aldo「,」beat「],[」carla「,」david「],[」 EVI」, 「炫」, 「蓋瑞」, 「雨果」, 「伊達」]] ...] (共756解決方案)

因此,我想首先檢查磨片那麼Int列表的總和等於上面的長度String列表。我碰到的是,無論這兩個值是否相等,它都會打印出「無效參數」。我也試過這樣:

group (i:is) xs 
    | (sum (i:is) == length xs) = ... 
    | otherwise     = error "invalid arguments" 

仍然無法正常工作
任何想法?

更新:謝謝你們,我的粗心大意。下面是函數的遞歸部分:

group (i:is) xs 
    | (sum (i:is) == length xs) = filter (/= []) $ concatGroups (combinations i xs) (group is xs) 
    | otherwise     = error ("invalid arguments: " ++ show (sum(i:is)) ++ "/=" ++ show(length xs)) 

正如你所知道的,group is xs減少的總和,但不長所以它會總是會遞歸時抱怨。我想我會移除那個警衛,並希望用戶永遠不會犯錯。

+2

您的「組」函數是否遞歸?實際上,這是一個糟糕的名字:Data.List中存在另一個'group'函數。 – 2012-01-12 15:21:12

+5

你能否包含其餘的功能?您可能會在'...'部分的某處遞歸調用中打破不變。 – hammar 2012-01-12 15:28:38

+0

你大概要求至少有一個元素,即組[1] []。但是第二個列表的長度是多少?第一個的總和是多少? – Sarah 2012-01-12 15:56:48

回答

1

要擴大哈馬爾的角度來看,如果你改變你的代碼

group :: (Eq a) => [Int] -> [[a]] -> [[[[a]]]] 
group []  _ = [] 
group (i:is) xs 
    | sum (i:is) /= length xs = error ("invalid arguments to group: sum " 
            ++ show (i:is) ++ " /= " ++ show (length xs)) 
    | otherwise    = ... 

這將幫助您跟蹤什麼在...部分走錯了。

+0

thx,最後我知道一些調試技巧在Haskell – manuzhang 2012-01-13 00:50:16

+1

@manuzhang中,另請參見'Debug.Trace',非常有用。 – luqui 2012-01-13 05:54:01