Haskell бинарное дерево поиска

голоса
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

поэтому я пытаюсь разработать функциональные модули и найти, но я не уверен, где start.any идеи?

Задан 04/11/2011 в 04:48
источник пользователем
На других языках...                            


2 ответов

голоса
2

Я понятия не имею , по каким критериям дерево должно быть отсортировано, поэтому я использую только wrd. Тогда это будет выглядеть так:

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)  

Как туда добраться?

Как всегда при использовании рекурсии, вам нужен базовый случай. Здесь все очень просто: если дерево пусто, просто замените его узлом , содержащим данные. Там нет детей для нового узла, поэтому мы используем Empty.

Случае, если у вас есть полный узел выглядит более трудным, но это только из-за сравнения с шаблоном, идея очень проста: Если запись «меньше» вам необходимо заменить левую ребенку с версией, которая содержит запись, если это «больше» вам нужно заменить правую ребенка.

Если оба узел и запись имеют один и тот же «размер» у вас есть три варианта: сохранить старый узел, заменить его на новом (держа ребенок) или выдаст ошибку (которая, кажется, чистейшее решение, так что я сделал это здесь).

Ответил 04/11/2011 в 08:39
источник пользователем

голоса
2

Простое обобщение ответа 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)

Для этого , чтобы работать на Tree Entry, вам нужно будет определить экземпляр Ordдля Entry.

Ответил 04/11/2011 в 17:42
источник пользователем

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