diff --git a/linear.cabal b/linear.cabal
--- a/linear.cabal
+++ b/linear.cabal
@@ -1,6 +1,6 @@
 name:          linear
 category:      Math, Algebra
-version:       0.6
+version:       0.6.1
 license:       BSD3
 cabal-version: >= 1.8
 license-file:  LICENSE
diff --git a/src/Linear/Vector.hs b/src/Linear/Vector.hs
--- a/src/Linear/Vector.hs
+++ b/src/Linear/Vector.hs
@@ -17,11 +17,14 @@
   , (*^)
   , (^/)
   , lerp
-  -- , basis
-  -- , basisFor
+  , basis
+  , basisFor
   ) where
 
 import Control.Applicative
+import Data.Foldable (foldMap)
+import Data.Monoid (Sum(..))
+import Data.Traversable (Traversable, mapAccumL)
 
 -- $setup
 -- >>> import Control.Lens
@@ -80,20 +83,23 @@
 lerp alpha u v = alpha *^ u ^+^ (1 - alpha) *^ v
 {-# INLINE lerp #-}
 
-{-
+-- @setElement i x v@ sets the @i@'th element of @v@ to @x@.
+setElement :: Traversable t => Int -> a -> t a -> t a
+setElement i x = snd . mapAccumL aux 0
+  where aux j y = let j' = j + 1 
+                      y' = if i == j then x else y
+                  in j' `seq` (j', y')
 
 -- | Produce a default basis for a vector space. If the dimensionality
 -- of the vector space is not statically known, see 'basisFor'.
 basis :: (Applicative t, Traversable t, Num a) => [t a]
-basis = [ set (element k) 1 zero | k <- [0..lengthOf folded zero - 1]]
+basis = [ setElement k 1 zero | k <- [0..n - 1] ]
   where zero = pure 0
+        n = getSum $ foldMap (const (Sum 1)) zero
 
 -- | Produce a default basis for a vector space from which the
 -- argument is drawn.
 basisFor :: (Traversable t, Enum a, Num a) => t a -> [t a]
-basisFor v = map aux [0..n-1]
+basisFor v = [ setElement k 1 z | k <- [0..n-1] ]
   where z = 0 <$ v
-        n = lengthOf folded z
-        aux i = z & element i .~ 1
-
--}
+        n = getSum $ foldMap (const (Sum 1)) v
