diff options
Diffstat (limited to 'libraries/base/GHC')
-rw-r--r-- | libraries/base/GHC/Base.hs | 1 | ||||
-rw-r--r-- | libraries/base/GHC/Bits.hs | 5 | ||||
-rw-r--r-- | libraries/base/GHC/Enum.hs | 2 | ||||
-rw-r--r-- | libraries/base/GHC/Event/Windows.hsc | 6 | ||||
-rw-r--r-- | libraries/base/GHC/Event/Windows/FFI.hsc | 6 | ||||
-rw-r--r-- | libraries/base/GHC/Foreign.hs | 1 | ||||
-rw-r--r-- | libraries/base/GHC/ForeignPtr.hs | 6 | ||||
-rw-r--r-- | libraries/base/GHC/IO/Encoding/Failure.hs | 1 | ||||
-rw-r--r-- | libraries/base/GHC/IO/FD.hs | 4 | ||||
-rw-r--r-- | libraries/base/GHC/IO/Handle/Internals.hs | 3 | ||||
-rw-r--r-- | libraries/base/GHC/IO/Handle/Text.hs | 2 | ||||
-rw-r--r-- | libraries/base/GHC/IO/Unsafe.hs | 5 | ||||
-rw-r--r-- | libraries/base/GHC/IO/Windows/Handle.hsc | 1 | ||||
-rw-r--r-- | libraries/base/GHC/IORef.hs | 1 | ||||
-rw-r--r-- | libraries/base/GHC/Int.hs | 25 | ||||
-rw-r--r-- | libraries/base/GHC/List.hs | 18 | ||||
-rw-r--r-- | libraries/base/GHC/Read.hs | 2 | ||||
-rw-r--r-- | libraries/base/GHC/Real.hs | 2 | ||||
-rw-r--r-- | libraries/base/GHC/TopHandler.hs | 9 | ||||
-rw-r--r-- | libraries/base/GHC/TypeNats.hs | 5 |
20 files changed, 55 insertions, 50 deletions
diff --git a/libraries/base/GHC/Base.hs b/libraries/base/GHC/Base.hs index 21ad469d27..bf1527076c 100644 --- a/libraries/base/GHC/Base.hs +++ b/libraries/base/GHC/Base.hs @@ -150,7 +150,6 @@ default () -- Double isn't available yet {- Note [Depend on GHC.Num.Integer] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - The Integer type is special because GHC.CoreToStg.Prep.mkConvertNumLiteral lookups names in ghc-bignum interfaces to construct Integer literal values. Currently it reads the interface file whether or not the current module *has* diff --git a/libraries/base/GHC/Bits.hs b/libraries/base/GHC/Bits.hs index 012550a60b..201340f348 100644 --- a/libraries/base/GHC/Bits.hs +++ b/libraries/base/GHC/Bits.hs @@ -668,8 +668,9 @@ isBitSubType x y ySigned = isSigned y {-# INLINE isBitSubType #-} -{- Note [Constant folding for rotate] - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +{- +Note [Constant folding for rotate] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The INLINE on the Int instance of rotate enables it to be constant folded. For example: sumU . mapU (`rotate` 3) . replicateU 10000000 $ (7 :: Int) diff --git a/libraries/base/GHC/Enum.hs b/libraries/base/GHC/Enum.hs index 5c184256f4..d80689423c 100644 --- a/libraries/base/GHC/Enum.hs +++ b/libraries/base/GHC/Enum.hs @@ -179,7 +179,6 @@ boundedEnumFromThen n1 n2 {- Note [Stable Unfolding for list producers] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - The INLINABLE/INLINE pragmas ensure that we export stable (unoptimised) unfoldings in the interface file so we can do list fusion at usage sites. -} @@ -892,6 +891,7 @@ instance Enum Integer where #-} {- Note [Enum Integer rules for literal 1] + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The "1" rules above specialise for the common case where delta = 1, so that we can avoid the delta>=0 test in enumDeltaToIntegerFB. Then enumDeltaToInteger1FB is nice and small and can be inlined, diff --git a/libraries/base/GHC/Event/Windows.hsc b/libraries/base/GHC/Event/Windows.hsc index 973f25722b..97a224fdc7 100644 --- a/libraries/base/GHC/Event/Windows.hsc +++ b/libraries/base/GHC/Event/Windows.hsc @@ -495,9 +495,8 @@ associateHandle Manager{..} h = FFI.associateHandleWithIOCP mgrIOCP h (fromIntegral $ ptrToWordPtr h) -{- Note [Why use non-waiting getOverlappedResult requests.] - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - +{- Note [Why use non-waiting getOverlappedResult requests] + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ When waiting for a request that is bound to be done soon we spin inside waitForCompletion. There are multiple reasons for this. @@ -549,6 +548,7 @@ withOverlappedEx mgr fname h async offset startCB completionCB = do IOFailed err -> signalThrow err -- Note [Memory Management] + -- ~~~~~~~~~~~~~~~~~~~~~~~~ -- These callback data and especially the overlapped structs have to keep -- alive throughout the entire lifetime of the requests. Since this -- function will block until done so it can call completionCB at the end diff --git a/libraries/base/GHC/Event/Windows/FFI.hsc b/libraries/base/GHC/Event/Windows/FFI.hsc index c087f94eb1..e6ae168d3f 100644 --- a/libraries/base/GHC/Event/Windows/FFI.hsc +++ b/libraries/base/GHC/Event/Windows/FFI.hsc @@ -136,6 +136,7 @@ foreign import WINDOWS_CCONV safe "windows.h GetQueuedCompletionStatusEx" -> Ptr ULONG -> DWORD -> BOOL -> IO BOOL -- | Note [Completion Ports] +-- ~~~~~~~~~~~~~~~~~~~~~~~ -- When an I/O operation has been queued by an operation -- (ReadFile/WriteFile/etc) it is placed in a queue that the driver uses when -- servicing IRQs. This queue has some important properties: @@ -343,7 +344,8 @@ pokeEventOverlapped lpol event = do ------------------------------------------------------------------------ -- Request management --- [Note AsyncHandles] +-- Note [AsyncHandles] +-- ~~~~~~~~~~~~~~~~~~~ -- In `winio` we have designed it to work in asynchronous mode always. -- According to the MSDN documentation[1][2], when a handle is not opened -- in asynchronous mode then the operation would simply work but operate @@ -392,7 +394,7 @@ pokeEventOverlapped lpol event = do -- invalid. This is an issue because to pass `HANDLE`s we have to pass -- the native OS Handle not the Haskell one. i.e. remote-iserv. --- See [Note AsyncHandles] +-- See Note [AsyncHandles] withRequest :: Bool -> Word64 -> HANDLE -> IOCallback -> (Ptr HASKELL_OVERLAPPED -> Ptr CompletionData -> IO a) -> IO a diff --git a/libraries/base/GHC/Foreign.hs b/libraries/base/GHC/Foreign.hs index 658f5c3515..042745ce11 100644 --- a/libraries/base/GHC/Foreign.hs +++ b/libraries/base/GHC/Foreign.hs @@ -295,7 +295,6 @@ tryFillBuffer encoder null_terminate from0 to_p to_sz_bytes = do {- Note [Check *before* fill in withEncodedCString] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - It's very important that the size check and readjustment peformed by tryFillBuffer happens before the continuation is called. The size check is the part which can fail, the call to the continuation never fails and so the caller should respond diff --git a/libraries/base/GHC/ForeignPtr.hs b/libraries/base/GHC/ForeignPtr.hs index a7061152dc..0361857bcc 100644 --- a/libraries/base/GHC/ForeignPtr.hs +++ b/libraries/base/GHC/ForeignPtr.hs @@ -165,7 +165,7 @@ data ForeignPtrContents -- The invariants that apply to 'MallocPtr' apply to 'PlainPtr' as well. -- Note [Why FinalPtr] --- +-- ~~~~~~~~~~~~~~~~~~~ -- FinalPtr exists as an optimization for foreign pointers created -- from Addr# literals. Most commonly, this happens in the bytestring -- library, where the combination of OverloadedStrings and a rewrite @@ -376,7 +376,9 @@ addForeignPtrFinalizer (FunPtr fp) (ForeignPtr p c) = case c of MallocPtr _ r -> insertCFinalizer r fp 0# nullAddr# p c _ -> errorWithoutStackTrace "GHC.ForeignPtr: attempt to add a finalizer to a plain pointer or a final pointer" --- Note [MallocPtr finalizers] (#10904) +-- Note [MallocPtr finalizers] +-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-- Ticket: #10904 -- -- When we have C finalizers for a MallocPtr, the memory is -- heap-resident and would normally be recovered by the GC before the diff --git a/libraries/base/GHC/IO/Encoding/Failure.hs b/libraries/base/GHC/IO/Encoding/Failure.hs index 271d66b35f..a26e3f8fcc 100644 --- a/libraries/base/GHC/IO/Encoding/Failure.hs +++ b/libraries/base/GHC/IO/Encoding/Failure.hs @@ -58,7 +58,6 @@ data CodingFailureMode -- Note [Roundtripping] -- ~~~~~~~~~~~~~~~~~~~~ --- -- Roundtripping is based on the ideas of PEP383. -- -- We used to use the range of private-use characters from 0xEF80 to diff --git a/libraries/base/GHC/IO/FD.hs b/libraries/base/GHC/IO/FD.hs index 9e9fa428b8..e97229704c 100644 --- a/libraries/base/GHC/IO/FD.hs +++ b/libraries/base/GHC/IO/FD.hs @@ -537,8 +537,8 @@ fdWriteNonBlocking fd ptr _offset bytes = do #if !defined(mingw32_HOST_OS) {- -NOTE [nonblock]: - +Note [nonblock] +~~~~~~~~~~~~~~~ Unix has broken semantics when it comes to non-blocking I/O: you can set the O_NONBLOCK flag on an FD, but it applies to the all other FDs attached to the same underlying file, pipe or TTY; there's no way to diff --git a/libraries/base/GHC/IO/Handle/Internals.hs b/libraries/base/GHC/IO/Handle/Internals.hs index 1bdb47b7ca..cbd43c1666 100644 --- a/libraries/base/GHC/IO/Handle/Internals.hs +++ b/libraries/base/GHC/IO/Handle/Internals.hs @@ -188,7 +188,7 @@ do_operation fun h act m = do throwIO e -- Note [async] --- +-- ~~~~~~~~~~~~ -- If an asynchronous exception is raised during an I/O operation, -- normally it is fine to just re-throw the exception synchronously. -- However, if we are inside an unsafePerformIO or an @@ -644,7 +644,6 @@ flushByteReadBuffer h_@Handle__{..} = do {- Note [Making offsets for append] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - The WINIO subysstem keeps track of offsets for handles on the Haskell side of things instead of letting the OS handle it. This requires us to establish the correct offset diff --git a/libraries/base/GHC/IO/Handle/Text.hs b/libraries/base/GHC/IO/Handle/Text.hs index bb576bcfd1..0e3dcd709e 100644 --- a/libraries/base/GHC/IO/Handle/Text.hs +++ b/libraries/base/GHC/IO/Handle/Text.hs @@ -320,7 +320,7 @@ unpack_nl !buf !r !w acc0 return (str, w) -- Note [#5536] --- +-- ~~~~~~~~~~~~ -- We originally had -- -- let c' = desurrogatifyRoundtripCharacter c in diff --git a/libraries/base/GHC/IO/Unsafe.hs b/libraries/base/GHC/IO/Unsafe.hs index e6c43e920c..98d2e12345 100644 --- a/libraries/base/GHC/IO/Unsafe.hs +++ b/libraries/base/GHC/IO/Unsafe.hs @@ -27,8 +27,9 @@ module GHC.IO.Unsafe ( import GHC.Base -{- Note [unsafePerformIO and strictness] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +{- +Note [unsafePerformIO and strictness] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Consider this sub-expression (from tests/lib/should_run/memo002) unsafePerformIO (do { lockMemoTable diff --git a/libraries/base/GHC/IO/Windows/Handle.hsc b/libraries/base/GHC/IO/Windows/Handle.hsc index bee7bc73a2..784a08f9d2 100644 --- a/libraries/base/GHC/IO/Windows/Handle.hsc +++ b/libraries/base/GHC/IO/Windows/Handle.hsc @@ -526,6 +526,7 @@ hwndWriteNonBlocking hwnd ptr offset bytes | otherwise = Mgr.ioFailed err -- Note [ReadFile/WriteFile] +-- ~~~~~~~~~~~~~~~~~~~~~~~~~ -- The results of these functions are somewhat different when working in an -- asynchronous manner. The returning bool has two meaning. -- diff --git a/libraries/base/GHC/IORef.hs b/libraries/base/GHC/IORef.hs index 616950c3c0..db932fca90 100644 --- a/libraries/base/GHC/IORef.hs +++ b/libraries/base/GHC/IORef.hs @@ -127,7 +127,6 @@ atomicModifyIORef' ref f = do -- Note [atomicModifyIORef' definition] -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --- -- atomicModifyIORef' was historically defined -- -- atomicModifyIORef' ref f = do diff --git a/libraries/base/GHC/Int.hs b/libraries/base/GHC/Int.hs index a514f4d35b..bde52848fd 100644 --- a/libraries/base/GHC/Int.hs +++ b/libraries/base/GHC/Int.hs @@ -160,13 +160,13 @@ instance Integral Int8 where | otherwise = I8# (x# `modInt8#` y#) quotRem x@(I8# x#) y@(I8# y#) | y == 0 = divZeroError - -- Note [Order of tests] + -- See Note [Order of tests] | y == (-1) && x == minBound = (overflowError, 0) | otherwise = case x# `quotRemInt8#` y# of (# q, r #) -> (I8# q, I8# r) divMod x@(I8# x#) y@(I8# y#) | y == 0 = divZeroError - -- Note [Order of tests] + -- See Note [Order of tests] | y == (-1) && x == minBound = (overflowError, 0) | otherwise = case x# `divModInt8#` y# of (# d, m #) -> (I8# d, I8# m) @@ -371,13 +371,13 @@ instance Integral Int16 where | otherwise = I16# (x# `modInt16#` y#) quotRem x@(I16# x#) y@(I16# y#) | y == 0 = divZeroError - -- Note [Order of tests] + -- See Note [Order of tests] | y == (-1) && x == minBound = (overflowError, 0) | otherwise = case x# `quotRemInt16#` y# of (# q, r #) -> (I16# q, I16# r) divMod x@(I16# x#) y@(I16# y#) | y == 0 = divZeroError - -- Note [Order of tests] + -- See Note [Order of tests] | y == (-1) && x == minBound = (overflowError, 0) | otherwise = case x# `divModInt16#` y# of (# d, m #) -> (I16# d, I16# m) @@ -579,13 +579,13 @@ instance Integral Int32 where | otherwise = I32# (x# `modInt32#` y#) quotRem x@(I32# x#) y@(I32# y#) | y == 0 = divZeroError - -- Note [Order of tests] + -- See Note [Order of tests] | y == (-1) && x == minBound = (overflowError, 0) | otherwise = case x# `quotRemInt32#` y# of (# q, r #) -> (I32# q, I32# r) divMod x@(I32# x#) y@(I32# y#) | y == 0 = divZeroError - -- Note [Order of tests] + -- See Note [Order of tests] | y == (-1) && x == minBound = (overflowError, 0) | otherwise = case x# `divModInt32#` y# of (# d, m #) -> (I32# d, I32# m) @@ -779,7 +779,7 @@ instance Enum Int64 where instance Integral Int64 where quot x@(I64# x#) y@(I64# y#) | y == 0 = divZeroError - | y == (-1) && x == minBound = overflowError -- Note [Order of tests] + | y == (-1) && x == minBound = overflowError -- See Note [Order of tests] | otherwise = I64# (x# `quotInt64#` y#) rem (I64# x#) y@(I64# y#) | y == 0 = divZeroError @@ -791,7 +791,7 @@ instance Integral Int64 where | otherwise = I64# (x# `remInt64#` y#) div x@(I64# x#) y@(I64# y#) | y == 0 = divZeroError - | y == (-1) && x == minBound = overflowError -- Note [Order of tests] + | y == (-1) && x == minBound = overflowError -- See Note [Order of tests] | otherwise = I64# (x# `divInt64#` y#) mod (I64# x#) y@(I64# y#) | y == 0 = divZeroError @@ -803,7 +803,7 @@ instance Integral Int64 where | otherwise = I64# (x# `modInt64#` y#) quotRem x@(I64# x#) y@(I64# y#) | y == 0 = divZeroError - -- Note [Order of tests] + -- See Note [Order of tests] | y == (-1) && x == minBound = (overflowError, 0) #if WORD_SIZE_IN_BITS < 64 -- we don't have quotRemInt64# primop yet @@ -814,7 +814,7 @@ instance Integral Int64 where #endif divMod x@(I64# x#) y@(I64# y#) | y == 0 = divZeroError - -- Note [Order of tests] + -- See Note [Order of tests] | y == (-1) && x == minBound = (overflowError, 0) #if WORD_SIZE_IN_BITS < 64 -- we don't have divModInt64# primop yet @@ -952,8 +952,9 @@ instance Ix Int64 where ------------------------------------------------------------------------------- -{- Note [Order of tests] -~~~~~~~~~~~~~~~~~~~~~~~~~ +{- +Note [Order of tests] +~~~~~~~~~~~~~~~~~~~~~ (See #3065, #5161.) Suppose we had a definition like: quot x y diff --git a/libraries/base/GHC/List.hs b/libraries/base/GHC/List.hs index 677d0fe7c1..8dc897c73c 100644 --- a/libraries/base/GHC/List.hs +++ b/libraries/base/GHC/List.hs @@ -284,7 +284,7 @@ foldl k z0 xs = {- Note [Left folds via right fold] - +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Implementing foldl et. al. via foldr is only a good idea if the compiler can optimize the resulting code (eta-expand the recursive "go"). See #7994. We hope that one of the two measure kick in: @@ -309,7 +309,7 @@ inline FB functions because: * They are higher-order functions and therefore benefit from inlining. * When the final consumer is a left fold, inlining the FB functions is the only - way to make arity expansion happen. See Note [Left fold via right fold]. + way to make arity expansion happen. See Note [Left folds via right fold]. For this reason we mark all FB functions INLINE [0]. The [0] phase-specifier ensures that calls to FB functions can be written back to the original form @@ -458,7 +458,7 @@ scanl = scanlGo [] -> [] x:xs -> scanlGo f (f q x) xs) --- Note [scanl rewrite rules] +-- See Note [scanl rewrite rules] {-# RULES "scanl" [~1] forall f a bs . scanl f a bs = build (\c n -> a `c` foldr (scanlFB f c) (constScanl n) bs a) @@ -509,7 +509,7 @@ scanl' = scanlGo' [] -> [] x:xs -> scanlGo' f (f q x) xs) --- Note [scanl rewrite rules] +-- See Note [scanl rewrite rules] {-# RULES "scanl'" [~1] forall f a bs . scanl' f a bs = build (\c n -> a `c` foldr (scanlFB' f c) (flipSeqScanl' n) bs a) @@ -529,7 +529,6 @@ flipSeqScanl' a !_b = a {- Note [scanl rewrite rules] ~~~~~~~~~~~~~~~~~~~~~~~~~~ - In most cases, when we rewrite a form to one that can fuse, we try to rewrite it back to the original form if it does not fuse. For scanl, we do something a little different. In particular, we rewrite @@ -651,7 +650,9 @@ scanrFB f c = \x ~(r, est) -> (f x r, r `c` est) scanr f q0 ls #-} -{- Note [scanrFB and evaluation] +{- +Note [scanrFB and evaluation] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In a previous Version, the pattern match on the tuple in scanrFB used to be strict. If scanr is called with a build expression, the following would happen: The rule "scanr" would fire, and we obtain @@ -1417,8 +1418,9 @@ foldr3_left _ z _ _ _ _ = z foldr3 k z (build g) = g (foldr3_left k z) (\_ _ -> z) #-} -{- Note [Fusion for foldrN] -~~~~~~~~~~~~~~~~~~~~~~~~~~~ +{- +Note [Fusion for foldrN] +~~~~~~~~~~~~~~~~~~~~~~~~ We arrange that foldr2, foldr3, etc is a good consumer for its first (left) list argument. Here's how. See below for the second, third etc list arguments diff --git a/libraries/base/GHC/Read.hs b/libraries/base/GHC/Read.hs index 7f698ec498..2c9aec08cd 100644 --- a/libraries/base/GHC/Read.hs +++ b/libraries/base/GHC/Read.hs @@ -410,7 +410,7 @@ readSymField fieldName readVal = do -- Note [Why readField] --- +-- ~~~~~~~~~~~~~~~~~~~~ -- Previously, the code for automatically deriving Read instance (in -- typecheck/GHC.Tc.Deriv.Generate.hs) would generate inline code for parsing fields; -- this, however, turned out to produce massive amounts of intermediate code, diff --git a/libraries/base/GHC/Real.hs b/libraries/base/GHC/Real.hs index d970a3e1ed..e8cfbfbc57 100644 --- a/libraries/base/GHC/Real.hs +++ b/libraries/base/GHC/Real.hs @@ -301,7 +301,7 @@ numericEnumFromThenTo e1 e2 e3 | otherwise = (>= e3 + mid) {- Note [Numeric Stability of Enumerating Floating Numbers] ------------------------------------------------------------ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ When enumerate floating numbers, we could add the increment to the last number at every run (as what we did previously): diff --git a/libraries/base/GHC/TopHandler.hs b/libraries/base/GHC/TopHandler.hs index ba86798091..6a4e0325a6 100644 --- a/libraries/base/GHC/TopHandler.hs +++ b/libraries/base/GHC/TopHandler.hs @@ -52,14 +52,13 @@ import Data.Dynamic (toDyn) -- Note [rts_setMainThread must be called unsafely] -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --- -- rts_setMainThread must be called as unsafe, because it -- dereferences the Weak# and manipulates the raw Haskell value -- behind it. Therefore, it must not race with a garbage collection. + -- Note [rts_setMainThread has an unsound type] -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --- -- 'rts_setMainThread' is imported with type Weak# ThreadId -> IO (), -- but this is an unsound type for it: it grabs the /key/ of the -- 'Weak#' object, which isn't tracked by the type at all. @@ -212,9 +211,9 @@ disasterHandler exit _ = "encode an error message. Check that your locale is configured " ++ "properly." -{- Note [Disaster with iconv] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - +{- +Note [Disaster with iconv] +~~~~~~~~~~~~~~~~~~~~~~~~~~ When using iconv, it's possible for things like iconv_open to fail in restricted environments (like an initram or restricted container), but when this happens the error raised inevitably calls `peekCString`, diff --git a/libraries/base/GHC/TypeNats.hs b/libraries/base/GHC/TypeNats.hs index 4325f3a8bf..ef4a5a8817 100644 --- a/libraries/base/GHC/TypeNats.hs +++ b/libraries/base/GHC/TypeNats.hs @@ -92,8 +92,9 @@ someNatVal :: Natural -> SomeNat someNatVal n = withSNat SomeNat (SNat n) Proxy {-# NOINLINE someNatVal #-} -- See Note [NOINLINE someNatVal] -{- Note [NOINLINE someNatVal] - +{- +Note [NOINLINE someNatVal] +~~~~~~~~~~~~~~~~~~~~~~~~~~ `someNatVal` converts a natural number to an existentially quantified dictionary for `KnownNat` (aka `SomeNat`). The existential quantification is very important, as it captures the fact that we don't know the type |