OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 21 Ноябрь, 2019 18:36

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
 Заголовок сообщения: Haskell & возможности pattern matching-а
СообщениеДобавлено: Суббота, 08 Август, 2009 14:34 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Для встроенного типа "список" (который [a]), можно написать нечто вроде:
Код:
foo (x:xs) = что-то-там


Есть ли подобные возможности для пользовательских типов данных?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Haskell & возможности pattern matching-а
СообщениеДобавлено: Воскресенье, 09 Август, 2009 18:38 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Ну да. Вот, например:
Код:
data List a = Nil | Cons a (List a)

foo Nil = что-то там
foo (Cons x xs) = что-то там ещё

Вот конкретный пример:
Код:
data List a = Nil
            | Cons a (List a)

foo  Nil        = []
foo (Cons x xs) = x:foo xs

main = do
    print $ foo $ Cons 1 $ Cons 2 $ Cons 3 Nil
Код:
[1,2,3]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Haskell & возможности pattern matching-а
СообщениеДобавлено: Воскресенье, 16 Август, 2009 23:27 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Тупой вопрос: а почему вот тут:

Код:
foo (x:xs) = ...


в x у нас будет именно что первый элемент списка, а в xs всё остальное? Почему не наоборот? Почему не, скажем половина списка в x а половина в xs?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Haskell & возможности pattern matching-а
СообщениеДобавлено: Понедельник, 17 Август, 2009 07:30 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Ну икс -- голова списка, иксы -- хвост. Так исторически сложилось, что голова в начале, хвост в конце... :lol:

Что такое операция (:) ? Это же просто конструктор списка, который берёт некий элемент x и некоторый список xs и создаёт новый список, у которого в голове x, а в хвосте xs.
Точно так же, когда этот конструктор используется в паттерн матчинге в функции foo, он разбирает поданный ему список на голову x и хвост xs...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Haskell & возможности pattern matching-а
СообщениеДобавлено: Понедельник, 17 Август, 2009 11:00 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Ну, вопрос был собственно в том, почему в x будет ровно один элемент а в xs будет список.

Но вроде бы понял. Паттерн патчинг матчит по конструкторам.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Haskell & возможности pattern matching-а
СообщениеДобавлено: Понедельник, 17 Август, 2009 12:05 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Если что, никто не мешает матчить так:
Код:
foo (x:y:zs) = ...
или типа того...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Haskell & возможности pattern matching-а
СообщениеДобавлено: Понедельник, 17 Август, 2009 12:26 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Geniepro писал(а):
Если что, никто не мешает матчить так:
Код:
foo (x:y:zs) = ...
или типа того...


Ну это то понятно. А вот заматчить foo (xs:x) , уже видимо не получится.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Haskell & возможности pattern matching-а
СообщениеДобавлено: Понедельник, 17 Август, 2009 14:01 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Alexey Veselovsky писал(а):
А вот заматчить foo (xs:x) , уже видимо не получится.
Конкретно в Хаскелле не получится -- в нём списки односвязные. В Hope списки были двусвязные, вроде можно было что-то типа этого сделать.
В Хаскелле же последний элемент списка придётся брать функцией last, а начало списка без последнего элемента -- функцией init.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Haskell & возможности pattern matching-а
СообщениеДобавлено: Понедельник, 17 Август, 2009 14:04 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Или сделать собственный тип -- двусвязный список?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Haskell & возможности pattern matching-а
СообщениеДобавлено: Понедельник, 17 Август, 2009 14:32 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Фишка хаскельных списков в том, что они могут быть бесконечными, а разве могут быть бесконечными двусвязные списки? У них же обязательно должны быть две "головы" -- спереди и сзади...
Хотя можно придумать что-то типа x:...inf...:y наверное...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Haskell & возможности pattern matching-а
СообщениеДобавлено: Понедельник, 17 Август, 2009 14:33 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Alexey Veselovsky писал(а):
Или сделать собственный тип -- двусвязный список?

Гугл такую презентацию на эту тему выдал:
http://www.comlab.ox.ac.uk/people/dunca ... askell.pdf


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Haskell & возможности pattern matching-а
СообщениеДобавлено: Понедельник, 17 Август, 2009 16:43 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
А если Вас интересует реализация двусвязных списков на Хаскелле, то вот вариант от Олега Киселёва:
Pure functional, mutation-free, efficient double-linked lists


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB