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

Поясните код

17.12.2014, 08:25. Показов 1537. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую вас форумчане, недавно начала работать с хаскелем имеются две следующие функции если не сложно, то объясните построчно.
первым как я поняла идет удаление списка, непонятно что означает именно вот эта запись [] _, дальше вроде бы понятно, что если голова то удаляем голову если хвост удаляем хвост. Ну и с заменой тоже вроде бы аналогично непонятно [] _ _ = []

Haskell
1
2
3
4
5
6
7
8
9
10
delete :: String -> Char -> String
delete []     _ = []
delete (s:sx) c
    | s == c    =   delete sx c 
    | otherwise = s:delete sx c
 
replace []     _ _ = []
replace (s:sx) c f 
    | s == c    = f:replace sx c f
    | otherwise = s:replace sx c f
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.12.2014, 08:25
Ответы с готовыми решениями:

Поясните код
Работаю с одной cms. ну так вод поясните назначение кода приведенного ниже? ...

Поясните код!
Разъясните пожалуйста мне работу вот этих строчек ".Execute Replace:=wdReplaceAll, Forward:=True, _ Wrap:=wdFindContinue" Sub...

Поясните код
Здравствуйте. У меня есть программа. Мне нужно ее разъяснить преподавателю, но я ее не сам писал. Поясните пожалуйста поподробнее, что тут...

17
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
17.12.2014, 09:27
_ обычно обозначают игнорируемые параметры
Haskell
1
2
3
4
5
6
7
8
9
10
11
delete :: String -> Char -> String
-- удаляет из списка символ c
delete []     _ = [] -- для пустого списка возвращается пустой список, 2й аргумент функции игнорируется
delete (s:sx) c
    | s == c    =   delete sx c -- если голова == удаляемому символу, то отбросить голову, продолжить с хвостом
    | otherwise = s:delete sx c -- иначе голову оставляем и проверяем хвост
-- заменяет элемент c на элемент f
replace []     _ _ = [] -- результат от пустого списка - пустой список
replace (s:sx) c f 
    | s == c    = f:replace sx c f -- s - искомый, заменяем
    | otherwise = s:replace sx c f -- иначе оставляем
как то так...
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38180 / 21115 / 4307
Регистрация: 12.02.2012
Сообщений: 34,722
Записей в блоге: 14
17.12.2014, 10:46
Цитата Сообщение от Александра2014 Посмотреть сообщение
первым как я поняла идет удаление списка
- удаление всех вхождений символа из списка.

Цитата Сообщение от Александра2014 Посмотреть сообщение
что если голова то удаляем голову если хвост удаляем хвост
- если голова совпадает с удаляемым символом, то пропускаем голову и применяем функцию к хвосту. А если не совпадает, то присоединяем голову к результату удаления заданного символа из хвоста.

Тело функции состоит из образцов, которые применяются последовательно. Образец вида "delete [] _ = []" означает, "удаление любого (_) элемента из пустого списка дает пустой список". Этот образец служит терминальной ветвью рекурсии.
1
Модератор
 Аватар для Curry
5158 / 3486 / 536
Регистрация: 01.06.2013
Сообщений: 7,562
Записей в блоге: 9
17.12.2014, 15:38
Цитата Сообщение от Catstail Посмотреть сообщение
Образец вида "delete [] _ = []" означает, "удаление любого (_) элемента из пустого списка дает пустой список"
Нет. Этот образец означает что передано два значения (в данном случае у функции два аргумента). Совпадение с образцом если первый аргумент - пустой список, а значение второго не важно. Если совпадение - возвращаем пустой список.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38180 / 21115 / 4307
Регистрация: 12.02.2012
Сообщений: 34,722
Записей в блоге: 14
17.12.2014, 16:04
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Нет
- и что у меня неверно?
0
Модератор
 Аватар для Curry
5158 / 3486 / 536
Регистрация: 01.06.2013
Сообщений: 7,562
Записей в блоге: 9
17.12.2014, 16:28
Цитата Сообщение от Catstail Посмотреть сообщение
и что у меня неверно?
Приведённый шаблон ничего не удаляет. Неверно утверждение "Образец вида "delete [] _ = []" означает". В объяснении конкретной функции можно было написать что то вроде: строка delete [] _ = [] введена для обработки ситуации, когда первый аргумент равен пустой строке. Тогда второй аргумент не важен. Возвращается пустая строка. Такая ситуация возникает в конце итерации по любой строке. Впрочем, подобное уже написано :
Цитата Сообщение от Cra3y Посмотреть сообщение
delete [] _ = [] -- для пустого списка возвращается пустой список, 2й аргумент функции игнорируется
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38180 / 21115 / 4307
Регистрация: 12.02.2012
Сообщений: 34,722
Записей в блоге: 14
17.12.2014, 16:39
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Приведённый шаблон ничего не удаляет.
- конечно. Удаляет функция. Вы совершенно правы. Но ничего принципиально неверного в моем посте (как и в посте Cra3y) нет.
0
Модератор
 Аватар для Curry
5158 / 3486 / 536
Регистрация: 01.06.2013
Сообщений: 7,562
Записей в блоге: 9
17.12.2014, 16:51
Цитата Сообщение от Catstail Посмотреть сообщение
Но ничего принципиально неверного в моем посте (как и в посте Cra3y) нет
В посте Cra3y всё верно. А у Вас "delete [] _ = []" означает, "удаление любого (_) элемента из пустого списка. Здесь (_) не относится к списку. Оно означает игнор второго аргумента.
И всё предложение неверно по другой причине - "Образец ... удаление ... дает пустой список".
Образец ничего не удаляет и не даёт пустой список. Представте себе человека ничего не знающего про образцы. Как он после этого поймёт как они работают.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38180 / 21115 / 4307
Регистрация: 12.02.2012
Сообщений: 34,722
Записей в блоге: 14
17.12.2014, 17:17
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Представте себе человека ничего не знающего про образцы. Как он после этого поймёт как они работают.
- читаем то, что я написал. "Тело функции состоит из образцов. Они применяются последовательно".

Cra3y писал "удаляет из списка символ c... -- для пустого списка возвращается пустой список, 2й аргумент функции игнорируется"

Я писал ""delete [] _ = []" означает, "удаление любого (_) элемента из пустого списка дает пустой список"

В чем разница (причем, как я вижу, принципиальная) - я не понимаю. Это не страшно (не всем же быть понятливыми!), но хочется разобраться...

Под рукой оказалась книга Макеева Г.А. "Основы функционального программирования на языке Haskell". Вот объяснение из этой книги:

Haskell
1
2
inclist [] = []
inclist (x:xs) = x+1 : inclist xs
Вот как мы прочитаем эту функцию: "Функция inclist от пустого списка возвращает пустой список. А функция inclist от любого другого списка возвращает x+1 : inclist xs , где x - это голова этого списка, а xs - хвост".

... Функция от пустого дает пустой ... Макеев
... Удаление из пустого ... дает пустой ... Ваш покорный слуга.

Хоть убей, не ощущаю разницы.
0
Модератор
 Аватар для Curry
5158 / 3486 / 536
Регистрация: 01.06.2013
Сообщений: 7,562
Записей в блоге: 9
17.12.2014, 17:36
Цитата Сообщение от Catstail Посмотреть сообщение
В чем разница (причем, как я вижу, принципиальная) - я не понимаю. Это не страшно (не всем же быть понятливыми!), но хочется разобраться...
Каждое предложение в объяснении должно быть истинным.
Цитата Сообщение от Catstail Посмотреть сообщение
Образец вида "delete [] _ = []" означает, "удаление любого (_) элемента из пустого списка дает пустой список".
- ложно по двум причинам:
1) delete [] _ = []- не образец, образец только [] _ и он ничего не удаляет (и в выражении в целом ничего не удаляется).
2) Из фрагмента фразы "удаление любого (_) элемента из пустого списка" следует что (_) - это обозначение любого элемента списка, когда, на самом деле, это обозначение любого второго аргумента функции, который не список.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38180 / 21115 / 4307
Регистрация: 12.02.2012
Сообщений: 34,722
Записей в блоге: 14
17.12.2014, 18:18
Спасибо, все ясно.

Добавлено через 1 минуту
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Каждое предложение в объяснении должно быть истинным.
- это очень жесткое (и, в целом, невыполнимое) требование. Смысл именно в этом. И в упорстве участников.

Добавлено через 7 минут
Кстати, в Вашем первом замечании Вы сами написали "Этот образец означает что передано", другими словами, молчаливо согласились, что это - образец. Ситуация для разговорного языка вполне заурядная. Я и сам люблю точные формулировки. Но сугубая точность нужна там, где неточность "дорого стоит". Здесь же случай явно не тот.
0
Модератор
 Аватар для Curry
5158 / 3486 / 536
Регистрация: 01.06.2013
Сообщений: 7,562
Записей в блоге: 9
17.12.2014, 18:45
Цитата Сообщение от Catstail Посмотреть сообщение
Кстати, в Вашем первом замечании Вы сами написали "Этот образец означает что передано", другими словами, молчаливо согласились, что это - образец
Вначале я не расписывал подробно, полагая что и так будет понятно. Потом расписал. А в объяснении работы функции новичку неточность "дорого стоит".
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38180 / 21115 / 4307
Регистрация: 12.02.2012
Сообщений: 34,722
Записей в блоге: 14
17.12.2014, 21:26
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Вначале я не расписывал подробно, полагая что и так будет понятно.
- вот и я о том же... А цена вопроса в этом контексте не может быть дорогой. Ну, хорошо... Образцом является не весь "клоз", а только "[] _". Если я буду считать образцом "delete [] _", что-либо фатально изменится? Нет. Поэтому и в литературе зачастую образцом называют "delete [] _". Это было бы важно, если бы создавался парсер Haskell-кода, а так...
0
Модератор
 Аватар для Curry
5158 / 3486 / 536
Регистрация: 01.06.2013
Сообщений: 7,562
Записей в блоге: 9
17.12.2014, 21:44
Цитата Сообщение от Catstail Посмотреть сообщение
вот и я о том же...
Когда я вначале написал "Этот образец означает ..." я не указал какой образец, в этом неточность и только, можно было указать "[] _".
Вряд ли в какой то литературе в образец включают и имя функции и знак равенства с выражением - это ошибка.
"delete [] _ = []" означает, "удаление любого (_) элемента из пустого списка - ошибка, т.к. подразумевает что что (_) - это любой элемент списка, а в данном случае, не так. Сама фраза "удаление любого элемента из пустого списка" не имеет смысла. Вся строка кода о которой идёт речь ничего не удаляет а служит для завершения итерации - вот где ошибка.

p.s: а если я где допускаю ошибки в тексте, то только рад если мне на них указывают.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38180 / 21115 / 4307
Регистрация: 12.02.2012
Сообщений: 34,722
Записей в блоге: 14
18.12.2014, 08:38
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
а если я где допускаю ошибки в тексте, то только рад если мне на них указывают
- в Вашем духе (стремление к абсолютной точности), я бы сказал так: "я благодарен тем, кто указывает на мои ошибки".
0
1 / 1 / 3
Регистрация: 25.03.2013
Сообщений: 119
15.01.2015, 17:26
а как удаляется голова списка?
Haskell
1
2
3
delete (s:sx) c
    | s == c    =   delete sx c 
    | otherwise = s:delete sx c
--если голова совпадает с удаляемым символом, то пропускаем голову и применяем функцию к хвосту
--А если не совпадает, то присоединяем голову к результату удаления заданного символа из хвоста
это если код на русский язык переводить, но что происходит если у нас удаляется голова списка на ее место приходит следующий элемент списка допустим список abdef голова a хвост bdef, что дальше происходит если смотреть по коду
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38180 / 21115 / 4307
Регистрация: 12.02.2012
Сообщений: 34,722
Записей в блоге: 14
15.01.2015, 17:53
Голова списка - s. Если s==c, происходит рекурсивный вызов delete sx c. Голова проигнорирована (и не попадет в результат). Имейте в виду, что функции ничего не меняют в исходных данных, а создают результат
1
1 / 1 / 3
Регистрация: 25.03.2013
Сообщений: 119
16.01.2015, 04:44
а потом к результату она добавляется вот тут?
Haskell
1
 | otherwise = s:delete sx c
Добавлено через 51 секунду
то етсь у строки abdef a вначале игноиррует а потом добавляется к хвосту, что тогда становится головой?

Добавлено через 10 часов 41 минуту
разобрался
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.01.2015, 04:44
Помогаю со студенческими работами здесь

Поясните код
Прошу пояснить, видимо что то я не так понимаю. i=-3; j=2; k=0; m = ++i ? j++ : ++k; printf("%d, %d, %d,...

Поясните код
double **a = new double *;

Поясните код
Наткнулся на http://brain-sharper.blogspot.ru/2012/03/httplistener.html Ответьте пожалуйста на вопросы в коде. string url =...

Поясните код
#include "stdafx.h" #include "files.h" #include <stdio.h> #include<CommCtrl.h> #include <Ktmw32.h> #pragma comment (lib,...

Поясните код
.section .data var: .long 555 frmt: .ascii "%d\n" . section .text .global main main:


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru