 
 extension List : CollectionType {
 	public typealias Index = UInt
-
-	public var startIndex: UInt { get { return 0 } }
-
-	public var endIndex: UInt {
-		get {
-			return self.isFinite() ? self.length() : error("An infinite list has no end index.")
-		}
+	
+	public var startIndex : UInt { return 0 }
+	
+	public var endIndex : UInt {
+		return self.isFinite ? self.length() : error("An infinite list has no end index.")
 	}
 }
 
 extension List : CustomStringConvertible {
 	public var description : String {
-		return self.map({ String.init($0) }).intersperse(", ").reduce("", combine: +)
+		if self.isFinite {
+			return self.map({ String.init($0) }).intersperse(", ").reduce("", combine: +)
+		}
+		return "[...]"
 	}
 }
 

			return []
		}

		switch self.match() {
		case .Nil:
			return []
		case let .Cons(x, xs):


	/// Returns the tail of the list, or None if the list is empty.
	public func tail() -> Optional<List<A>> {
		switch self.match {
		case .Nil:
			return .None
		case let .Cons(_, tail):
