 	}
 
 	/// Returns the remaining list after dropping n elements from the receiver.
-	public func drop(n : UInt) -> List<A> {
+	public func drop(n : UInt) -> List<Element> {
 		if n == 0 {
 			return self
 		}

	/// `extreme(_:)` is the dual to span(_:)` and satisfies the law
	///
	///     self.extreme(p) == self.span((!) • p)
	public func extreme(p : A -> Bool) -> (List<A>, List<A>) {
		return self.span { ((!) • p)($0) }
	}
	
	/// Returns the elements of the receiver in reverse order.
	///
	/// For infinite lists this function will diverge.
	public func reverse() -> List<A> {
		return self.reduce(flip(List.cons), initial: [])
	}


//	/// other.
//	///
//	///     group([0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 7]) == [[0], [1, 1], [2], [3, 3], [4], [5], [6], [7, 7]]
//	public var group : List<List<Element>> {
//		return self.groupBy { a in { b in a == b } }
//	}
//}

extension List where Element : BooleanType {
	/// Returns the conjunction of a list of Booleans.
	public var and : Bool {
		return self.reduce(true) { $0.boolValue && $1.boolValue }
