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.
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. " –
@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
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