Haskell Golf: Mehrfachfilter



  • Im C++-Forum wollte jemand eine Funktion schreiben, die eine Liste von Bedingungen entgegen nimmt und eine weitere Liste, bei der alle Elemente herausgefiltert werden, bei denen mindestens ein Element eine Bedingung nicht erfüllt.

    Also im Prinzip:

    verundere :: [a -> Bool] -> [a] -> [a]
    verundere []     = id
    verundere (f:fs) = verundere fs . filter f
    

    Jetzt bin ich natürlich verwundert, ob man das noch etwas golfen kann, d.h. einzeilig, kürzer und auf Rekursion sowie die Argumente verzichten.
    Findet jemand kompaktere Definition?



  • Ach ja, mein Ansatz. Ich brings nur auf den folgenden umständlichen und hässlichen Code:

    verundere fs = filter (and . flip map fs . flip ($))
    


  • Expliyite Rekursion ist meist unerwuenscht, nutze einfach die bekannten Rekursionschema wie map, filter, fold, ... Auch wuerde ich nur das Praedikat fuer Filter konstruieren, nicht aber filter ersetzen.

    Edit: naja, schon besser ... btw. es gibt einen Algorithmus um in die pointfree Form zu transformieren.



  • Stimmt, der Lambdabot ist mir überlegen

    verundere = filter . (and .) . (. flip id) . flip map
    

    Ich frage mich allerdings, ob meine erste Version nicht doch lesbarer war.



  • Das erste war kürzer und ich finde es ist auch besser zu lesen !

    verundere fs = filter (and . flip map fs . flip ($)) 👍
    verundere = filter . (and .) . (. flip id) . flip map 👎

    😃

    (Btw. ich hab 0 Plan von Haskell ^^)



  • verundere = foldr (.) id . map filter
    

Log in to reply