func ZipApply[A, B, C any](f func(a A, b B) C, as []A, bs []B) []C
ZipApply will apply to a function to the a[i], b[i] and return a list
of the result, where a and b are too independent lists. If the lists are
different sizes, it will only zip until the length of the shorter list