Сделать домашней|Добавить в избранное
 

Сайт, посвящен программированию,
исходникам разных программ и
известным алгоритмам

 
Исходники программ » Языки программирования » Haskell » Лабораторная работа № 3 (Haskell)
на правах рекламы

Лабораторная работа № 3 (Haskell)

Автор: admin от 3-01-2012, 19:30

Задание

Внимание! У вас нет прав для просмотра скрытого текста.
:
  В некотором языке программирования существуют следующие типы данных:
   - Простые типы: целы, вещественные и строки
   - Сложные типы: структуры. Структура имеет название и состоит из нескольких полей, каждое из которых, в свою очередь, имеет название и простой тип.
   - База данных идентификаторов программы представляет собой список пар, состоящих из имени идентификатора и его типа. Разработайте тип данных, представляющий описанную информацию.
  Определите следующие функции:
    1. isStructured, проверяющая, что её аргумент является сложным типом.
   2. getType, по заданному имени и списку идентификаторов (базе данных) возвращающая тип идентификатора с указанным именем.
    3. getFields, по заданному имени возвращающая список полей идентификатора, если он имеет тип структуры
    4. getByType, возвращающая список имён идентификаторов указанного типа из базы данных.
   5. getByTypes, аналогичная предыдущей, но принимающей вместо одного типа списков типов (с помощью этой функции можно получить, например, список всех идентификаторов с числовым типом).

Решение:
data MyType = Null |
           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
Результаты:
Main> isStructured (MyStruct [("x",MyInt)])
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 :: [(String,MyType)] -> [MyType]
getTypes [] = []
getTypes (h:t) = snd(h) : getTypes t

 

Если вам нравится то, что мы пишем, пожалуйста, нажмите на интересующую вас рекламу сбоку, сверху, или сразу после статьи. Будет стимул писать лучше и чаще. Хорошего вам дня.

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий