# Difference between revisions of "Unsafe functions"

Jump to navigation
Jump to search

m |
m |
||

Line 14: | Line 14: | ||

* <hask>unsafeIOToST :: IO a -> ST s a</hask> |
* <hask>unsafeIOToST :: IO a -> ST s a</hask> |
||

* <hask>unsafeIOToSTM :: IO a -> STM a</hask> |
* <hask>unsafeIOToSTM :: IO a -> STM a</hask> |
||

− | * <hask>unsafeFreeze, unsafeThaw</hask> |
+ | * <hask>unsafeFreeze</hask>, <hask>unsafeThaw</hask> |

* <hask>unsafeCoerce# :: a -> b</hask> |
* <hask>unsafeCoerce# :: a -> b</hask> |
||

* <hask>seq :: a -> b -> b</hask> |
* <hask>seq :: a -> b -> b</hask> |
||

− | Unsafe functions can break |
+ | Unsafe functions can break: |

+ | |||

⚫ | |||

+ | * type safety (<code>unsafeCoerce#</code>, <code>unsafePerformIO</code>), |
||

+ | |||

+ | * [https://okmij.org/ftp/Haskell/index.html#lazyIO-not-True breaks equational reasoning] (<code>unsafeInterleaveIO</code>), |
||

+ | |||

⚫ | |||

+ | |||

Their use (except in the case of <code>seq</code>) would require some |
Their use (except in the case of <code>seq</code>) would require some |
||

kind of assurance on the part of the programmer that what they're doing |
kind of assurance on the part of the programmer that what they're doing |

## Revision as of 05:56, 11 August 2022

A colleague [...] asked me today whether I know how to use `unsafePerformIO`

safely. And I realized I have no idea.

_{ }
There are a number of **unsafe functions** in the libraries.

`unsafePerformIO :: IO a -> a`

`unsafeInterleaveIO :: IO a -> IO a`

`unsafeInterleaveST :: ST s a -> ST s a`

`unsafeIOToST :: IO a -> ST s a`

`unsafeIOToSTM :: IO a -> STM a`

`unsafeFreeze`

,`unsafeThaw`

`unsafeCoerce# :: a -> b`

`seq :: a -> b -> b`

Unsafe functions can break:

- type safety (
`unsafeCoerce#`

,`unsafePerformIO`

),

- breaks equational reasoning (
`unsafeInterleaveIO`

),

- or break parametricity (
`seq`

).

Their use (except in the case of `seq`

) would require some
kind of assurance on the part of the programmer that what they're doing
is safe.

`unsafe`

is also a keyword which can be used in a foreign import declaration.

*This article is a stub. You can help by expanding it.*