Представление списков в ФП

Jun 19, 2010 18:44

Возник такой вопрос. Как устроены cons-списки, большей части читающих известно :) А мне сейчас пригодилось бы неизменяемое представление списков в неленивом функциональном языке с хвостовой рекурсией, которое хорошо поддерживает две операции ( Read more... )

ФП, программирование, scala

Leave a comment

Comments 14

antilamer June 19 2010, 16:04:43 UTC
В Окасаки же должно быть что-то такое.

Reply

alexey_rom June 19 2010, 18:16:32 UTC
Да, действительно нужно было посмотреть первым делом. Сейчас этим и займусь.

Reply

alexey_rom June 20 2010, 11:35:07 UTC
Ну конечно, 10.2.1 Lists with efficient catenation.

Reply


anonymous June 19 2010, 16:09:50 UTC
Сложная схема балансирования?! Вы ни с чем не перепутали? Перечитайте-ка на всякий случай "Finger Trees: A Simple General-purpose Data Structure" by Ralf Hinze and Ross Paterson http://www.soi.city.ac.uk/~ross/papers/FingerTree.pdf

Reply

alexey_rom June 19 2010, 18:14:07 UTC
Нет, не перепутал :) Конечно, сравнительно. Скажем, по сравнению с general balanced trees она сложная.

Reply


anonymous June 19 2010, 16:47:35 UTC

{-# LANGUAGE RankNTypes #-}
module Main where
import Prelude hiding(iterate)

type Cat a = forall s. (a -> s -> s) -> s -> s

singleton :: a -> Cat a
catenate :: Cat a -> Cat a -> Cat a
iterate :: (a -> s -> s) -> s -> Cat a -> s

singleton a f s = f a s
catenate a b f s = a f (b f s)
iterate f s a = a f s

main = putStrLn (show test)
where
test = iterate (:) [] list
list = singleton 1 `catenate` singleton 2 `catenate` singleton (3::Int)

Reply

alexey_rom June 19 2010, 18:06:03 UTC
Это и есть conc-списки (в представлении через катаморфизм, но это дела, по-моему, не меняет).

Reply


anonymous June 19 2010, 22:28:41 UTC
Между прочим, если итерировать conc в CPS стиле, то будет O(n), но без использования стека.

Reply

alexey_rom June 20 2010, 05:25:35 UTC
Ну, с использованием пользовательского стека. Переполнения не будет, да.

Reply


zevlg June 20 2010, 08:11:51 UTC
да вы чего ребят? стандартный tailq реализуется за 5 минут, удовлетворяет всем требованиям..

Reply

alexey_rom June 20 2010, 11:33:30 UTC
Вот этот? Почти всем. Кроме главного -- персистентности :) Если есть неизменяемый вариант с теми же характеристиками, то скажите, куда смотреть :)

Reply

zevlg June 20 2010, 11:59:06 UTC
так ли действительно нужен немутабельный вариант? или там интересный алгоритм и неизвестно как будут конструироваться данные?

Reply

alexey_rom June 20 2010, 12:03:09 UTC
Да, нужен именно немутабельный. Иначе бы вопроса не было.

Reply


Leave a comment

Up