[Haskell] Vereinfachung von alternierender Funktion



  • as :: [Integer] -> Integer
    as [] = 0
    as (x:xs) = x + as2 xs
    
    as2 :: [Integer] -> Integer
    as2 [] = 0
    as2 (x:xs) = (-x) + as xs
    

    Ich könnte das jetzt statt mit zwei Funktionen mit einer Funktion und einem Flag True/False machen. Aber gibt es einen anderen Weg das in eine Funktion zu bringen?

    MfG SideWinder



  • Du willst ja wie im IRC bestätigt f [a,b,c] = a - b + c, nicht andersrum.

    Daher folgende Vorschläge:

    as = foldr (-) 0
    
    -- was das gleiche ist wie
    
    as [] = 0
    as x:xs = x - as xs
    
    -- oder, wieder anders
    
    as [] = 0
    as [x] = x
    as (x:y:xs) = x - y + as xs
    

    Die ersten zwei Methoden nutzen aus, dass a - b + c - d + ... = a - (b - (c - (d - ...)))



  • as :: [Integer] -> Integer
    as [] = 0
    as [x] = x
    as (x:y:xs) = x - y + as xs
    

    Edit: Da war wieder einer schneller. Und auch noch viel eleganter 😉



  • Danke guter Herr.

    MfG SideWinder


Anmelden zum Antworten