2013-10-11 34 views
1

我有一個基本的問題,如果..後,我不能有多個功能,爲什麼?多個函數後,如果然後..,不工作在哈斯克爾

check [] _ _ = [] 
check (x:xs) limit counter = if (x> head xs && counter < limit) 
           then incr counter -- I want here add another action 
           else if (x < head xs) 
            then check xs limit counter 
            else incr x 

main = do 
    print $ check [4,3,5,6] 1 0 
    --- The answer I aim is : [3,4,5,6] 

檢查的目標是要找到每一個元素是否是比下一個或不是做大,如果是,則增加計數器,做一套動作像掉他們的地方,並且是有一定限度的這個動作,像這裏只是一次,意味着只有一次它可以做到這一點,而不是更多。

+0

你想增加計數器,然後繼續檢查列表的其餘部分?順便說一句,你不要用'incr'修改'counter'或'x'的值(不管怎麼樣,你應該使用'succ',除非你在某處定義了'incr'),你只需要返回一個櫃檯的新價值。您必須再次顯式調用該函數,例如'check xs limit(succ counter)'或'succ x:check xs limit counter'。 – bheklilr

回答

3

你可以使用守衛來代替:

check [] _ _ = [] 
check (x:xs) limit counter 
      | x> head xs && counter < limit = incr counter 
      | x < head xs     = check xs limit counter 
      | otherwise      = incr x 

你也可以使用caseMultyIf擴展

相反actionincr counter你可以寫check xs limit (counter + 1)

關於交換,你可以嘗試

... 
| x> head xs && counter < limit = check (head xs : x : tail xs) limit (counter + 1) 

我看,你還需要特殊情況下的head [] = error,所以你應該把你的功能分爲check (x:y:xs) ..check [x]

因此,對於check (x:y:xs) ..情況下,我們可以重寫

... 
| x> y && counter < limit = check (y : x : xs) limit (counter + 1) 

當你這樣做,你已經發現,我們有空列表作爲結果。 但要保存修改的列表

因此,嘗試添加變更確認功能

check' xs = reverse . check ([], xs) 0 

check (modXs, []) _ _ = modXs 
check (modXs, [x]) _ _ = x : modXs 
check (modXs, (x:y:xs)) counter limit = ... 

要領 功能裏面有沒有「靜態局部變量」,但在大多數情況下,遞歸是受歡迎的。 如果確實需要使用「靜態局部變量」,你可以使用「在內容數據」:單子,像IO,純IORef,像State

+0

謝謝@wit,但在incr counter之後,您是否知道如何添加func1之類的其他功能。如果我說inr櫃檯>> func1,這是真的嗎? – Amir

+0

@Amir'incr counter'語句對結果沒有任何影響,因爲Haskell中的值不可變。增加後你想用'counter'做些什麼嗎? – bheklilr

+0

@wit多數民衆贊成我很想了解你的代碼:) – Amir

1

關於你的第二個實施check

check (modXs, []) _ _ = modXs 
check (modXs, [x]) _ _ = x : modXs 
check (modXs, (x1:x2:xs)) counter limit 
    | x1 > x2 && counter > limit = x2:check (x1 : xs) (incr counter) limit 
    | otherwise = x1 : check (x2 : xs) counter limit 

你幾乎在那裏,但它的病態輸入,因爲check的第一個參數是一對,而在遞歸定義中,您提供了一個列表。