0@ Safe-InferredURemove indentation as much as possible while preserving relative indentation levels. is useful in combination with  to remove leading spaces that resulted from code indentation. That way you can freely indent your string literals without the indentation ending up in the resulting strings.Here is an example::set -XQuasiQuotesimport Data.String.Interpolate#import Data.String.Interpolate.Util:{  putStr $ unindent [i| def foo 23 end |]:}def foo 23endVTo allow this, two additional things are being done, apart from removing indentation:3One empty line at the beginning will be removed andif the last newline character ("\n"0) is followed by spaces, the spaces are removed.None  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~NoneNoneNoneA 8 for string interpolation. Expression enclosed within #{...}/ are interpolated, the result has to be in the  class.It interpolates stringslet name = "Marvin"putStrLn [i|name: #{name}|] name: Marvin or integers let age = 23putStrLn [i|age: #{age}|]age: 23 or arbitrary Haskell expressions!let profession = "\955-scientist">putStrLn [i|profession: #{unwords [name, "the", profession]}|]"profession: Marvin the -scientistNoneLike  , but constructs a value of type IsString a => a                   ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                                                                                                                               ! "   # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Z  [ \ ] ^ _ ` a b c d e f g h i j k l m  n o p q r s t u v w x y z { | } ~                                   interpolate-0.1.0Data.String.Interpolate.UtilData.String.Interpolate Data.String.Interpolate.IsStringiData.String.Interpolate.Compat%Data.String.Interpolate.Internal.UtilData.String.Interpolate.Parseunindenttemplate-haskellLanguage.Haskell.TH.SyntaxnewNamemkNameunTypeLanguage.Haskell.TH.LibcharLstringLintegerLintPrimL wordPrimL floatPrimL doublePrimL rationalLlitPvarPtupPconPinfixPtildePbangPasPwildPrecPlistPsigPviewPfieldPatmatchclausevarEconElitEappEinfixEinfixAppsectionLsectionRlamElamCaseEtupEcondEmultiIfEletEcaseEdoEcompEfromE fromThenEfromToE fromThenToElistEsigErecConErecUpdEfieldExpguardedBnormalBnormalGEpatGEbindSletSnoBindSparSfunDvalDdataDnewtypeDtySynDclassD instanceDsigDforImpDpragInlD pragSpecD pragSpecInlD familyNoKindD familyKindD dataInstD newtypeInstD tySynInstDclosedTypeFamilyKindDclosedTypeFamilyNoKindD roleAnnotDcxtclassPequalPisStrict notStrictnormalCrecCinfixCforallC strictType varStrictTypeforallTvarTconTtupleTarrowTlistTappTsigTlitT promotedTpromotedTupleT promotedNilT promotedConsTnumTyLitstrTyLitnominalRrepresentationalRphantomRinferRvarKconKtupleKarrowKlistKappKstarK constraintKcCallstdCallunsafesafe pragSpecInstD pragRuleDtypeFamdataFamtySynEqnruleVar typedRuleVarExpMatchClauseQExpQDecQPatMatchQClauseQStmtQConQTypeQTypeDecVarStrictTypeQ StrictTypeQFieldExpFieldPatNamePatQ FieldPatQFunDepPredPredQ TyVarBndrDecsQ RuleBndrQ TySynEqnQTExpNoInlineInline InlinableConLikeFunLike AllPhases FromPhase BeforePhasebase Text.Read readMaybeLanguage.Haskell.TH.Ppr pprParendTypepprPatpprLitpprExppprintppr_listpprPpr thisModuleappsEpragAnnDstringE arithSeqElam1EuInfixEparensEglobaldynpatGnormalG fromThenToRfromToR fromThenRfromRparensPuInfixP stringPrimLInfoQTyLitQCxtQBodyQGuardQRangeQ defaultFixity maxPrecedenceunboxedTupleTypeNameunboxedTupleDataName tupleTypeName tupleDataName nameModulenameBaserunIOlocation isInstance reifyModulereifyAnnotations reifyRolesreifyInstancesreifylookupValueNamelookupTypeNamerecover reportWarning reportErrorreportrunQ NameSpaceloc_end loc_start loc_module loc_package loc_filenameLocClassIClassOpITyConIFamilyI PrimTyConIDataConIVarITyVarIInfo ModuleInfo ParentNameArityUnlifted InstanceDecFixityInfixLInfixRInfixNFixityDirectionCharLStringLIntegerL RationalLIntPrimL WordPrimL FloatPrimL DoublePrimL StringPrimLLitLitPVarPTupP UnboxedTupPConPInfixPUInfixPParensPTildePBangPAsPWildPRecPListPSigPViewPVarEConELitEAppEInfixEUInfixEParensELamELamCaseETupE UnboxedTupECondEMultiIfELetECaseEDoECompE ArithSeqEListESigERecConERecUpdEGuardedBNormalBBodyNormalGPatGGuardBindSLetSNoBindSParSStmtFromR FromThenRFromToR FromThenToRRangeFunDValDDataDNewtypeDTySynDClassD InstanceDSigDForeignDInfixDPragmaDFamilyD DataInstD NewtypeInstD TySynInstDClosedTypeFamilyD RoleAnnotDTySynEqnTypeFamDataFam FamFlavourImportFExportFForeignCCallStdCallCallconvUnsafeSafe InterruptibleSafetyInlineP SpecialisePSpecialiseInstPRulePAnnPPragma RuleMatchPhasesRuleVar TypedRuleVarRuleBndrModuleAnnotationTypeAnnotationValueAnnotation AnnTargetCxtClassPEqualPIsStrict NotStrictUnpackedStrictNormalCRecCInfixCForallCConForallTAppTSigTVarTConT PromotedTTupleT UnboxedTupleTArrowTListTPromotedTupleT PromotedNilT PromotedConsTStarT ConstraintTLitTPlainTVKindedTVNumTyLitStrTyLitTyLitNominalRRepresentationalRPhantomRInferRRoleAnnLookupModule AnnLookupName AnnLookupKindtoStringunescapeNode ExpressionLiteral parseNodesLanguage.Haskell.TH.Quote QuasiQuoterGHC.ShowShow