diff --git a/src/TypeUnary/Nat.hs b/src/TypeUnary/Nat.hs
--- a/src/TypeUnary/Nat.hs
+++ b/src/TypeUnary/Nat.hs
@@ -22,7 +22,7 @@
   , natToZ, natEq, natAdd, natMul
   , IsNat(..)
   -- * Inequality proofs and indices
-  , (:<:)(..), Index(..), succI, index0, index1, index2, index3
+  , (:<:)(..), Index(..), unIndex, succI, index0, index1, index2, index3
   , coerceToIndex
   ) where
 
@@ -130,6 +130,9 @@
 
 -- TODO: Consider removing the Nat n field, since it's computable from
 -- IsNat n or n :<: lim.
+
+unIndex :: (Num a, Enum a) => Index m -> a
+unIndex (Index _ j) = natToZ j
 
 instance Eq (Index lim) where
   Index _ n == Index _ n' = isJust (n `natEq` n')
diff --git a/src/TypeUnary/Vec.hs b/src/TypeUnary/Vec.hs
--- a/src/TypeUnary/Vec.hs
+++ b/src/TypeUnary/Vec.hs
@@ -23,7 +23,7 @@
   (
     module TypeUnary.Nat
   -- * Vectors
-  , Vec(..), headV, tailV, joinV, (<+>), indices
+  , Vec(..), headV, tailV, joinV, (<+>), indices, iota
   , Vec0,Vec1,Vec2,Vec3,Vec4,Vec5,Vec6,Vec7,Vec8,Vec9
   , Vec10,Vec11,Vec12,Vec13,Vec14,Vec15,Vec16
   , vec1, vec2, vec3, vec4, vec5, vec6, vec7, vec8
@@ -250,6 +250,10 @@
 -- (most?) will fail because they rely on a polymorphic combining function.
 
 -- Convert from vector to list via Data.Foldable.toList
+
+-- | Vector of ints from 0 to n-1. Named for APL iota operation (but 0 based).
+iota :: (IsNat n, Num a, Enum a) => Vec n a
+iota = unIndex <$> indices
 
 
 -- Convenient nicknames
diff --git a/type-unary.cabal b/type-unary.cabal
--- a/type-unary.cabal
+++ b/type-unary.cabal
@@ -1,5 +1,5 @@
 Name:                type-unary
-Version:             0.2.0
+Version:             0.2.1
 Cabal-Version:       >= 1.2
 Synopsis:            
   Type-level and typed unary natural numbers, inequality proofs, vectors
