2014-10-23 10 views
6

Ich habe eine Aufgabe, um eine Spalte aus einer [[a]] Matrix zu bekommen.Wie mache ich mehrere Eta Reduktionen in Haskell

wäre eine einfache Lösung

colFields :: Int -> [[a]] -> [a] 
colFields n c = map (!! n) c 

sein und wenn sie von einem Abstraktionsniveau reduziert würde es

colFields n = map (!! n) 

Ich spüre, dass ich einfach loswerden n bekommen konnte, aber ich kann nicht TU es.

Antwort

13

Was Sie suchen ist

colFields = map . flip (!!) 

jedoch, dies zu lesen ist nicht ganz klar, ich dort den n Parameter verlassen würde. Mit dem n als expliziten Parameter verstehe ich sofort, was die Funktion macht. Ohne sie muss ich eine Minute darüber nachdenken, um die Definition zu verstehen, selbst für einen einfachen Fall wie diesen.

Ich erhielt diese Antwort sehr einfach mit dem pointfree Werkzeug, obwohl es Methoden gibt, um dies von Hand abzuleiten.

+2

Ich stimme zu, es ist nicht super klar und die sinnvolle Version ist vorzuziehen. Ich habe es manuell herausgefunden; Hier ist mein Gedankengang: "Ich wünschte, ich hätte' pointfree' installiert. '(!!) :: [a] -> Int -> a' Wenn ich den' Int' als ersten Parameter habe, kann ich ihn komponieren mit '(.)'. Dafür ist 'flip' gedacht. Lass uns' ghci' fragen: ': t flip (!!)'; ': t map. flip (!!)'. Das sieht gut aus. Oh verdammt, @bheklilr hat mich dazu geschlagen. " –

+2

@ChristianConkle Um fair zu sein, kopiere ich einfach den Code in meinen bereits geöffneten GHCi mit ': pf', um das' pointfree' Tool aufzurufen. Sobald ich die vorgeschlagene Reduktion sah, dachte ich "Oh yeah, Sie müssten' flip' on '(!!)' verwenden, um das 'n' zuerst zu konsumieren und dann das Ergebnis an' map' mit '(.) Ich verstehe die Punktfreie Version, aber es war nicht ohne ein wenig Aufwand. Die sinnvolle Version ist mir sofort klar (vielleicht schreibe ich zu viel Haskell ...) – bheklilr

+3

Ein bisschen Nerding hier ... 'flip (!!) :: Int -> [a] -> a' eine natürlichere Funktion von einem partiellen Anwendungsstandpunkt aus als' (!!) ', wobei die Argumentordnung für Notationszwecke ist. Vielleicht würde ich sie' 'nennen index. "Und in diesem Fall ist" map. index "schön. Aber ich stimme zu" map. flip (!!) "ist ein bisschen verschlungen, um zu lesen, wie es ist. – luqui

Verwandte Themen