1 <!doctype linuxdoc system>
4 o Add indexing support (to linuxdoc)
5 o Fix citations in html
10 <title>The Hugs-GHC Extension Libraries
11 <author>Alastair Reid <tt/reid-alastair@cs.yale.edu/
12 Simon Marlow <tt/simonm@dcs.gla.ac.uk/
13 <date>v0.8, 28 January 1998
15 Hugs and GHC provide a common set of libraries to aid portability.
16 This document specifies the interfaces to these libraries and documents
17 known differences. We hope that these modules will be adopted for inclusion
18 as Standard Haskell Libraries sometime soon.
23 <sect> <idx/Naming conventions/
24 <label id="sec:Naming conventions">
27 The set of interfaces specified in this document try to adhere to the
28 following naming conventions:
32 Actions that create a new values have the prefix <tt/new/ followed by
33 the name of the type of object they're creating, e.g., <tt/newIORef/,
36 Operations that read a value from a mutable object are prefixed with
37 <tt/read/, and operations that update the contents have the prefix
38 <tt/write/, e.g., <tt/readChan/, <tt/readIOArray/.
43 This differs from the convention used to name the operations for
44 reading and writing to a file <tt/Handle/, where <tt/get/ and <tt/put/
47 Operations provided by various concurrency abstractions, e.g., <tt/MVar/,
48 <tt/CVar/ , also deviate from this naming scheme. This is perhaps
49 defensible, since the read and write operations have additional
50 behaviour, e.g., <tt/takeMVar/ tries to read the current value
51 of an <tt/MVar/, locking it if it succeeds.
54 Conversions operators have the form <tt/AToB/ where <tt/A/ and <tt/B/
55 are the types we're converting between.
57 Operations that lazily read values from a mutable object/handle, have
58 the form <tt/getXContents/, e.g., <tt/Channel.getChanContents/ and
59 <tt/IO.hGetContents/. (OK, so the latter isn't called
60 <tt/getHandleContents/, but you hopefully get the picture.)
63 <sect> <idx/LazyST/ <p>
65 This library provides support for both <em/lazy/ and <em/strict/ state
66 threads, as described in the PLDI '94 paper by John Launchbury and
67 Simon Peyton Jones <cite id="LazyStateThreads">. In addition to the
68 monad <tt/ST/, it also provides mutable variables <tt/STRef/ and
69 mutable arrays <tt/STArray/. As the name suggests, the monad <tt/ST/
70 instance is <em/lazy/.
76 This library provides support for <em/strict/ state threads, as
77 described in the PLDI '94 paper by John Launchbury and Simon Peyton
78 Jones <cite id="LazyStateThreads">. In addition to the monad <tt/ST/,
79 it also provides mutable variables <tt/STRef/ and mutable arrays
83 module ST( module ST, module Monad ) where
86 data ST s a -- abstract type
87 runST :: forall a. (forall s. ST s a) -> a
88 fixST :: (a -> ST s a) -> ST s a
89 unsafeInterleaveST :: ST s a -> ST s a
90 instance Functor (ST s)
93 data STRef s a -- mutable variables in state thread s
94 -- containing values of type a.
95 newSTRef :: a -> ST s (STRef s a)
96 readSTRef :: STRef s a -> ST s a
97 writeSTRef :: STRef s a -> a -> ST s ()
98 instance Eq (STRef s a)
100 data STArray s ix elt -- mutable arrays in state thread s
101 -- indexed by values of type ix
102 -- containing values of type a.
103 newSTArray :: Ix ix => (ix,ix) -> elt -> ST s (STArray s ix elt)
104 boundsSTArray :: Ix ix => STArray s ix elt -> (ix, ix)
105 readSTArray :: Ix ix => STArray s ix elt -> ix -> ST s elt
106 writeSTArray :: Ix ix => STArray s ix elt -> ix -> elt -> ST s ()
107 thawSTArray :: Ix ix => Array ix elt -> ST s (STArray s ix elt)
108 freezeSTArray :: Ix ix => STArray s ix elt -> ST s (Array ix elt)
109 unsafeFreezeSTArray :: Ix ix => STArray s ix elt -> ST s (Array ix elt)
110 instance Eq (STArray s ix elt)
117 GHC also supports ByteArrays --- these aren't supported by Hugs yet.
120 The operations <tt/freezeSTArray/ and <tt/thawSTArray/ convert mutable
121 arrays to and from immutable arrays. Semantically, they are identical
122 to copying the array and they are usually implemented that way. The
123 operation <tt/unsafeFreezeSTArray/ is a faster version of
124 <tt/freezeSTArray/ which omits the copying step. It's a safe substitute for
125 <tt/freezeSTArray/ if you don't modify the mutable array after freezing it.
128 In the current version of Hugs, the <tt/<idx/runST// operation,
129 used to specify encapsulation, is implemented as a language construct,
130 and <tt/runST/ is treated as a keyword. We plan to change this to match
135 Note that it is possible to install Hugs 1.4 without support for lazy
136 state threads, and hence the primitives described here may not be
137 available in all implementations. Also, in contrast with the
138 implementation of lazy state threads in previous releases of Hugs and
139 Gofer, there is no direct relationship between the
140 <tt/<idx/ST monad// and the <tt/<idx/IO monad//.
144 Hugs provides <tt/thenLazyST/ and <tt/thenStrictST/ so that you can
145 import <tt/LazyST/ (say) and still use the strict instance in those
146 places where it matters. GHC implements LazyST and ST using different
147 types, so this isn't possible.
153 <label id="sec:LazyST">
156 This library is identical to <tt/ST/ except that the <tt/ST/ monad
157 instance is <em/lazy/. The lazy ST monad tends to be more prone to
158 space leaks than the strict version, so most programmers will use the
159 former unless laziness is explicitly required. <tt/LazyST/ provides
160 two additional operations:
163 lazyToStrictST :: LazyST.ST s a -> ST.ST s a
164 strictToLazyST :: ST.ST s a -> LazyST.ST s a
167 These are used to convert between lazy and strict state threads. The
168 semantics with respect to laziness are as you would expect: the strict
169 state thread passed to <tt/strictToLazyST/ is not performed until the
170 result of the lazy state thread it returns is demanded.
173 <label id="sec:IOExts">
176 This library provides the following extensions to the IO monad:
179 The operations <tt/fixIO/, <tt/unsafePerformIO/ and <tt/unsafeInterleaveIO/
180 described in <cite id="ImperativeFP">
183 References (aka mutable variables) and mutable arrays (but no form of
187 <tt/performGC/ triggers an immediate garbage collection
190 When called, <tt/trace/ prints the string in its first argument, and then
191 returns the second argument as its result. The <tt/trace/ function is not
192 referentially transparent, and should only be used for debugging, or for
193 monitoring execution.
196 You should also be warned that, unless you understand some of the
197 details about the way that Haskell programs are executed, results
198 obtained using <tt/trace/ can be rather confusing. For example, the
199 messages may not appear in the order that you expect. Even ignoring the
200 output that they produce, adding calls to <tt/trace/ can change the
201 semantics of your program. Consider this a warning!
205 <tt/unsafePtrEq/ compares two values for pointer equality without
206 evaluating them. The results are not referentially transparent and
207 may vary significantly from one compiler to another or in the face of
208 semantics-preserving program changes. However, pointer equality is useful
209 in creating a number of referentially transparent constructs such as this
210 simplified memoisation function:
213 > cache :: (a -> b) -> (a -> b)
214 > cache f = \x -> unsafePerformIO (check x)
216 > ref = unsafePerformIO (newIORef (error "cache", error "cache"))
217 > check x = readIORef ref >>= \ (x',a) ->
218 > if x `unsafePtrEq` x' then
222 > writeIORef ref (x, a) >>
232 fixIO :: (a -> IO a) -> IO a
233 unsafePerformIO :: IO a -> a
234 unsafeInterleaveIO :: IO a -> IO a
236 data IORef a -- mutable variables containing values of type a
237 newIORef :: a -> IO (IORef a)
238 readIORef :: IORef a -> IO a
239 writeIORef :: IORef a -> a -> IO ()
240 instance Eq (IORef a)
242 data IOArray ix elt -- mutable arrays indexed by values of type ix
243 -- containing values of type a.
244 newIOArray :: Ix ix => (ix,ix) -> elt -> IO (IOArray ix elt)
245 boundsIOArray :: Ix ix => IOArray ix elt -> (ix, ix)
246 readIOArray :: Ix ix => IOArray ix elt -> ix -> IO elt
247 writeIOArray :: Ix ix => IOArray ix elt -> ix -> elt -> IO ()
248 freezeIOArray :: Ix ix => IOArray ix elt -> IO (Array ix elt)
249 instance Eq (IOArray ix elt)
252 trace :: String -> a -> a
253 unsafePtrEq :: a -> a -> Bool
257 <sect> <idx/GlaExts/ <p>
259 This library provides a convenient bundle of most of the extensions
260 available in GHC and Hugs. This module is generally more stable than
261 the other modules of non-standard extensions so you might choose to
262 import them from here rather than going straight to the horses mouth.
265 module GlaExts( module GlaExts, module IOExts, module ST, module Addr ) where
269 trace :: String -> a -> a
273 The GHC version also provides the types <tt/PrimIO/, <tt/RealWorld/,
274 <tt/ByteArray/, <tt/Lift/ and operations on these types. It also
275 provides the unboxed views of the types
283 and a number of ``primitive operations'' (<tt/+&num/,
284 <tt/plusFloat&num/, etc.).
289 <label id="sec:Bits">
292 This library defines bitwise operations for signed and unsigned ints.
296 infixl 8 `shift`, `rotate`
302 (.&.), (.|.), xor :: a -> a -> a
304 shift :: a -> Int -> a
305 rotate :: a -> Int -> a
307 setBit :: a -> Int -> a
308 clearBit :: a -> Int -> a
309 complementBit :: a -> Int -> a
310 testBit :: a -> Int -> Bool
312 isSigned :: a -> Bool
314 shiftL, shiftR :: Bits a => a -> Int -> a
315 rotateL, rotateR :: Bits a => a -> Int -> a
316 shiftL a i = shift a i
317 shiftR a i = shift a (-i)
318 rotateL a i = rotate a i
319 rotateR a i = rotate a (-i)
325 <tt/bitSize/ and <tt/isSigned/ are like <tt/floatRadix/ and <tt/floatDigits/
326 -- they return parameters of the <em/type/ of their argument rather than
327 of the particular argument they are applied to. <tt/bitSize/ returns
328 the number of bits in the type (or <tt/Nothing/ for unbounded types); and
329 <tt/isSigned/ returns whether the type is signed or not.
331 <tt/shift/ performs sign extension on signed number types.
332 That is, right shifts fill the top bits with 1 if the number is negative
333 and with 0 otherwise.
335 Bits are numbered from 0 with bit 0 being the least significant bit.
337 <tt/shift x i/ and <tt/rotate x i/ shift to the left if <tt/i/ is
338 positive and to the right otherwise.
341 <tt/rotate/ is well defined only if bitSize returns a number.
342 (Maybe we should impose a Bounded constraint on it?)
345 <tt/bit i/ is the value with the i'th bit set.
349 <label id="sec:Word">
352 This library provides unsigned integers of various sizes.
353 The types supported are as follows:
356 type | number of bits @
365 For each type <it/W/ above, we provide the following functions and
366 instances. The type <it/I/ refers to the signed integer type of the
370 data W -- Unsigned Ints
385 word8ToWord32 :: Word8 -> Word32
386 word32ToWord8 :: Word32 -> Word8
387 word16ToWord32 :: Word16 -> Word32
388 word32ToWord16 :: Word32 -> Word16
390 word8ToInt :: Word8 -> Int
391 intToWord8 :: Int -> Word8
392 word16ToInt :: Word16 -> Int
393 intToWord16 :: Int -> Word16
394 word32ToInt :: Word32 -> Int
395 intToWord32 :: Int -> Word32
401 All arithmetic is performed modulo 2^n
403 One non-obvious consequequence of this is that <tt/negate/
404 should <em/not/ raise an error on negative arguments.
407 The coercion <tt/wToI/ converts an unsigned n-bit value to the
408 signed n-bit value with the same representation. For example,
409 <tt/word8ToInt8 0xff = -1/.
410 Likewise, <tt/iToW/ converts signed n-bit values to the
411 corresponding unsigned n-bit value.
414 ToDo: complete the set of coercion functions.
417 Use <tt/Prelude.fromIntegral :: (Integral a, Num b) => a -> b/ to
418 coerce between different sizes or to preserve sign when converting
419 between values of the same size.
422 It would be very natural to add a type a type <tt/Natural/ providing
423 an unbounded size unsigned integer --- just as <tt/Integer/ provides
424 unbounded size signed integers. We do not do that yet since there is
425 no demand for it. Doing so would require <tt/Bits.bitSize/ to return
429 The <tt/Enum/ instances stop when they reach their upper or lower
430 bound --- they don't overflow the way the <tt/Int/ and <tt/Float/
434 It would be useful to provide a function (or a family of functions?)
435 which coerced between any two Word types (without going through
440 Hugs only provides <tt/Eq/, <tt/Ord/, <tt/Read/ and <tt/Show/
441 instances for <tt/Word64/ at the moment.
447 This library provides signed integers of various sizes. The types
448 supported are as follows:
451 type | number of bits @
460 For each type <it/I/ above, we provide the following instances.
463 data I -- Signed Ints
464 iToInt :: I -> Int -- not provided for Int64
465 intToi :: Int -> I -- not provided for Int64
480 int8ToInt :: Int8 -> Int
481 intToInt8 :: Int -> Int8
482 int16ToInt :: Int16 -> Int
483 intToInt16 :: Int -> Int16
484 int32ToInt :: Int32 -> Int
485 intToInt32 :: Int -> Int32
490 Hugs does not provide <tt/Int64/ at the moment.
493 ToDo: complete the set of coercion functions.
498 <label id="sec:Addr">
501 This library provides machine addresses and is primarily intended for
502 use in creating foreign function interfaces using GreenCard.
506 data Addr -- Address type
510 plusAddr :: Addr -> Int -> Addr
512 -- read value out of _immutable_ memory
513 indexCharOffAddr :: Addr -> Int -> Char
514 indexIntOffAddr :: Addr -> Int -> Int -- should we drop this?
515 indexAddrOffAddr :: Addr -> Int -> Addr
516 indexFloatOffAddr :: Addr -> Int -> Float
517 indexDoubleOffAddr :: Addr -> Int -> Double
518 indexWord8OffAddr :: Addr -> Int -> Word8
519 indexWord16OffAddr :: Addr -> Int -> Word16
520 indexWord32OffAddr :: Addr -> Int -> Word32
521 indexWord64OffAddr :: Addr -> Int -> Word64
522 indexInt8OffAddr :: Addr -> Int -> Int8
523 indexInt16OffAddr :: Addr -> Int -> Int16
524 indexInt32OffAddr :: Addr -> Int -> Int32
525 indexInt64OffAddr :: Addr -> Int -> Int64
527 -- read value out of mutable memory
528 readCharOffAddr :: Addr -> Int -> IO Char
529 readIntOffAddr :: Addr -> Int -> IO Int -- should we drop this?
530 readAddrOffAddr :: Addr -> Int -> IO Addr
531 readFloatOffAddr :: Addr -> Int -> IO Float
532 readDoubleOffAddr :: Addr -> Int -> IO Double
533 readWord8OffAddr :: Addr -> Int -> IO Word8
534 readWord16OffAddr :: Addr -> Int -> IO Word16
535 readWord32OffAddr :: Addr -> Int -> IO Word32
536 readWord64OffAddr :: Addr -> Int -> IO Word64
537 readInt8OffAddr :: Addr -> Int -> IO Int8
538 readInt16OffAddr :: Addr -> Int -> IO Int16
539 readInt32OffAddr :: Addr -> Int -> IO Int32
540 readInt64OffAddr :: Addr -> Int -> IO Int64
542 -- write value into mutable memory
543 writeCharOffAddr :: Addr -> Int -> Char -> IO ()
544 writeIntOffAddr :: Addr -> Int -> Int -> IO () -- should we drop this?
545 writeAddrOffAddr :: Addr -> Int -> Addr -> IO ()
546 writeFloatOffAddr :: Addr -> Int -> Float -> IO ()
547 writeDoubleOffAddr :: Addr -> Int -> Double -> IO ()
548 writeWord8OffAddr :: Addr -> Int -> Word8 -> IO ()
549 writeWord16OffAddr :: Addr -> Int -> Word16 -> IO ()
550 writeWord32OffAddr :: Addr -> Int -> Word32 -> IO ()
551 writeWord64OffAddr :: Addr -> Int -> Word64 -> IO ()
552 writeInt8OffAddr :: Addr -> Int -> Int8 -> IO ()
553 writeInt16OffAddr :: Addr -> Int -> Int16 -> IO ()
554 writeInt32OffAddr :: Addr -> Int -> Int32 -> IO ()
555 writeInt64OffAddr :: Addr -> Int -> Int64 -> IO ()
558 Hugs provides <tt/Addr/ and <tt/nullAddr/ but does not provide any of
559 the index, read or write functions. They can be implemented using
560 GreenCard if required.
563 <label id="sec:NumExts">
566 The <tt/NumExts/ interface collect together various numeric
567 operations that have proven to be commonly useful
570 -- Going between Doubles and Floats:
571 doubleToFloat :: Double -> Float
572 floatToDouble :: Float -> Double
574 showHex :: Integral a => a -> ShowS
575 showOct :: Integral a => a -> ShowS
581 If <tt/doubleToFloat/ is applied to a <tt/Double/ that is within
582 the representable range for <tt/Float/, the result may be the next
583 higher or lower representable <tt/Float/ value. If the <tt/Double/
584 is out of range, the result is undefined.
586 No loss of precision occurs in the other direction with
587 <tt/floatToDouble/, the floating value remains unchanged.
589 <tt/showOct/ and <tt/showHex/ will prefix <tt/0o/ and <tt/0x/
590 respectively. Like <tt/Numeric.showInt/, these show functions
591 work on positive numbers only.
595 <label id="sec:Foreign">
598 This module is provided by GHC but not by Hugs.
599 GreenCard for Hugs provides the <tt/ForeignObj/ type.
601 <sect> <idx/Concurrent/
602 <label id="sec:Concurrent">
605 This library provides the Concurrent Haskell extensions
606 <cite id="concurrentHaskell:popl96">.
608 We are grateful to the Glasgow Haskell Project for allowing us to
609 redistribute their implementation of this module.
612 module Concurrent where
614 data ThreadId -- thread identifiers
616 instance Ord ThreadId
618 forkIO :: IO () -> IO ThreadId
619 killThread :: ThreadId -> IO ()
621 data MVar a -- Synchronisation variables
622 newEmptyMVar :: IO (MVar a)
623 newMVar :: a -> IO (MVar a)
624 takeMVar :: MVar a -> IO a
625 putMVar :: MVar a -> a -> IO ()
626 swapMVar :: MVar a -> a -> IO a
627 readMVar :: MVar a -> IO a
630 data Chan a -- channels
631 newChan :: IO (Chan a)
632 writeChan :: Chan a -> a -> IO ()
633 readChan :: Chan a -> IO a
634 dupChan :: Chan a -> IO (Chan a)
635 unReadChan :: Chan a -> a -> IO ()
636 getChanContents :: Chan a -> IO [a]
637 writeList2Chan :: Chan a -> [a] -> IO ()
639 data CVar a -- one element channels
640 newCVar :: IO (CVar a)
641 putCVar :: CVar a -> a -> IO ()
642 getCVar :: CVar a -> IO a
644 data QSem -- General/quantity semaphores
645 newQSem :: Int -> IO QSem
646 waitQSem :: QSem -> IO ()
647 signalQSem :: QSem -> IO ()
649 data QSemN -- General/quantity semaphores
650 newQSemN :: Int -> IO QSemN
651 waitQSemN :: QSemN -> Int -> IO ()
652 signalQSemN :: QSemN -> Int -> IO ()
654 type SampleVar a -- Sample variables
655 newEmptySampleVar:: IO (SampleVar a)
656 newSampleVar :: a -> IO (SampleVar a)
657 emptySampleVar :: SampleVar a -> IO ()
658 readSampleVar :: SampleVar a -> IO a
659 writeSampleVar :: SampleVar a -> a -> IO ()
666 GHC uses preemptive multitasking:
667 Context switches can occur at any time, except if you call a C
668 function (like \verb"getchar") that blocks waiting for input.
670 Hugs uses cooperative multitasking:
671 Context switches only occur when you use one of the primitives
672 defined in this module. This means that programs such as:
675 main = forkIO (write 'a') >> write 'b'
676 where write c = putChar c >> write c
679 will print either <tt/aaaaaaaaaaaaaa.../ or <tt/bbbbbbbbbbbb.../,
680 instead of some random interleaving of <tt/a/s and <tt/b/s.
682 In practice, cooperative multitasking is sufficient for writing
683 simple graphical user interfaces.
686 Hugs does not provide the functions <tt/mergeIO/ or <tt/nmergeIO/ since these
687 require preemptive multitasking.
690 Thread identities and <tt/killThread/ has not been implemented yet on
691 either system. The plan is that <tt/killThread/ will raise an IO
692 exception in the killed thread which it can catch --- perhaps allowing -->
693 --it to kill its children before exiting.
696 The <tt/Ord/ instance for <tt/ThreadId/s provides an arbitrary total ordering
697 which might be used to build an ordered binary tree, say.
702 <label id="sec:Pretty">
705 This library contains Simon Peyton Jones' implementation of John
706 Hughes's pretty printer combinators.
713 data Doc -- the Document datatype
715 -- The primitive Doc values
717 text :: String -> Doc
720 integer :: Integer -> Doc
721 float :: Float -> Doc
722 double :: Double -> Doc
723 rational :: Rational -> Doc
724 semi, comma, colon, space, equals :: Doc
725 lparen, rparen, lbrack, rbrack, lbrace, rbrace :: Doc
726 parens, brackets, braces :: Doc -> Doc
727 quotes, doubleQuotes :: Doc -> Doc
729 -- Combining Doc values
730 (<>) :: Doc -> Doc -> Doc -- Beside
731 hcat :: [Doc] -> Doc -- List version of <>
732 (<+>) :: Doc -> Doc -> Doc -- Beside, separated by space
733 hsep :: [Doc] -> Doc -- List version of <+>
734 ($$) :: Doc -> Doc -> Doc -- Above; if there is no
735 -- overlap it "dovetails" the two
736 vcat :: [Doc] -> Doc -- List version of $$
737 cat :: [Doc] -> Doc -- Either hcat or vcat
738 sep :: [Doc] -> Doc -- Either hsep or vcat
739 fcat :: [Doc] -> Doc -- ``Paragraph fill'' version of cat
740 fsep :: [Doc] -> Doc -- ``Paragraph fill'' version of sep
741 nest :: Int -> Doc -> Doc -- Nested
742 hang :: Doc -> Int -> Doc -> Doc
743 punctuate :: Doc -> [Doc] -> [Doc]
744 -- punctuate p [d1, ... dn] = [d1 <> p, d2 <> p, ... dn-1 <> p, dn]
746 -- Displaying Doc values
748 render :: Doc -> String -- Uses default style
749 renderStyle :: Style -> Doc -> String
750 data Style = Style { lineLength :: Int, -- In chars
751 ribbonsPerLine :: Float, -- Ratio of ribbon length
755 data Mode = PageMode -- Normal
756 | ZigZagMode -- With zig-zag cuts
757 | LeftMode -- No indentation, infinitely long lines
758 | OneLineMode -- All on one line
761 <biblio files="refs" style="abbrv">