diff --git a/header/vectors.h b/header/vectors.h
index fdef828975bd4c58ec6ac706537de5f1ab2269aa..0c4c5949fcab158536606447cda803dfdfb07e44 100644
--- a/header/vectors.h
+++ b/header/vectors.h
@@ -32,5 +32,6 @@ void vector_free(vector vec);
 void vector_print(vector vec, void (*print)(type));
 vector vector_map(vector vec, type (*f)(type));
 vector vector_filter(vector vec, bool (*f)(type));
+type vector_reduce(vector vec, type neutral, type (*f)(type, type));
 
 #endif
\ No newline at end of file
diff --git a/src/test_vectors.c b/src/test_vectors.c
index bda3a8743aa5897026384d706920d02fc5a1c8c2..40fb57b7d665b65f2ab01aaaeb660280dcbfbc66 100644
--- a/src/test_vectors.c
+++ b/src/test_vectors.c
@@ -13,6 +13,7 @@
 void print_type(type val);
 int times_two(type a);
 bool lower_than_five(type a);
+type add(type lhs, type rhs);
 
 int main()
 {	
@@ -71,6 +72,11 @@ int main()
 	vector_print(test_3, &print_type);
 	printf("\n");
 
+	//Test Vector Reduce
+	type sum = vector_reduce(test_3, 0, add);
+	print_type(sum);
+	printf("\n");
+	
 	//Test Vector Free
 	vector_free(test);
 	vector_free(test_2);
@@ -92,4 +98,9 @@ int times_two(type a)
 bool lower_than_five(type a) 
 {
     return (a < 5);
+}
+
+type add(type lhs, type rhs) 
+{
+    return lhs + rhs;
 }
\ No newline at end of file
diff --git a/src/vectors.c b/src/vectors.c
index 83a7159a73ff9e87fb2f8d6a8cac77ec7b83fa6c..79fef3aea7196e841f79e32a0e3d17a83499939e 100644
--- a/src/vectors.c
+++ b/src/vectors.c
@@ -158,4 +158,13 @@ vector vector_filter(vector vec, bool (*f)(type))
 		}
 	}
 	return new_vec;
+}
+
+type vector_reduce(vector vec, type neutral, type (*f)(type, type))
+{
+	for (int i = 0; i < vec->length; i++)
+	{
+		neutral = f(neutral, vec->content[i]);
+	}
+	return neutral;
 }
\ No newline at end of file