Estoy tratando de completar la última parte de mi tarea Haskell y estoy atascado, mi código hasta ahora:Haciendo una búsqueda binaria sobre algunos elementos en Haskell
data Entry = Entry (String, String)
class Lexico a where
(<!), (=!), (>!) :: a -> a -> Bool
instance Lexico Entry where
Entry (a,_) <! Entry (b,_) = a < b
Entry (a,_) =! Entry (b,_) = a == b
Entry (a,_) >! Entry (b,_) = a > b
entries :: [(String, String)]
entries = [("saves", "en vaut"), ("time", "temps"), ("in", "<`a>"),
("{", "{"), ("A", "Un"), ("}", "}"), ("stitch", "point"),
("nine.", "cent."), ("Zazie", "Zazie")]
build :: (String, String) -> Entry
build (a, b) = Entry (a, b)
diction :: [Entry]
diction = quiksrt (map build entries)
size :: [a] -> Integer
size [] = 0
size (x:xs) = 1+ size xs
quiksrt :: Lexico a => [a] -> [a]
quiksrt [] = []
quiksrt (x:xs)
|(size [y|y <- xs, y =! x]) > 0 = error "Duplicates not allowed."
|otherwise = quiksrt [y|y <- xs, y <! x]++ [x] ++ quiksrt [y|y <- xs, y >! x]
english :: String
english = "A stitch in time save nine."
show :: Entry -> String
show (Entry (a, b)) = "(" ++ Prelude.show a ++ ", " ++ Prelude.show b ++ ")"
showAll :: [Entry] -> String
showAll [] = []
showAll (x:xs) = Main.show x ++ "\n" ++ showAll xs
main :: IO()
main = do putStr (showAll (diction))
La pregunta es:
se pueden escribir programas Haskell que se lleva a la sentencia Inglés 'Inglés', se ve a cada palabra en el diccionario Inglés-francés mediante la búsqueda binaria, realiza palabra por palabra sustitución, monta el P. ench traducción, y lo imprime.
La función de 'clasificación rápida' rechaza entradas duplicadas (con 'error'/abortar) de modo que no es precisamente una definición de cualquier palabra francesa Inglés. Pruebe 'quicksort' con el 'raw_data' original y después de haber agregado '("guardar", "sauve")' a 'raw_data'.
Aquí hay una versión de búsqueda binaria de von Neumann que se detiene tarde . Realice una transcripción literal en Haskell. Inmediatamente después de la entrada, la versión de Haskell debe verificar el recursivo "loop invariant", que termina con 'error'/abort si no se puede mantener. Es también termina de la misma manera si no se encuentra la palabra en inglés.
function binsearch (x : integer) : integer local j, k, h : integer j,k := 1,n do j+1 <> k ---> h := (j+k) div 2 {a[j] <= x < a[k]} // loop invariant if x < a[h] ---> k := h | x >= a[h] ---> j := h fi od {a[j] <= x < a[j+1]} // termination assertion found := x = a[j] if found ---> return j | not found ---> return 0 fi
En la versión Haskell
binsearch :: String -> Integer -> Integer -> Entry
como el diccionario constante 'a' de tipo '[Entrada]' es globalmente visible. Sugerencia: Haga su cadena (palabra inglesa) en una 'Entrada' inmediatamente después de ingresar 'binsearch'.
El valor de programación del tipo de datos alto nivel 'Entrada' es que, si se puede diseñar estas dos funciones sobre los números enteros, es trivial para ascensor que operan a lo largo de la entrada.
¿Alguien sabe cómo debo hacer con mi función binarysearch?
Sí, ese error dio un montón de problemas, obtuve un bucle infinito cuando obtuve el código en ejecución. – Flame