I am learning rust and I wanted to create a generic function that takes any ndarray and returns an ndarray of the same type and shape, initialised to zero. I added Zero and NdProducer traits but still it cannot find T::zeros function  any guidance appreciated.
extern crate ndarray;
use ndarray::prelude::*;
use std::ops::Mul;
use num_traits::identities::Zero;
use ndarray::NdProducer;
// A minimal example of a fn that takes any ndarray
// and returns a result of the same type of ndarray:
fn create_zero_ndarray<T>(a: &T) > T
where
T: Clone + Mul<Output=T> + Zero + NdProducer
{
T::zeros(a.raw_dim())
}
fn create_zero_ndarray_3U16(a: &Array3::<u16>) > Array3::<u16>
{
Array3::<u16>::zeros(a.raw_dim())
}
fn main() {
let a = Array3::<u16>::zeros((3, 3, 3));
println!("r = {:?}",create_zero_ndarray_3U16(&a));
println!("r = {:?}",create_zero_ndarray(&a));
}
Errors:
Compiling playground v0.0.1 (/playground)
error[E0599]: no function or associated item named `zeros` found for type parameter `T` in the current scope
> src/main.rs:15:8

15  T::zeros(a.raw_dim())
 ^^^^^ function or associated item not found in `T`

= help: items from traits can only be used if the type parameter is bounded by the trait
help: the following trait defines an item `zeros`, perhaps you need to restrict type parameter `T` with it:

11  fn create_zero_ndarray<T: ndarray::Dimension>(a: &T) > T
 ~~~~~~~~~~~~~~~~~~~~~
help: there is an associated function with a similar name

15  T::zero(a.raw_dim())
 ~~~~
error[E0277]: the trait bound `ArrayBase<OwnedRepr<u16>, Dim<[usize; 3]>>: num_traits::Zero` is not satisfied
> src/main.rs:27:45

27  println!("r = {:?}",create_zero_ndarray(&a));
  ^^ the trait `num_traits::Zero` is not implemented for `ArrayBase<OwnedRepr<u16>, Dim<[usize; 3]>>`
 
 required by a bound introduced by this call

note: required by a bound in `create_zero_ndarray`
> src/main.rs:13:32

11  fn create_zero_ndarray<T>(a: &T) > T
  required by a bound in this
12  where
13  T: Clone + Mul<Output=T> + Zero + NdProducer
 ^^^^ required by this bound in `create_zero_ndarray`
error[E0277]: the trait bound `ArrayBase<OwnedRepr<u16>, Dim<[usize; 3]>>: NdProducer` is not satisfied
> src/main.rs:27:45

27  println!("r = {:?}",create_zero_ndarray(&a));
  ^^ the trait `NdProducer` is not implemented for `ArrayBase<OwnedRepr<u16>, Dim<[usize; 3]>>`
 
 required by a bound introduced by this call

= help: the following implementations were found:
<ArrayBase<RawViewRepr<*const A>, D> as NdProducer>
<ArrayBase<RawViewRepr<*mut A>, D> as NdProducer>
<ArrayBase<ViewRepr<&'a A>, D> as NdProducer>
<ArrayBase<ViewRepr<&'a mut A>, D> as NdProducer>
note: required by a bound in `create_zero_ndarray`
> src/main.rs:13:39

11  fn create_zero_ndarray<T>(a: &T) > T
  required by a bound in this
12  where
13  T: Clone + Mul<Output=T> + Zero + NdProducer
 ^^^^^^^^^^ required by this bound in `create_zero_ndarray`
Some errors have detailed explanations: E0277, E0599.
For more information about an error, try `rustc explain E0277`.
error: could not compile `playground` due to 3 previous errors