Задание
В некотором языке программирования существуют следующие типы данных:
- Простые типы: целы, вещественные и строки
- Сложные типы: структуры. Структура имеет название и состоит из нескольких полей, каждое из которых, в свою очередь, имеет название и простой тип.
- База данных идентификаторов программы представляет собой список пар, состоящих из имени идентификатора и его типа. Разработайте тип данных, представляющий описанную информацию.
Определите следующие функции:
1. isStructured, проверяющая, что её аргумент является сложным типом.
2. getType, по заданному имени и списку идентификаторов (базе данных) возвращающая тип идентификатора с указанным именем.
3. getFields, по заданному имени возвращающая список полей идентификатора, если он имеет тип структуры
4. getByType, возвращающая список имён идентификаторов указанного типа из базы данных.
5. getByTypes, аналогичная предыдущей, но принимающей вместо одного типа списков типов (с помощью этой функции можно получить, например, список всех идентификаторов с числовым типом).
Решение:
MyInt |
MyFloat |
MyString |
MyStruct [(String,MyType)] deriving (Show,Eq)
db = [("x",MyInt),
("y",MyFloat),
("z",MyString),
("u",MyInt),
("s",MyStruct [("s1",MyInt),("s2",MyFloat)])]
isStructured :: MyType -> Bool
isStructured (MyStruct b) = True
isStructured (_) = False
getType :: String -> [(String,MyType)] -> MyType
getType _ [] = Null
getType s (h:t) = if fst(h) == s then snd(h) else getType s t
getFieldsFromStruct :: MyType -> [(String,MyType)]
getFieldsFromStruct (MyStruct a) = a
getFieldsFromStruct _ = []
getFields :: String -> [(String,MyType)] -> [(String,MyType)]
getFields _ [] = []
getFields s (h:t) = if fst(h) == s && isStructured (snd h) then
getFieldsFromStruct (snd h)
else
getFields s t
getByType :: MyType -> [(String,MyType)] -> [String]
getByType _ [] = []
getByType a (h:t) = if a == (snd h) then
(fst h) : getByType a t
else
getByType a t
getByTypes :: [MyType] -> [(String,MyType)] -> [String]
getByTypes [] _ = []
getByTypes _ [] = []
getByTypes (h:t) db = (getByType h db) ++ getByTypes t db
True :: Bool
Main> getType "g" [("g",MyInt)]
MyInt :: MyType
Main> getFieldsFromStruct MyInt
[] :: [(String,MyType)]
Main> getFields "s" db
[("s1",MyInt),("s2",MyFloat)] :: [(String,MyType)]
Main> getByType MyInt db
["x","u"] :: [String]
Main> getByTypes [MyInt,MyFloat] db
["x","u","y"] :: [String]
Main> getByTypes [MyInt] db
["x","u"] :: [String]
Main> getByTypes [MyInt,MyString] db
["x","u","z"] :: [String]
вывести все типы, которые есть в db.
getTypes [] = []
getTypes (h:t) = snd(h) : getTypes t
Если вам нравится то, что мы пишем, пожалуйста, нажмите на интересующую вас рекламу сбоку, сверху, или сразу после статьи. Будет стимул писать лучше и чаще. Хорошего вам дня.