меня такая ситуация:Лучше программирование в Haskell Tree
data BT1 a = Nd a (BT1 a) (BT1 a) | Lf deriving (Show, Eq)
data trG = trG { title :: String, authors :: [String], price :: Double }
deriving (Show, Eq, Ord)
g1 = trG "Alsace" ["JP Robin"] 45
g2 = trG "Picardie" ["Auguste Renoir"] 40
g3 = trG "Gironde" ["Alain Schwartz"] 35
g4 = trG "France" ["Jean Dalverny"] 42
g5 = trG "GB" ["Vidal Cameron"] 50
g6 = trG "Germany" ["Auguste Renoir"] 48
g7 = trG "USA" ["John Kennedy"] 60
g1..g7 находятся в BT1 дерева (не предполагается бинарным)
gtNam = Nd g4
(Nd g6
(Nd g5 Lf Lf)
(Nd g1 Lf Lf))
(Nd g2
(Nd g3 Lf Lf)
(Nd g7 Lf Lf))
функцию, пытаясь найти книга данного автора в дереве gtNam (giveAuthor и giveTitle две небольшие функции, они дают автора и название книги)
treeFindAuthorBook :: String -> BT1 trG -> [[Char]]
treeFindAuthorBook _ Lf = [""]
treeFindAuthorBook str (Nd v l r) = do
let m = find (==str) (giveAuthor v)
if m == Nothing
then do
k <- treeFindAuthorBook str l
if k == ""
then treeFindAuthorBook str r
else
[k]
else
return (giveTitle v)
1) Я хотел бы написать его более похожим на Haskell образом
2) Как я могу сделать, чтобы накапливать в списке все книги, возможно, написанные данным автором?
Вы знаете, что типы данных и конструкторы не могут начинаться с буквы нижнего регистра? 'data trG = trG ...' не будет компилироваться. – bheklilr
@ bheklilr: Ошибка, когда я скопировал это с некоторыми изменениями из моего файла .hs :-) – user3166747
Я нахожу эти сокращения очень трудными для чтения. Что не так с написанием 'Leaf' и' Node' вместо 'Lf' и' Nd'? Более длинную версию легче читать не только для нас, но и для вашего будущего. Я единственный, кто не знает, что означает «TrG»? – Franky