Difference between revisions of "Unsafe functions"

From HaskellWiki
Jump to: navigation, search
m
 
(3 intermediate revisions by the same user not shown)
Line 1: Line 1:
 
<div style="border-left:1px solid lightgray; padding: 1em" alt="blockquote">
 
<div style="border-left:1px solid lightgray; padding: 1em" alt="blockquote">
I think <code>unsafePerformIO</code> might actually be a pretty good alternative, we just need to understand how to use it safely [...]
+
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/49 Victor Miraldo.]</tt>
+
<tt>[https://discourse.haskell.org/t/using-unsafeperformio-safely/4146 Richard Eisenberg.]</tt>
 
</div>
 
</div>
  
Line 13: Line 13:
 
* <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 type safety (unsafeCoerce#, unsafePerformIO),
+
Unsafe functions can break:
interfere with lazy IO (unsafeInterleaveIO), or break [http://en.wikipedia.org/wiki/Parametricity parametricity] (seq).
+
 
Their use (except in the case of <hask>seq</hask>) would require some
+
* 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
 
kind of assurance on the part of the programmer that what they're doing
 
is safe.
 
is safe.
  
 
<code>unsafe</code> is also a keyword which can be used in a [http://haskell.org/haskellwiki/Performance/FFI foreign import declaration].
 
<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]]
 
[[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.