Îõ³h*>¬     0(c) Edward Kmett 2024BSD-2-Clause OR Apache-2.0Edward Kmett  experimental non-portable Trustworthy (-01>ËÍØÝìŽ  placeholder This is the  thrown by  , , and  . placeholder This is the  thrown by ,  and  . placeholder# can be used in most circumstances  è can, but it can also be used in pattern position to indicate cases haven't been considered yet. Unlike è it does not provide a compile-time warning, as it is expected that this _may_ remain in code long term. placeholder9 indicates unfinished code or an unfinished pattern match8You can use this in most positions where you could pass æ, but it also can be used in pattern position to indicate that there are cases you haven't considered.7There remain some circumstances where you can only use +, however, they arise when using this in a  PolyKinded situation.This pattern synonym is marked COMPLETE., implying that every match after matching on  will &emit a redundant pattern match warningü. Adding new options to your datatype, similarly to how wildcard patterns (patterns starting with an underscore) work, will  not cause any warnings or errors.ExamplesæSince the pattern match is strict, even if the branch itself does not evaluate to bottom, matching on  will. 2>>> x = [] >>> case x of ... (x : _) -> x ... Ä -> 42 *** Exception: Control.Placeholder.todo: not yet implemented 4As usual, this behaviour can be reversed by using a ~ in front of  in pattern position. 3>>> x = [] >>> case x of ... (x : _) -> x ... ~ -> 42 42 In most situations,  can be used just like ,, where the above is equivalent to the below  >>> y ::  =  >>> x ::  =  Representation PolymorphismŠMind that pattern synonyms may not be representation polymorphic, hence, if you need something that can be used with some kind other than , you have to use . For example, / cannot stand instead of a pattern match on an  ::    or as a placeholder for a   ::   placeholderÀThis lets us discard the location information in a TodoException placeholderÍrobust retrieval of the current callstack suitable for custom exception types placeholder indicates unfinished code.€It is to be used whenever you want to indicate that you are missing a part of the implementation and want to fill that in later.?The main difference to other alternatives like typed holes and  or ; is, this does not throw an error but only emits a warning. Similarly to , å and typed holes, this will throw an error if it is evaluated at runtime which can only be caught in .âThis is intended to *never* stay in code but exists purely for signifying "work in progress" code.ÌTo make the emitted warning error instead (e.g. for the use in CI), add the -Werror=x-todo flag to your  OPTIONS_GHC.Examples superComplexFunction ::  a ->  1 -- we already know how to implement this in the  case superComplexFunction  =  42 -- but the . case is super complicated, so we leave it as  for now superComplexFunction ( a) =  Representation Polymorphism, in contrast to %, is fully representation polymorphic  placeholder 6 indicates unfinished code that lives in the IO monad.#It should be used similarly to how  should be used rather than × in IO to throw at the time the IO action is run rather than at the time it is created.  placeholder ; indicates that the relevant code is unimplemented. Unlike ú, it is expected that this _may_ remain in code long term, and so no warning is supplied. Use cases might include places where a typeclass would theoretically require a member to be implemented, but where the resulting violation is actually intended.  placeholder ’ indicates that the method is unimplemented, but it lives in IO, and so only throws when actually run, rather than when it is constructed. Unlike  è it does not provide a compile-time warning, as it is expected that this _may_ remain in code long term.         !"!#$%&'$&()*&+,-./0placeholder-0-inplaceControl.Placeholder placeholderData.IntInt Data.KindTypeGHC.ExtsInt#IntRep ByteArray# UnliftedTypeUnimplementedException"UnimplementedExceptionWithLocation TodoExceptionTodoExceptionWithLocation UnimplementedTODOtodotodoIO unimplementedunimplementedIO$fShowTodoException$fShowUnimplementedException!$fExceptionUnimplementedException$fExceptionTodoExceptionbaseGHC.Exception.Type Exceptionghc-primGHC.PrimTYPE withCallStackGHC.Err undefinederror GHC.TypesIO GHC.MaybeMaybeNothingGHC.BasepureJustGHC.IOthrowIO GHC.Exceptionthrow