Haskell binärer Suchbaum

stimmen
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

so ich versuche Funktion in zu entwerfen und finden, aber ich bin nicht sicher, wo Ideen start.any?

Veröffentlicht am 04/11/2011 um 04:48
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
2

Ich habe keine Ahnung , durch welche Kriterien der Baum sortiert werden soll, so dass ich einfach wrd. Dann würde es wie folgt aussehen:

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)  

Wie man dorthin kommt?

Wie immer , wenn die Rekursion verwenden, müssen Sie einen Basisfall. Hier ist es ganz einfach: Wenn der Baum leer ist, einfach ersetzen Sie es durch einen Knoten Ihre Daten enthält. Es sind keine Kinder für den neuen Knoten, also verwenden wir Empty.

Der Fall, wenn Sie einen vollständigen Knoten sieht schwieriger aus, aber das ist nur aufgrund Pattern-Matching, ist die Idee ganz einfach: Wenn der Eintrag „kleiner“ Sie das linke Kind mit einer Version ersetzen müssen, der den Eintrag enthält, wenn es ist „größer“ Sie das richtige Kind ersetzen müssen.

Wenn beide Knoten und Eintrag die gleiche „Größe“ haben haben Sie drei Möglichkeiten: Halten Sie den alten Knoten, ersetzen Sie ihn durch den neuen (halten die Kinder) oder einen Fehler aus (die die sauberste Lösung scheint, so habe ich es hier).

Beantwortet am 04/11/2011 um 08:39
quelle vom benutzer

stimmen
2

Eine einfache Verallgemeinerung der Landei Antwort:

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)

Dafür zu arbeiten Tree Entry, müssen Sie eine Instanz definieren , Ordfür Entry.

Beantwortet am 04/11/2011 um 17:42
quelle vom benutzer

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