【发布时间】:2016-01-11 06:00:42
【问题描述】:
在 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 并没有找到任何符合我描述的库(大小索引可变数组)。
编辑 2: 我想提一下,我曾想过使用 IORef 来获得所需的可变性:
type Array n a = IORef (Vec n a)
但我想知道是否有更好(更高效、更优雅)的选择...
【问题讨论】:
标签: arrays haskell dependent-type