Форум программистов, компьютерный форум, киберфорум
Haskell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 16.05.2014
Сообщений: 29

Определение новых типов

06.10.2014, 23:14. Показов 1202. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Реализуйте тип данных для задания, с номером вашего варианта. Опишите реализованный тип данных как экземпляр классов с наиболее широким набором перегруженных операций.
Задание: Рациональное число (с реализацией операций над рациональными числами,
функции извлечения приближенного вещественного значения)

Пример: Интервал (с реализацией интервальных операций)
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
-- Тип данных "интервал" с инфиксным конструктором :-:
data Interval a = a :-: a
-- Нормализация интервала
iNormalize :: Ord a => Interval a -> Interval a
iNormalize (x :-: y) = (min x y) :-: (max x y)
-- Селекторы для первого и второго поля интервала
iFirst :: Interval a -> a
iFirst (x :-: y) = x
iSecond :: Interval a -> a
iSecond (x :-: y) = y
-- Селекторы для начала и конца интервала
iStart :: Ord a => Interval a -> a
iStart i = iFirst (iNormalize i)
iEnd :: Ord a => Interval a -> a
iEnd i = iSecond (iNormalize i)
-- Предикат (инфиксный) для определения принадлежности x интервалу i
(<~) :: Ord a => a -> Interval a -> Bool
(<~) x i = (x >= iStart i) && (x <= iEnd i)
-- Длина интервала
iLength :: (Num a, Ord a) => Interval a -> a
iLength i = iEnd i - iStart i
-- Функция применения функции operation к интервалу i
iMap :: (Ord a, Ord b) => Interval b -> (b -> a) -> Interval a
iMap i operation =
iNormalize (operation (iStart i) :-: operation (iEnd i))
-- Расстояние между двумя интервалами
iDistance :: (Ord a, Num a) => Interval a -> Interval a -> a
iDistance i1 i2 =
max (abs (iStart i1 - iStart i2)) (abs (iEnd i1 - iEnd i2))
-- Назначение типа данных Interval экземпляром класса Eq
instance (Eq a, Ord a) => Eq (Interval a) where
(==) i1 i2 = (iStart i1 == iStart i2) && (iEnd i1 == iEnd i2)
(/=) i1 i2 = not (i1 == i2)
-- Назначение типа данных Interval экземпляром класса Show
instance (Show a, Ord a) => Show (Interval a) where
show i = show (iStart i) ++ " :-: " ++ show (iEnd i)
-- Назначение типа данных Interval экземпляром класса Num
instance (Num a, Ord a) => Num (Interval a) where
(+) i1 i2 = (iStart i1 + iStart i2) :-: (iEnd i1 + iEnd i2)
(-) i1 i2 = (iStart i1 - iEnd i2) :-: (iEnd i1 - iStart i2)
(*) (x1 :-: y1) (x2 :-: y2) =
let ac = x1 * x2
ad = x1 * y2
bc = y1 * x2
bd = y1 * y2
in iNormalize ((min ac ad) :-: (min bc bd))
negate i = (negate (iEnd i)) :-: (negate (iStart i))
abs (x :-: y) =
let ax = abs x
ay = abs y
in
if signum x == signum y then iNormalize (ax :-: ay)
else 0 :-: (max ax ay)
signum (x :-: y) =
let
sx = signum x
sy = signum y
in
iNormalize (sx :-: sy)
fromInteger x = (fromInteger x) :-: (fromInteger x)
-- Назначение типа данных Interval экземпляром класса Fractional
instance (Fractional a, Ord a) => Fractional (Interval a) where
(/) (x1 :-: y1) (i2 @ (x2 :-: y2)) =
if 0 <~ i2 then error "Division by zero"
else
let ac = x1 / x2
ad = x1 / y2
bc = y1 / x2
bd = y1 / y2
in iNormalize ((min ac ad) :-: (min bc bd))
fromRational x = (fromRational x) :-: (fromRational x)
-- Назначение типа данных Interval экземпляром класса Ord
instance (Ord a) => Ord (Interval a) where
(<) i1 i2 = iEnd i1 < iStart i2
(<=) i1 i2 = iEnd i1 <= iStart i2
(>) i1 i2 = i2 < i1
(>=) i1 i2 = i2 <= i1
compare i1 i2
| i1 <= i2 = LT
| i1 >= i2 = GT
| i1 == i2 = EQ
| otherwise = error "The intervals are non-comparable"
-------------------------------------------------------------------------------
-- ПРИМЕРЫ
-------------------------------------------------------------------------------
main = do
-- предопределяем три интервала
let i1 = (-12) :-: (-4)
let i2 = 16 :-: 8
let i3 = (-10) :-: 5
-- вывод значений первых двух интервалов
print $ i1
print $ i2
-- операции над интервалами
print $ 0 <~ i1
print $ 0 <~ i3
print $ 7 <~ i3
print $ iLength i1
print $ iLength i3
print $ iDistance i1 i3
print $ iMap i3 sin
-- арифметические операции над интервалами
print $ i1 + i2
print $ i1 - i3
print $ i3 * i1
print $ i3 / i1
-- смешанные арифметические операции
print $ 2 * i1
print $ i1 / 4
print $ i1 / (4 / 3)
-- операции сравнения интервалов
print $ i1 < i2
print $ i1 < i3
print $ i1 > i3
print $ compare i2 i3
print $ compare i1 i2
-- сравнение i1 и i3 с помощью compare приведет к ошибке
-- так как интервалы не сравнимы
-- можно раскомментировать следующую строку, чтобы в этом убедиться
-- print $ compare i1 i3
-- так как интервалу i3 принадлежит 0 то при делении на него
-- выйдет сообщение об ошибке
-- можно раскомментировать следующую строку, чтобы в этом убедиться
-- print $ i1 / i3
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.10.2014, 23:14
Ответы с готовыми решениями:

Определение типов
Знаю, что чтобы создать тип, нужно добавить ключевое слово data. Чтобы создать тип из других типов, нужно написать type. А зачем нужен...

Определение теоретико-множественных типов
Господа, как можно в Haskell построить конструкции типа множество всех подмножеств заданного множества? При условии, что заданное...

Добавление новых типов в функцию
function mb_filter_user_type() { if(Params::getParam('sCompany') &lt;&gt; '' and Params::getParam('sCompany') &lt;&gt; null) { ...

1
Эксперт 1С
 Аватар для Tklwegsd
845 / 608 / 211
Регистрация: 24.07.2013
Сообщений: 2,102
07.10.2014, 15:25
Рациональные числа реализованы в библиотеке Ratio.
http://www.haskell.ru/ratio.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.10.2014, 15:25
Помогаю со студенческими работами здесь

Определение типов
Сегодня в универе на лекции по Си узнал, что такая: int*(*comp)(); весьма чудовищная(хотя и не худшее, что могло быть) :) запись является...

Рекурсивное определение типов
Здравствуйте, у меня возникла проблема. Есть код typedef void* BaseType; typedef element *ptrel; typedef struct { ...

Определение типов данных
Вопрос довольно сложный я пытался его создать в разделе для эксперов, но не могу там создавать темы. Есть класс MyStr у которого...

Определение новых клиентов в клиентской базе (Excel 2007)
Большая просьба откликнуться!!! есть база данных по клиентам компании, с объемами продаж по-месячно. Как можно в каждом месяце выявить...

Определение новых координат базисных векторов и нового начала
Определить координаты новых базисных векторов и нового начала в старой системе по формулам преобразования. а) { x=x`-3y` б) { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru