Anwendung Ich bin mir bewusst, dass ich die Funktion Monade verwenden kann, um ein Konstrukt wie die unten zu erreichen (wo ich das Argument in mehr Anrufen wiederverwenden, ohne es explizit Referenzierung):Ausführen eine Transformation mit dem Eingang, bevor die Funktion Monade
compute_v0 :: String -> String
compute_v0 = do
x <- length -- (using the argument implicitly here)
top <- head -- (and here)
return (replicate x top)
Das Ergebnis der obigen Funktion für: compute "1234"
"1111"
Meine Frage wäre: Wie würde ich eine Transformation auf die ‚versteckten‘ Argument anwenden, bevor das tun Block ausgeführt wird (man stelle würde ich mag „abcd anhängen "zur Liste).
Meine erste Lösung:
compute_v1 :: String -> String
compute_v1 = compute_v1' . (++ "abcd")
compute_v1' ::String -> String
compute_v1' = do
x <- length
top <- head
return (replicate x top)
Das Ergebnis für compute "1234"
wäre jetzt "11111111"
. Dies erledigt zwar den Job, aber ich würde lieber versuchen, es in einem einzigen Code-Block definiert zu halten.
Der nächstgelegene ich tatsächlich bekommen konnte umfassen die Transformation, während immer noch den Stil von Code (v0) zu halten war diese:
compute_v2 :: String -> String
compute_v2 = (++ "abcd") >>= \r -> do
let x = length r
let top = head r
return $ replicate x top
Aber ich hatte noch eine Lambda enthalten, eine Menge let Bindungen verwenden und verweisen Sie explizit auf das Lambda-Argument. Gibt es bessere Möglichkeiten, ein solches Konstrukt zu erreichen?
'compute_v1 = LiftA2 replizierten Länge Kopf. (++ "abcd") ' – 4castle
' compute_v1 = (replizieren <$> Länge <*> Kopf). (++ "abcd") ' – Redu