Haskell árbol binario de búsqueda

votos
0
module Main where

import Data.List
import Data.Function

type Raw = (String, String)

icards =  [(the, le),(savage, violent),(work, travail),
           (wild, sauvage),(chance, occasion),(than a, qu'un)]

data Entry = Entry {wrd, def :: String, len :: Int, phr :: Bool}
             deriving Show

-- French-to-English, search-tree section

entries' :: [Entry]
entries' = map (\(x, y) -> Entry y x (length y) (' ' `elem` y)) icards

data Tree a = Empty | Tree a (Tree a) (Tree a)

tree :: Tree Entry
tree = build entries'

build :: [Entry] -> Tree Entry
build []     = Empty
build (e:es) = ins e (build es)

ins :: Entry -> Tree Entry -> Tree Entry

...

find :: Tree Entry -> Word -> String

...

translate' :: String -> String
translate' = unwords . (map (find tree)) . words

Así que estoy tratando de diseñar complementos de función y encontrar, pero no estoy seguro de dónde start.any ideas?

Publicado el 04/11/2011 a las 04:48
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
2

No tengo idea de por qué criterios el árbol debe ser ordenada, así que utilizo solo wrd. A continuación, se vería como:

ins :: Entry -> Tree Entry -> Tree Entry
ins entry Empty = Tree entry Empty Empty
ins entry@(Entry w _ _ _) (Tree current@(Entry w1 _ _ _) left right) 
   | w == w1 = error "duplicate entry"
   | w < w1 = Tree current (ins entry left) right
   | otherwise = Tree current left (ins entry right)  

¿Cómo llegar allá?

Como siempre cuando se utiliza la recursividad, se necesita un caso base. Aquí es muy simple: Si el árbol está vacío, solamente reemplazarlo por un nodo que contiene sus datos. No hay niños para el nuevo nodo, por lo que utilizan Empty.

El caso si usted tiene un nodo completo parece más difícil, pero esto es sólo debido a la coincidencia de patrones, la idea es muy simple: si la entrada es "más pequeño" es necesario sustituir el hijo izquierdo con una versión que contiene la entrada, si es "más grande" es necesario sustituir el hijo derecho.

Si ambos nodos y la entrada tienen el mismo "tamaño" tiene tres opciones: mantener el nodo de edad, sustituirlo por uno nuevo (mantener a los niños) o lanzar un error (que parece la solución más limpia, así que lo hice aquí).

Respondida el 04/11/2011 a las 08:39
fuente por usuario

votos
2

Un simple generalización de la respuesta de Landei:

ins :: Ord a => a -> Tree a -> Tree a
ins x Empty = Tree x Empty Empty
ins x (Tree x' l r) = case compare x x' of
  EQ -> undefined
  LT -> Tree x' (ins x l) r
  GT -> Tree x' l (ins x r)

Para que esto funcione en Tree Entry, tendrá que definir una instancia de Ordpara Entry.

Respondida el 04/11/2011 a las 17:42
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more