I may well be missing something, but IIUC the linearity in Haskell is on the arrows - the function promises to use that argument exactly once (if it terminates - and never more than once).
I think this means `splitDArray` is broken. It consumes the linear argument, but then gives us two DArrays that we can forget to fill (or, probably not as bad, fill multiple times).
If that's the case, we probably want something more like
splitDArray :: Int -> DArray #-> (DArray #-> DArray #-> a) -> a
Please someone correct me if I've missed something :)