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

Функция dropWhile

25.05.2014, 18:48. Показов 3439. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
Как обычно вопрос от новичка
Есть такая функция dropWhile, которая исключает элементы из списка по заданому значению.
Вот как предлагает Hoogle ее интерпретировать:
Haskell
1
2
3
4
5
dropWhile               :: (a -> Bool) -> [a] -> [a]
dropWhile _ []          =  []
dropWhile p xs@(x:xs')
            | p x       =  dropWhile p xs'
            | otherwise =  xs
вот что сделал я
Haskell
1
2
3
4
5
dropWhile1 :: (a -> Bool) -> [a] -> [a]
dropWhile1 _ [] = []
dropWhile1 p (x:xs)
    | p x = dropWhile1 p xs
    | otherwise = xs
Работают одинаково, так для чего же пишется знак @? Какую функцию он выполняет

Добавлено через 8 минут
обманул
dropWhile (<2) [1..10]
[2,3,4,5,6,7,8,9,10]

dropWhile1 (<2) [1..10]
[3,4,5,6,7,8,9,10]
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.05.2014, 18:48
Ответы с готовыми решениями:

Функция sqrt: существует более одного экземпляра. Функция перегруженная
#include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;iomanip&gt; using namespace std; int main(){ float s, p; int c, a; s=0; ...

Функция удаления текста в скобках [2], непосредственно функция + 12кб вложений
Доброго времени суток, случилось так, что пришлось работать с с-строками (лаба, угу), в которой нужно удалить весь текст в скобках,...

Перегрузка операций: friend-функция или функция-член класса
Здравствуйте, меня интересует вопрос, в чем разница при перегрузке операторов через operator и friend. Вот к примеру такой код. class...

6
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,205
Записей в блоге: 24
25.05.2014, 18:55
Работают они не одинаково. Кстати, Вы недокопировали конец кода: otherwise = xs.

Это можно переписать так:
Haskell
1
2
3
4
5
dropWhile :: (a -> Bool) -> [a] -> [a]
dropWhile _ [] = []
dropWhile p (x:xs)
    | p x = dropWhile1 p xs
    | otherwise = x:xs
В чем разница, ощутимо по примеру dropWhile even [1,2,3,4]. У Вас будет на один элемент больше.
0
1 / 1 / 0
Регистрация: 21.04.2014
Сообщений: 65
25.05.2014, 19:01  [ТС]
Ага. Уже исправил
Но из-за чего так происходит?

Добавлено через 3 минуты
Вот поправил
Haskell
1
2
3
4
5
dropWhile1 :: (a -> Bool) -> [a] -> [a]
dropWhile1 _ [] = []
dropWhile1 p (x:xs)
    | p x = dropWhile1 p xs
    | otherwise = (x:xs)
Так для чего же нужен @?
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
25.05.2014, 19:06
Цитата Сообщение от Kvintero Посмотреть сообщение
Так для чего же нужен @?
Синтаксический сахар. В записи xs@(x:xs') xs - весь список, x - голова, xs' - хвост. Чтобы постоянно не писать (x:xs'), когда требуется весь лист.
2
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38192 / 21125 / 4309
Регистрация: 12.02.2012
Сообщений: 34,732
Записей в блоге: 14
25.05.2014, 20:52
Цитата Сообщение от Kvintero Посмотреть сообщение
Вот поправил
- плохо поправил... Правильно так:

Haskell
1
2
3
4
dropWhile' :: (a -> Bool) -> [a] -> [a]
dropWhile' _ [] = []
dropWhile' p (x:xs) | p x = dropWhile' p xs
                    | otherwise = x : (dropWhile' p xs)
Добавлено через 4 минуты
Знак "@" полезен для случая, когда нужно и разбиение списка на первый элемент и хвост (x:xs), и весь список в целом. Без собаки обойтись можно, но тогда там, где нужен x, придется писать (head xx), а там, где нужен xs, придется писать (tail xx). Более многословно.

PS

В реализации dropWile собака не нужна.
0
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,205
Записей в блоге: 24
25.05.2014, 21:16
Catstail, ТС зашел в Hoogle и скопипастил оттуда код:
Haskell
1
2
3
4
5
dropWhile               :: (a -> Bool) -> [a] -> [a]
dropWhile _ []          =  []
dropWhile p xs@(x:xs')
            | p x       =  dropWhile p xs'
            | otherwise =  xs
здесь, как Вы видите, есть собака.
Я заметил, что он не до конца его скопипастил, проглотив последнюю букву s в слове xs.
После этого я привёл эквивалентный код, убрав собаку из определения dropWhile, которое в hoogle.
После этого ТС поменял свой код, приведя его ровно к тому же виду и спросил о значении символа @, на что ему ответили.
Ваш же код занимается фильтрацией, а не отбрасывание префикса.
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38192 / 21125 / 4309
Регистрация: 12.02.2012
Сообщений: 34,732
Записей в блоге: 14
25.05.2014, 21:36
Цитата Сообщение от Mysterious Light Посмотреть сообщение
Ваш же код занимается фильтрацией, а не отбрасывание префикса.
- Да, согласен. Не вник. Для dropWhile собака нужна.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.05.2014, 21:36
Помогаю со студенческими работами здесь

Какую библиотеку надо подключать чтоб работала функция _getch() и функция cin.get()?
какую библиотеку надо подключать чтоб работала функция _getch() и функция cin.get()

Выясните, сохраняет ли булева функция 0, 1, является ли функция линейной, монотонной, само двойственной?
Помогите пожалуйста!!! Булева функция задана вектором значений F(x)=(1001) Выясните, сохраняет ли эта функция 0, 1, является ли эта...

Функция - Pos(s,s1). Назначение - поиск первого вхождения подстроки s1 в строку s (аналогичная функция C - strstr)
Функция - Pos(s,s1). Назначение - поиск первого вхождения подстроки s1 в строку s (аналогичная функция C - strstr).Помогите плииз

Чистая виртуальная функция функция не имеет оператора переопределения
Пишу программу для записи заметок. Есть 2 класса: Page и Note. Note наследуется от Page. Page.h #pragma once ...

Функция нахождения максимума в строке матрицы и функция вычисления ||D||
Помогите написать программу. Заранее спасибо. Даны вещественные матрицы A, B, C размером 5x6. Вычислить величину ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
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 и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru