OberonCore
https://forum.oberoncore.ru/

Haskell & возможности pattern matching-а
https://forum.oberoncore.ru/viewtopic.php?f=72&t=1753
Страница 1 из 1

Автор:  Alexey Veselovsky [ Суббота, 08 Август, 2009 14:34 ]
Заголовок сообщения:  Haskell & возможности pattern matching-а

Для встроенного типа "список" (который [a]), можно написать нечто вроде:
Код:
foo (x:xs) = что-то-там


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

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

Ну да. Вот, например:
Код:
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]

Автор:  Alexey Veselovsky [ Воскресенье, 16 Август, 2009 23:27 ]
Заголовок сообщения:  Re: Haskell & возможности pattern matching-а

Тупой вопрос: а почему вот тут:

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


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

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

Ну икс -- голова списка, иксы -- хвост. Так исторически сложилось, что голова в начале, хвост в конце... :lol:

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

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

Ну, вопрос был собственно в том, почему в x будет ровно один элемент а в xs будет список.

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

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

Если что, никто не мешает матчить так:
Код:
foo (x:y:zs) = ...
или типа того...

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

Geniepro писал(а):
Если что, никто не мешает матчить так:
Код:
foo (x:y:zs) = ...
или типа того...


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

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

Alexey Veselovsky писал(а):
А вот заматчить foo (xs:x) , уже видимо не получится.
Конкретно в Хаскелле не получится -- в нём списки односвязные. В Hope списки были двусвязные, вроде можно было что-то типа этого сделать.
В Хаскелле же последний элемент списка придётся брать функцией last, а начало списка без последнего элемента -- функцией init.

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

Или сделать собственный тип -- двусвязный список?

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

Фишка хаскельных списков в том, что они могут быть бесконечными, а разве могут быть бесконечными двусвязные списки? У них же обязательно должны быть две "головы" -- спереди и сзади...
Хотя можно придумать что-то типа x:...inf...:y наверное...

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

Alexey Veselovsky писал(а):
Или сделать собственный тип -- двусвязный список?

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

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

А если Вас интересует реализация двусвязных списков на Хаскелле, то вот вариант от Олега Киселёва:
Pure functional, mutation-free, efficient double-linked lists

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/