I suggest adding more HasCallStack constraints.
1. Missing HasCallStack constraints
Some functions in non- Generic modules are missing HasCallStack constraints.
Example: VU.(!)
VU.(!) does not have HasCallStack constraint and we don't get full trace:
Example
{- stack script --resolver lts-22.24 --package vector -}
import Data.Vector.Unboxed qualified as VU
main :: IO ()
main = do
let !_ = (VU.fromList [0 :: Int]) VU.! 42
return ()
The call stack does not contain VU.(!) call from main:
$ stack example-u.hs
example-u.hs: index out of bounds (42,1)
CallStack (from HasCallStack):
error, called at src/Data/Vector/Internal/Check.hs:103:12 in vector-0.13.1.0-Aqc2YUE1Egs5WmXVMbcJ5T:Data.Vector.Internal.Check
checkError, called at src/Data/Vector/Internal/Check.hs:109:17 in vector-0.13.1.0-Aqc2YUE1Egs5WmXVMbcJ5T:Data.Vector.Internal.Check
check, called at src/Data/Vector/Internal/Check.hs:122:5 in vector-0.13.1.0-Aqc2YUE1Egs5WmXVMbcJ5T:Data.Vector.Internal.Check
checkIndex, called at src/Data/Vector/Generic.hs:235:11 in vector-0.13.1.0-Aqc2YUE1Egs5WmXVMbcJ5T:Data.Vector.Generic
!, called at src/Data/Vector/Unboxed.hs:297:7 in vector-0.13.1.0-Aqc2YUE1Egs5WmXVMbcJ5T:Data.Vector.Unboxed
VG.(!) has HasCallStack constraint and we get a full trace:
Example
{- stack script --resolver lts-22.24 --package vector -}
import Data.Vector.Unboxed qualified as VU
+import Data.Vector.Generic qualified as VG
main :: IO ()
main = do
- let !_ = (VU.fromList [0 :: Int]) VU.! 42
+ let !_ = (VU.fromList [0 :: Int]) VG.! 42
return ()
The call stack contains VG.(!) call from main:
$ stack example-g.hs
example-g.hs: index out of bounds (42,1)
CallStack (from HasCallStack):
error, called at src/Data/Vector/Internal/Check.hs:103:12 in vector-0.13.1.0-Aqc2YUE1Egs5WmXVMbcJ5T:Data.Vector.Internal.Check
checkError, called at src/Data/Vector/Internal/Check.hs:109:17 in vector-0.13.1.0-Aqc2YUE1Egs5WmXVMbcJ5T:Data.Vector.Internal.Check
check, called at src/Data/Vector/Internal/Check.hs:122:5 in vector-0.13.1.0-Aqc2YUE1Egs5WmXVMbcJ5T:Data.Vector.Internal.Check
checkIndex, called at src/Data/Vector/Generic.hs:235:11 in vector-0.13.1.0-Aqc2YUE1Egs5WmXVMbcJ5T:Data.Vector.Generic
!, called at /home/tbm/dev/hs/tmp/example-g.hs:8:37 in main:Main
2. head and more
I personally like to add HasCallStack to anywhere possible.
For example, the head function does not have HasCallStack constraint. But the list's head function in base doesn't have it either. What do you think? Thank you.
I suggest adding more
HasCallStackconstraints.1. Missing
HasCallStackconstraintsSome functions in non-
Genericmodules are missingHasCallStackconstraints.Example:
VU.(!)VU.(!)does not haveHasCallStackconstraint and we don't get full trace:Example
The call stack does not contain
VU.(!)call frommain:VG.(!)hasHasCallStackconstraint and we get a full trace:Example
{- stack script --resolver lts-22.24 --package vector -} import Data.Vector.Unboxed qualified as VU +import Data.Vector.Generic qualified as VG main :: IO () main = do - let !_ = (VU.fromList [0 :: Int]) VU.! 42 + let !_ = (VU.fromList [0 :: Int]) VG.! 42 return ()The call stack contains
VG.(!)call frommain:2.
headand moreI personally like to add
HasCallStackto anywhere possible.For example, the
headfunction does not haveHasCallStackconstraint. But the list'sheadfunction inbasedoesn't have it either. What do you think? Thank you.