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-а |
Ну икс -- голова списка, иксы -- хвост. Так исторически сложилось, что голова в начале, хвост в конце... Что такое операция (:) ? Это же просто конструктор списка, который берёт некий элемент 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/ |