Diese Funktion memoizing ist viel schneller als seine rekursive Version:Verwendung von Lambda-Ausdrücke Vereinfachen und eine Karte in dem Staat Monad
crossSubstrings :: String -> String -> [(String,String)]
crossSubstrings string1 string2 = [(substr1,substr2) | substr1 <- inits string1,
substr2 <- inits string2]
type Distances = Map.Map (String,String) Int
editDistanceMemoized :: String -> String -> Int
editDistanceMemoized s1 s2 =
let
substrings = s1 `crossSubstrings` s2
distances = foldl (editDistance) emptyMap substrings
in
distances Map.! (s1,s2)
where
emptyMap = Map.fromList []
editDistance :: Distances -> (String,String) -> Distances
editDistance map ([],s1) = map `Map.union` getMap [] s1 (length s1)
editDistance map (s1,[]) = map `Map.union` getMap s1 [] (length s1)
editDistance map (s1,s2) = map `Map.union` getMap s1 s2 (cost map s1 s2)
getMap s1 s2 d = Map.fromList [((s1,s2),d)]
insertionPCost = \m -> \s1 -> \s2 -> m Map.! (s1, init s2) + 1
deletionPCost = \m -> \s1 -> \s2 -> m Map.! (init s1, s2) + 1
substitutionPCost = \m -> \s1 -> \s2 -> m Map.! (init s1, init s2)
+ substitutionCostIfNEQ s1 s2
substitutionCostIfNEQ = \s1 -> \s2 -> if (last s1 == last s2) then 0 else 2
cost = \m -> \s1 -> \s2 -> minimum [insertionPCost m s1 s2,
deletionPCost m s1 s2,
substitutionPCost m s1 s2]
jedoch (erste Frage), ich fühle mich wie einige lambdas vermieden werden könnte (doesn‘ t es sich wiederholend aussehen? schauen Sie besonders an cost
). Gibt es eine Möglichkeit, minimum
zu komponieren?
Darüber hinaus könnte die State Monad verwendet werden, um die Karte zu propagieren (anstelle von ?). Trotz der Lektüre, wie sich State.>>=
und State.id
verhalten, bin ich mir nicht 100% ig sicher, wie die Signatur aussehen soll (zweite Frage).
Ich dachte an diese, wo der Staat ist "das nächste Paar von Strings gemessen werden soll" und Entfernungen enthält die Memo-Distanzen.
editDistance :: State Distances (String,String) -> State Distances()?
Übrigens ist Ihre 'emptyMap' die selbe wie [' Map.empty'] (http://www.haskell.org/ghc/docs/latest/html/libraries/containers/Data-Map.html#) v: leer). – dave4420