Looking at the Haskell source for toUpper:
toUpper c = chr (fromIntegral (towupper (fromIntegral (ord c))))
...
foreign import ccall unsafe "u_towupper"
towupper :: CInt -> CInt
What is the meaning of chr, as well as u_towupper? I'm curious about the foreign import ccall unsafe part too. Does the Haskell source actually mutate, hence the unsafe?
First ord converts a Char to an Int, then fromIntegral converts it to CInt. On the other side fromIntegral converts a CInt to an Int, then chr converts the Int to a Char.
An unsafe foreign import means that the C function u_towupper does not call back into haskell. If Ghc knows this, then it can make some optimizations. It has nothing to do with mutation.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With