Difference between revisions of "Unsafe functions"

From HaskellWiki
Jump to: navigation, search
 
 
(10 intermediate revisions by 6 users not shown)
Line 1: Line 1:
 +
<div style="border-left:1px solid lightgray; padding: 1em" alt="blockquote">
 +
A colleague [...] asked me today whether I know how to use <code>unsafePerformIO</code> safely. And I realized I have no idea. [...]
 +
 +
<tt>[https://discourse.haskell.org/t/using-unsafeperformio-safely/4146 Richard Eisenberg.]</tt>
 +
</div>
 +
 +
<sub> </sub>
 
There are a number of '''unsafe functions''' in the libraries.
 
There are a number of '''unsafe functions''' in the libraries.
  
* <hask>unsafePerformIO</hask>
+
* <hask>unsafePerformIO :: IO a -> a</hask>
* <hask>unsafeInterleaveIO</hask>
+
* <hask>unsafeInterleaveIO :: IO a -> IO a</hask>
 +
* <hask>unsafeInterleaveST :: ST s a -> ST s a</hask>
 +
* <hask>unsafeIOToST :: IO a -> ST s a</hask>
 +
* <hask>unsafeIOToSTM :: IO a -> STM a</hask>
 +
* <hask>unsafeFreeze</hask>, <hask>unsafeThaw</hask>
 +
* <hask>unsafeCoerce# :: a -> b</hask>
 +
* <hask>seq :: a -> b -> b</hask>
 +
 
 +
Unsafe functions can break:
 +
 
 +
* type safety (<code>unsafeCoerce#</code>, <code>unsafePerformIO</code>),
 +
 
 +
* [https://okmij.org/ftp/Haskell/index.html#lazyIO-not-True equational reasoning] (<code>unsafeInterleaveIO</code>),
 +
 
 +
* or [http://en.wikipedia.org/wiki/Parametricity parametricity] (<code>seq</code>).
 +
 
 +
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
 +
is safe.
 +
 
 +
<code>unsafe</code> is also a keyword which can be used in a [http://haskell.org/haskellwiki/Performance/FFI foreign import declaration].
 +
 
  
 
{{stub}}
 
{{stub}}
 +
 +
[[Category:Idioms]]

Latest revision as of 06:14, 11 August 2022

A colleague [...] asked me today whether I know how to use unsafePerformIO safely. And I realized I have no idea. [...]

Richard Eisenberg.

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),

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.