 
   public mutating func move(along direction: TangentVector) {
     precondition(
-      base.count == direction.base.count,
-      "cannot move Array.DifferentiableView with count \(base.count) along "
-        + "direction with different count \(direction.base.count)")
+      base.count == direction.base.count, """
+        Count mismatch: \(base.count) ('self') and \(direction.base.count) \
+        ('direction')
+        """)
     for i in base.indices {
       base[i].move(along: direction.base[i])
     }

    lhs: Array.DifferentiableView,
    rhs: Array.DifferentiableView
  ) -> Array.DifferentiableView {
    precondition(
      lhs.base.count == 0 || rhs.base.count == 0
        || lhs.base.count == rhs.base.count,
      "cannot subtract Array.DifferentiableViews with different counts: "
        + "\(lhs.base.count) and \(rhs.base.count)")
    if lhs.base.count == 0 {
      return rhs
    }
    if rhs.base.count == 0 {
      return lhs
    }
    return Array.DifferentiableView(zip(lhs.base, rhs.base).map(-))
  }


  ) {
    func pullback(_ v: TangentVector) -> (TangentVector, TangentVector) {
      precondition(
        v.base.count == lhs.count + rhs.count, """
          Tangent vector with invalid count; expected to equal the sum of \
          operand counts \(lhs.count) and \(rhs.count)
          """)
      return (
        TangentVector([Element.TangentVector](v.base[0..<lhs.count])),
        TangentVector([Element.TangentVector](v.base[lhs.count...]))
