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

Функции высшего порядка

16.12.2016, 21:09. Показов 1555. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, нужна помощь с написанием программы. Как-то не смог нормально разобраться с функциями высшего порядка, а нужно написать программу именно используя их.
Задание: Написать программу, которая удаляет повторяющиеся элементы в матрице с использованием функций высшего порядка.
Я вроде как сделал программу, но без использования функций высшего порядка. Прошу помощи у людей, которые знают по больше меня и им не сложно будет помочь. Вот мой листинг:
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
element :: Int -> [Int]->Bool
element _ [] = False
element x (h:t) = if (x==h) then True
                  else element x t
 
insert :: [Int]->Int->[Int]
insert s x = if element x s then s
             else x:s
 
set :: [Int]->[Int]
set [] = []
set (x:xs) = insert (set xs) x
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.12.2016, 21:09
Ответы с готовыми решениями:

Функции высшего порядка
Задание: Функция area, возвращающая площадь фигуры. Для текстового поля площадь зависит от высоты и ширины буквы в шрифте. Поскольку...

Функции высшего порядка
--!Функции: AREA, getRectangles, getBound, getBounds, getFigure, move - реализовать С ПОМОЩЬЮ ФУНКЦИЙ ВЫСШЕГО ПОРЯДКА. Кто-нибудь помогите...

Функции высшего порядка
4. В агентстве недвижимости продают квартиры, комнаты и частные дома. Квартиры характеризуются этажом, площадью, и этажностью дома. Комната...

14
Антикодер
Эксперт функциональных языков программирования
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088
17.12.2016, 01:44
Начальный уровень понимания функций высшего порядка (ФВП, HOF) можно получить у Липовача:
LYAH: HOF
Более продвинутый у Холомьёва:
Haskell:ФВП
Но лучше читать сначала эти книги...

Вам точно для матрицы нужно? У вас же сделано для списка, это совсем другое задание...

Общая схема такова:
1) Попрактиковаться с использованием ФВП, которые применяются к спискам, их можно найти по сигнатуре.
2) Взять ФВП, которая подходит для решения этой задачи (например: свёртка списка(fold), композиция(.), комбинатор неподвижной точки(fix) и т п);
3) Подумать как удалить одинаковые элементы с помощью ФВП;
4) Если нужно, написать свою реализацию ФВП, вместо ФВП из Prelude.

Вместо функции element можно использовать Data.List (elem). И чтобы удалять повторяющееся элементы в конце списка нужно исправить insert:
Haskell
1
insert s x = if x `elem` s then s else s++[x]
Haskell сам выводит сигнатуру:
Haskell
1
2
Prelude> let { insert s x = if x `elem` s then s else s++[x]}
insert :: Eq a => [a] -> a -> [a]
Писать сигнатуру - хороший стиль, просто haskell может подсказать сигнатуру получше.
Функцию set лучше переименовать...
Я пока не буду показывать своё решение, так как это может вам навредить, и подожду пока другие участники форума опубликуют.
2
Модератор
 Аватар для Curry
5158 / 3488 / 536
Регистрация: 01.06.2013
Сообщений: 7,567
Записей в блоге: 9
17.12.2016, 06:38
Цитата Сообщение от XlorensX Посмотреть сообщение
Написать программу, которая удаляет повторяющиеся элементы в матрице
В списке списков, наверное? Или я линейную алгебру забыл.
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38195 / 21128 / 4309
Регистрация: 12.02.2012
Сообщений: 34,733
Записей в блоге: 14
17.12.2016, 12:36
Удалять повторяющиеся элементы в матрице - операция, лишенная смысла. Удалять можно из списка списков.

Добавлено через 8 минут
Вот удаление повторений в каждой строке:

Haskell
1
2
3
4
5
6
setOf :: (Eq a) => [a] -> [a]
setOf [] = []
setOf (x:xs) = x : (setOf $ filter (/=x) xs)
 
task :: (Eq a) => [[a]] -> [[a]]
task x = map setOf x
3
Модератор
 Аватар для Curry
5158 / 3488 / 536
Регистрация: 01.06.2013
Сообщений: 7,567
Записей в блоге: 9
17.12.2016, 12:45
Если из списка списков, то я сочинил такую функцию, без явных рекурсивных вызовов, зато использующую map,filter,fix,until - каждую по разу. Ну ещё (.) пару раз. Но я её не выкладываю, дабы не мешать педагогическому процессу XRuZzz-а. Может ТС проникся и сам хочет решить (что всячески приветствуется). Или ТС нужна не такая ф-ия :
Haskell
1
nub2D :: Eq a => [[a]] -> [[a]]
2
2 / 2 / 0
Регистрация: 06.11.2011
Сообщений: 28
17.12.2016, 15:34  [ТС]
Большое спасибо всем за помощь. Особенно XRuZzz за полезную информацию, а Catstail за готовое решение.
0
Антикодер
Эксперт функциональных языков программирования
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088
18.12.2016, 02:02
Удалить дубликаты в списке:
Haskell
1
nubList = foldl (\xs x-> if not $ x `elem` xs then xs++[x] else xs) []
Реализация ФВП foldl есть в википедии
2
Модератор
 Аватар для Curry
5158 / 3488 / 536
Регистрация: 01.06.2013
Сообщений: 7,567
Записей в блоге: 9
18.12.2016, 08:23

Не по теме:

Первый раз мне плюсов наставили за то что я НЕ выложил свой код. :D



Добавлено через 5 часов 21 минуту

Не по теме:

Я тут, а потом тут озаботился исправлением подсветки HASKELL на форуме, что бы она не выглядела как, к примеру, в этой теме. В отдельную тему это не выделяю, т.к. получились бы две схожие темы в разделе php и тут, что противу правил. В общем, кто что думает, может тут и php знающие есть? Или, может я что то упускаю?

2
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38195 / 21128 / 4309
Регистрация: 12.02.2012
Сообщений: 34,733
Записей в блоге: 14
18.12.2016, 09:07
XRuZzz, лучше использовать правую свертку (: быстрее, чем ++)

Haskell
1
nubList z = foldr (\ x xs -> if not $ x `elem` xs then x:xs else xs) [] z
Добавлено через 1 минуту
KolodeznyDiver, мне кажется, что реакция на одиночный апостроф в раскраске не совсем корректна.
3
18.12.2016, 10:44

Не по теме:

Цитата Сообщение от Catstail Посмотреть сообщение
KolodeznyDiver, мне кажется, что реакция на одиночный апостроф в раскраске не совсем корректна.
Психиатр говорит что моя реакция тут вполне корректна: стремление улучшить что то реальное и нужное - признак социальной адаптации. :)

0
2 / 2 / 0
Регистрация: 06.11.2011
Сообщений: 28
18.12.2016, 14:59  [ТС]
Сделал как смог программ (просто нельзя использовать готовые функции, нужно использовать свои). Вот что получилось:

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
element :: Int -> [Int]->Bool
element _ [] = False
element x (h:t) = if (x==h) then True
                  else element x t
 
insert :: [Int]->Int->[Int]
insert s x = if element x s then s
             else x:s
 
set :: [Int]->[Int]
set []=[]
set (x:xs) = insert (set xs) x
 
set_matr :: ([Int]->[Int])->[[Int]]->[[Int]]
set_matr f(x:xs) = f(x) : set_matr f(xs)
Но вылетает следующая ошибка:

Haskell
1
2
3
Main> set_matr set [[1,2,3,1,2,3],[4,5,6,4,4],[7,7,8,9]]
[[1,2,3],[5,6,4],[7,8,9]
Program error: pattern match failure: set_matr set []
Можете помочь исправить? Я так понимаю ошибка связана со строчкой
Haskell
1
set []=[]
0
Модератор
 Аватар для Curry
5158 / 3488 / 536
Регистрация: 01.06.2013
Сообщений: 7,567
Записей в блоге: 9
18.12.2016, 15:23
Конкретно эта ошибка фиксится так
Haskell
1
2
3
set_matr :: ([Int]->[Int])->[[Int]]->[[Int]]
set_matr f [] = []
set_matr f (x:xs) = f(x) : set_matr f(xs)
Добавлено через 5 минут
Что же у вас за комилятор и почему вы именно им должны пользоваться?
Вот, хотя бы online-комилятор.
В сообщении "prog: prog.hs:16:1-41: Non-exhaustive patterns in function set_matr", думаю, не спутали бы где ошибка.
2
2 / 2 / 0
Регистрация: 06.11.2011
Сообщений: 28
18.12.2016, 16:54  [ТС]
Hugs98, требование преподавателя.

Добавлено через 11 минут
Спасибо всем за помощь. Вот итоговый код:
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
element :: Int -> [Int]->Bool
element _ [] = False
element x (h:t) = if (x==h) then True
                  else element x t
 
insert :: [Int]->Int->[Int]
insert s x = if element x s then s
             else x:s
 
set :: [Int]->[Int]
set []=[]
set (x:xs) = insert (set xs) x
 
set_matr :: ([Int]->[Int])->[[Int]]->[[Int]]
set_matr f [] = []
set_matr f (x:xs) = f(x) : set_matr f(xs)
 
del_num :: [[Int]]->[[Int]]
del_num x = set_matr set x
del_num - оболочка, вызывать через неё. Может кому-нибудь пригодится программа) Еще раз спасибо)))

Добавлено через 8 минут
KolodeznyDiver через онлайн-компилятор все работает.
2
Модератор
 Аватар для Curry
5158 / 3488 / 536
Регистрация: 01.06.2013
Сообщений: 7,567
Записей в блоге: 9
18.12.2016, 17:28
В функции set_matr избыточно жёсткие ограничения типов аргументов. Откомпилируется если задать и так
Haskell
1
set_matr :: (a->a)->[a]->[a]
Тогда какая же это set_matr ? Это всё равно что функцию вычисления гипотенузы прямоугольного треугольника назвать длина_откоса_крыльца потому что в конкретной задаче требовалось именно это. Нет стремления к созданию повторно используемого кода.

Не по теме:

В этом виноват такой подход к обучению - велостроительный. Это как если бы врачей учили вначале пользоваться чем из дому принесут - кухонными и маникюрными инструментами, а потом уже давали скальпели и отсосы всякие.



Добавлено через 25 минут

Не по теме:

Ладно. Зря меня опять на эту тему понесло. Предлагаю не обращать внимания.


XlorensX, хоть в задании, как вы его изложили, и не сказано, но, обычно, оставляют первый из повторяющихся элементов в списке.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
18.12.2016, 18:34
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
хоть в задании, как вы его изложили, и не сказано, но, обычно, оставляют первый из повторяющихся элементов в списке.
Элементы равны по Eq, значит это требование влияет только на порядок. Но поскольку название set как бы намекает, что нам интересно только само содержимое множества, без учета порядка расположения элементов в нем, то можно оставлять любой.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.12.2016, 18:34
Помогаю со студенческими работами здесь

Функции высшего порядка
Здравствуйте! Прошу вашей помощи:) Есть программа. Ее нужно изменить так, чтобы в ней не применялась функция map, которая преобразует...

Функции высшего порядка
Используя функцию нахождения производной и преобразование Ньютона для нахождения нулей функции реализовать нахождение одного из локальных...

Функции высшего порядка
Всем доброго вечера :) По заданному имени и списку идентификаторов (базе данных) возвращающая тип идентификатора с указанным именем ...

Функции высшего порядка
Добрый вечер. Даны пять функций: 1: isStructured, проверяющая, что её аргумент является сложным типом. 2: getType, по заданному...

Функции высшего порядка
В агентстве недвижимости продают квартиры, комнаты и частные дома. Квартира характеризуется этажом, площадью и этажность дома. Комната...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru