Haskell arbore binar de căutare

voturi
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

așa că am încercat să proiecteze uri funcționale și de a găsi, dar eu nu sunt sigur de unde să start.any idei?

Întrebat 04/11/2011 la 04:48
sursa de către utilizator
În alte limbi...                            


2 răspunsuri

voturi
2

Nu am nici o idee de ce criterii ar trebui să fie sortate copac, așa că am folosi doar wrd. Atunci ar arata ca:

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)  

Cum să ajungem acolo?

Ca întotdeauna atunci când se utilizează recursivitate, aveți nevoie de un caz de bază. Aici este foarte simplu: Dacă pomul este gol, trebuie doar să- l înlocuiască cu un nod care conține datele. Nu există copii pentru noul nod, deci vom folosi Empty.

Cazul dacă aveți un nod plin pare mai dificil, dar acest lucru este doar din cauza de potrivire de model, ideea este foarte simplu: În cazul în care intrarea este „mai mic“, trebuie să înlocuiți copilul stâng cu o versiune care conține intrarea, în cazul în care este „mai mare“, trebuie să înlocuiți copilul din dreapta.

Dacă ambele nod și de intrare au aceeași „dimensiune“ aveți trei opțiuni: să păstreze nodul vechi, înlocuiți-l cu unul nou (păstrarea copiilor) sau a arunca o eroare (care pare cea mai curată soluție, așa că am făcut-o aici).

Publicat 04/11/2011 la 08:39
sursa de către utilizator

voturi
2

O generalizare simplă a răspunsului lui 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)

Pentru ca acest lucru să lucreze la Tree Entry, va trebui să definească o instanță a Ordpentru Entry.

Publicat 04/11/2011 la 17:42
sursa de către utilizator

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