В Haskell можно писать функции над индексированным списком размера, гарантирующим, что мы никогда не выходим за пределы. Возможная реализация:Размер индексированных изменяемых массивов в Haskell
data Nat = Zero | Succ Nat deriving (Eq, Ord, Show)
infixr 5 :-
data Vec (n :: Nat) a where
Nil :: Vec 'Zero a
(:-) :: a -> Vec n a -> Vec ('Succ n) a
data Fin (n :: Nat) where
FZ :: Fin ('Succ n)
FS :: Fin n -> Fin ('Succ n)
vLookup :: Vec n a -> Fin n -> a
vLookup Nil _ = undefined
vLookup (x :- _) FZ = x
vLookup (_ :- xs) (FS i) = vLookup xs i
Конечно, это очень хорошо для неизменен размера индексированных списков (он же Vec
).
Но как насчет изменчивых? Можно определить (или есть библиотека для) измененных размеров индексированных массивов в Haskell? Если такой библиотеки нет, как ее можно реализовать?
Редактировать 1: Я искал Hackage и не нашел библиотеку, соответствующую моему описанию (размер индексированных изменяемых массивов).
Edit 2: Я хотел бы отметить, что я думал, что использование IORef
«с, чтобы получить желаемую переменчивость:
type Array n a = IORef (Vec n a)
, но мне интересно, если есть лучше (более эффективный, более элегантные) опция ...
Извините за шум ... Я пропустил эту библиотеку. Спасибо за внимание. –