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

Исключение повтора из списка

27.11.2015, 23:44. Показов 1521. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Моя задача - реализация электронной записной книжки.
2) getByLetter, возвращающая список людей, о которых есть информация в записной книжке и чьё имя начинается на указанную букву.

"Реализовать это задание с помощью функций высшего порядка. Постарайтесь полностью исключить из определений функций явный проход по списку."

пытаюсь реализовать функцию:
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
data NoteBook = Birthday String (Int,Int) | PhoneFriend String Int | DateMeet String (Int,Int,Int)
 
getName :: NoteBook -> String
getName (PhoneFriend x _) = x
getName (Birthday x _) = x
getName (DateMeet x _) = x
 
getByLetter :: [NoteBook] -> Char -> [String]
getByLetter xs ch = filter (\x -> head x == ch ) (map getName xs)
 
note = [ (Birthday "Kate" (24,11)), (Birthday "Boris" (31,12)), (Birthday "Nina" (31,12)), (Birthday "Mark" (12,08)), (Birthday "Lysi" (20,10)), 
         (PhoneFriend "Kate" 456456), (PhoneFriend "Boris" 789789), (PhoneFriend "Nina" 123456), (PhoneFriend "Lysi" 5654777), (PhoneFriend "hairdresser - Jein" 111111),
         (DateMeet "Party with Kate" (07,07,2016)), (DateMeet "hairdresser - Jein" (31,12,2015)), (DateMeet "Klient - Scott Blein" (22,01,2016)), (DateMeet "to buy a present to Boris" (31,12,2015))
       ]
       
main = do print $ ( getByLetter note 'K' )
какой filter или map добавить, чтобы вывод был без повторов? затрудняюсь, потому что нужно искл явный проход списка. можно было бы проверять elem в фильтре, когда он создает новый список, но как его поймать? вобщем путаница..

еще такой вариант был- это использование nub. но хочется просмотреть все возможные варианты.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.11.2015, 23:44
Ответы с готовыми решениями:

Исключение элементов списка
ИСКЛЮЧЕНИЕ ЭЛЕМЕНТОВ СПИСКА 1. Составить список учебной группы, содержащей 10 учащихся. 2. Указать для каждого учащегося оценки,...

Исключение элементов из списка
Составить список учебной группы, содержащий не менее 15 учащихся. Указать для каждого учащегося оценки, полученные на последних четырех...

Исключение элементов из списка
Постановка задачи в PascalABC Составить список учебной группы, содержащей не менее 15 учащихся. Указать для каждого учащегося оценки,...

1
Модератор
 Аватар для Curry
5158 / 3482 / 536
Регистрация: 01.06.2013
Сообщений: 7,549
Записей в блоге: 9
28.11.2015, 04:09
Лучший ответ Сообщение было отмечено Dick777 как решение

Решение

Цитата Сообщение от ****777 Посмотреть сообщение
еще такой вариант был- это использование nub
Это самый правильный вариант - использовать библиотечную функцию, специально для того предназначенную.
Так что у Вас всё правильно. Некоторые замечания:
- Если строка с именем окажется пустой, то head кинет исключение. По этому лучше вначале проверить на пустоту.
- У Вас много лишних скобок. См. ниже. Не стесняйтесь применять функцию $.
- Я написал getByLetter "по Вашему", т.е. в точечной нотации, но этот вариант закомментировал, потому что, если переставить аргументы местами, то можно записать в бесточечной нотации покороче (и принято считать что покрасивше, хотя эстестика субъективна, конечно).
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
import Data.List
 
data NoteBook = Birthday String (Int,Int) | PhoneFriend String Int | DateMeet String (Int,Int,Int)
 
getName :: NoteBook -> String
getName (PhoneFriend x _) = x
getName (Birthday x _) = x
getName (DateMeet x _) = x
 
{-
getByLetter :: [NoteBook] -> Char -> [String]
getByLetter xs ch = nub $ filter (\x -> not (null x) && head x == ch ) $ map getName xs
-}
getByLetter :: Char -> [NoteBook] -> [String]
getByLetter ch = nub . filter (\x -> not (null x) && head x == ch ) . map getName
 
note:: [NoteBook]
note = [ Birthday "Kate" (24,11), Birthday "Boris" (31,12), Birthday "Nina" (31,12)
       , Birthday "Mark" (12,08), Birthday "Lysi" (20,10), PhoneFriend "Kate" 456456
       , PhoneFriend "Boris" 789789, PhoneFriend "Nina" 123456, PhoneFriend "Lysi" 5654777
       , PhoneFriend "hairdresser - Jein" 111111, DateMeet "Party with Kate" (07,07,2016)
       , DateMeet "hairdresser - Jein" (31,12,2015), DateMeet "Klient - Scott Blein" (22,01,2016)
       , DateMeet "to buy a present to Boris" (31,12,2015), Birthday "" (24,11)
       ]
 
main :: IO ()
-- main = print $ getByLetter note 'K'
main = print $ getByLetter 'K' note
Добавлено через 28 минут
Цитата Сообщение от ****777 Посмотреть сообщение
можно было бы проверять elem
Вот Вам самодельный nub с использованием elem. Можно его применить вместо обычного если считать что свёртка - это не явный проход по списку.
Haskell
1
2
myNub :: Eq a => [a] -> [a]
myNub = foldr (\x r -> if x `elem` r then r else  x:r) []
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.11.2015, 04:09
Помогаю со студенческими работами здесь

Исключение при удалении из списка
class Example { string _name; int _number; public: Example() :Example("Example", 0) {} Example(string str, int num) ...

Исключение максимального элемента из списка
Нужно вывести сумму всех элементов массива, кроме максимального. Я пока что не очень хорошо знаю функцию фильтр. Прошу помочь и если...

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

Сериализация и десериализация списка и словаря. Вызывается исключение
Добрый день. У меня не получается сериализация и десериализация списка и словаря. Вызывается исключение using System; using...

Необработанное исключение. Проблема с доступом к элементам списка
В первой функции исключение на ифе. Как исправить? void deletest(struct SStudent** head) { struct SStudent* ptr = *head; while...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru