Проблема возникает из-за того, что не делает то, что вы думаете.Когда вы делаете ws <- getVectorFloat len
ws не устанавливается с массивом, а вызывается для каждого его значения.то есть нотация do для массива аналогична карте.Рассмотрим следующий пример
prelude > do x <- [1,2,3]; return (x*10)
[10, 20, 30]
или более забавный; -)
Prelude> do <-[1,2,3];y<-[10,20,30]; return(x,y)
[(1,10),(1,20),(1,30),(2,10),(2,20),(2,30),(3,10),(3,20),(3,30)]
Так что я не уверен, что вы используете do правильно.