www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

Daten merken
Auto-Login
Registrieren
 
Online
niemand
 
Forumsuche
Suche nach:

Logo - DracheHaskell-Forum

Landei

Gepostet:
04.10.2011 16:48

Lambda vereinfachen  
Ich habe folgende Funktion:


test a b | length a == length b = sum $ map fromEnum $ zipWith (/=) a b
| otherwise = error \"error\"


Nun würde ich gern das Mappen gleich im zipwith erledigen. Dann hätte ich...


test a b | length a == length b = sum $ zipWith (\\x y-> fromEnum (x /= y)) a b
| otherwise = error \"error\"


...oder vereinfacht...


test a b | length a == length b = sum $ zipWith (\\x -> fromEnum.(x /=)) a b
| otherwise = error \"error\"


Bekomme ich das x auch noch irgendwie entfernt?

Zum Seitenanfang    
 
Landei

Gepostet:
05.10.2011 09:40

   
Das hier ginge, aber ich hoffe, dass es noch einen eleganteren Weg gibt:


:t curry (fromEnum. (uncurry (/=)))
--> curry (fromEnum. (uncurry (/=))) :: (Eq a) => a -> a -> Int
Zum Seitenanfang    
 
Landei

Gepostet:
05.10.2011 15:01

   
Ich wurde aufgeklärt:


(\\x -> fromEnum.(x /=))


... kann man schreiben als ...


((fromEnum . ) . (/=))


Jetzt muss ich nur noch verstehen, warum...
Zum Seitenanfang    
 
IKT

Gepostet:
06.02.2012 17:55

   
Meinst du die Pointfree Notation?: http://www.haskell.org/haskellwiki/Pointfree
Zum Seitenanfang    
 
Landei

Gepostet:
07.02.2012 15:46

   
Ja, nur die Notation kennen und richtig anwenden sind zwei verschiedene Sachen. Ein ähnliches Problem wie meins wird hier diskutiert:

http://stackoverflow.com/questions/5304677/when-to-use-pointless-style

Und als Verallgemeinerung der \"boobs operator\" (.).(.) definiert :-)
Zum Seitenanfang    
 
IKT

Gepostet:
26.02.2012 00:00

   
In der einfachsten Form glaube ich die Funktionskomposition . verstanden zu haben,
aber ich blicke nicht mehr durch, wenn der von dir angesprochene Operator zum Einsatz kommt bzw. sowas wie
((fromEnum . ) . (/=)) da steht.

Oder ein Beispiel von mir: dropWhile ((not .) . isPrefixOf) xs
dropWhile ((not . isPrefixOf) xs allein ginge ja nicht, weil isPrefixOf :: [a] -> [a] -> Bool 2 Operanden und not :: Bool -> Bool nur 1 Operand hat, oder?
aber wie sich das (not .) . isPrefixOf jetzt genau zusammensetzt, wie ich das verstehen bzw. in andere Syntax übersetzen kann ist mir nicht klar, könntest du das erklären?


Zum Seitenanfang    
 
Landei

Gepostet:
27.02.2012 09:19

   
Nur unter Alkoholeinfluss...
Zum Seitenanfang