>Safe     SafeURemove 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.NoneU !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdNoneefefefNoneghijghijghijNoneA k8 for string interpolation. Expression enclosed within #{...}/ are interpolated, the result has to be in the l 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 => am      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*()+(),()-().()/()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(){()|()}()~()()()()()()()()()()()()()()()()()()()()()()      !"#$%&'()*+,-./01234356789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXXYZ[\]^_`abcdefghijklmno%pqr(interpolate-0.1.1-HygOScYzrfbHpkoPicr0sBData.String.Interpolate.UtilData.String.Interpolate Data.String.Interpolate.IsStringPaths_interpolateiData.String.Interpolate.Compat%Data.String.Interpolate.Internal.UtilData.String.Interpolate.ParseunindentcatchIOversionbindirlibdirdatadir libexecdir sysconfdir getBinDir getLibDir getDataDir getLibexecDir getSysconfDirgetDataFileNametemplate-haskellLanguage.Haskell.TH.SyntaxnewNamemkNameLanguage.Haskell.TH.LibcharLstringLintegerLintPrimL wordPrimL floatPrimL doublePrimL rationalL stringPrimL charPrimLlitPvarPtupPconPinfixPtildePbangPasPwildPrecPlistPsigPviewPfieldPatmatchclausevarEconElitEappEinfixEinfixAppsectionLsectionRlamElamCaseEtupEcondEmultiIfEletEcaseEdoEcompEfromE fromThenEfromToE fromThenToElistEsigErecConErecUpdEstaticEfieldExpguardedBnormalBnormalGEpatGEbindSletSnoBindSparSfunDvalDdataDnewtypeDtySynDclassDinstanceWithOverlapDsigDforImpDpragInlD pragSpecD pragSpecInlD pragSpecInstD pragRuleDpragAnnD dataFamilyDopenTypeFamilyD dataInstD newtypeInstD tySynInstDclosedTypeFamilyD roleAnnotDstandaloneDerivD defaultSigDcxtnoSourceUnpackednesssourceNoUnpack sourceUnpacknoSourceStrictness sourceLazy sourceStrictnormalCrecCinfixCforallCgadtCrecGadtCbangbangType varBangTypeforallTvarTconTtupleTarrowTlistTappTsigT equalityTlitT promotedTpromotedTupleT promotedNilT promotedConsTnumTyLitstrTyLitnominalRrepresentationalRphantomRinferRvarKconKtupleKarrowKlistKappKstarK constraintKnoSigkindSigtyVarSiginjectivityAnncCallstdCallcApiprim javaScriptunsafesafetypeFamdataFamtySynEqnruleVar typedRuleVarExpVarEConELitEAppEInfixEUInfixEParensELamELamCaseETupE UnboxedTupECondEMultiIfELetECaseEDoECompE ArithSeqEListESigERecConERecUpdEStaticE UnboundVarEMatchClauseQExpQDecQPatLitPVarPTupP UnboxedTupPConPInfixPUInfixPParensPTildePBangPAsPWildPRecPListPSigPViewPMatchQClauseQStmtQConQTypeQTypeListTForallTAppTSigTVarTConT PromotedTInfixTUInfixTParensTTupleT UnboxedTupleTArrowT EqualityTPromotedTupleT PromotedNilT PromotedConsTStarT ConstraintTLitT WildCardTDecFunDValDDataDNewtypeDTySynDClassD InstanceDSigDForeignDInfixDPragmaD DataFamilyD DataInstD NewtypeInstD TySynInstDOpenTypeFamilyDClosedTypeFamilyD RoleAnnotDStandaloneDerivD DefaultSigD BangTypeQ VarBangTypeQFieldExpFieldPatNamePatQ FieldPatQFunDepPredPredQ TyVarBndrPlainTVKindedTVDecsQ RuleBndrQ TySynEqnQTExpunTypeInjectivityAnnKindOverlap Overlappable OverlappingOverlaps Incoherentbase Text.Read readMaybeghc-boot-th-8.0.1.20161018GHC.LanguageExtensions.Type ExtensionCppOverlappingInstancesUndecidableInstancesIncoherentInstancesUndecidableSuperClassesMonomorphismRestriction MonoPatBindsMonoLocalBindsRelaxedPolyRecExtendedDefaultRulesForeignFunctionInterfaceUnliftedFFITypesInterruptibleFFICApiFFIGHCForeignImportPrim JavaScriptFFIParallelArraysArrowsTemplateHaskellTemplateHaskellQuotes QuasiQuotesImplicitParamsImplicitPreludeScopedTypeVariablesAllowAmbiguousTypes UnboxedTuples BangPatterns TypeFamiliesTypeFamilyDependencies TypeInTypeOverloadedStringsOverloadedLists NumDecimalsDisambiguateRecordFieldsRecordWildCards RecordPuns ViewPatternsGADTs GADTSyntaxNPlusKPatternsDoAndIfThenElseRebindableSyntaxConstraintKinds PolyKinds DataKinds InstanceSigs ApplicativeDoStandaloneDerivingDeriveDataTypeableAutoDeriveTypeable DeriveFunctorDeriveTraversableDeriveFoldable DeriveGenericDefaultSignaturesDeriveAnyClass DeriveLiftTypeSynonymInstancesFlexibleContextsFlexibleInstancesConstrainedClassMethodsMultiParamTypeClassesNullaryTypeClassesFunctionalDependencies UnicodeSyntaxExistentialQuantification MagicHashEmptyDataDeclsKindSignaturesRoleAnnotationsParallelListCompTransformListCompMonadComprehensionsGeneralizedNewtypeDeriving RecursiveDoPostfixOperators TupleSections PatternGuardsLiberalTypeSynonyms RankNTypesImpredicativeTypes TypeOperatorsExplicitNamespacesPackageImportsExplicitForAllAlternativeLayoutRule!AlternativeLayoutRuleTransitionalDatatypeContextsNondecreasingIndentation RelaxedLayoutTraditionalRecordSyntax LambdaCase MultiWayIfBinaryLiteralsNegativeLiteralsDuplicateRecordFieldsOverloadedLabels EmptyCasePatternSynonymsPartialTypeSignaturesNamedWildCardsStaticPointersTypeApplicationsStrict StrictDataMonadFailDesugaringLanguage.Haskell.TH.Ppr pprParendTypepprPatpprLitpprExppprintPprpprppr_list thisModuleappsE varStrictType strictTypeunpacked notStrictisStrictequalPclassPparensTuInfixTinfixTclosedTypeFamilyKindDclosedTypeFamilyNoKindD familyKindD familyNoKindD pragLineD instanceDstringE arithSeqElam1EuInfixEparensEdynpatGnormalG fromThenToRfromToR fromThenRfromRparensPuInfixPInfoQTyLitQCxtQBodyQGuardQRangeQSourceStrictnessQSourceUnpackednessQ StrictTypeQVarStrictTypeQ defaultFixity maxPrecedenceunboxedTupleTypeNameunboxedTupleDataName tupleTypeName tupleDataName nameSpace namePackage nameModulenameBase extsEnabled isExtEnabledrunIOlocation isInstancereifyConStrictness reifyModulereifyAnnotations reifyRolesreifyInstances reifyFixityreifylookupValueNamelookupTypeNamerecover reportWarning reportErrorreportrunQ NameSpaceLoc loc_filename loc_package loc_module loc_startloc_endInfoClassIClassOpITyConIFamilyI PrimTyConIDataConIVarITyVarI ModuleInfo ParentNameArityUnlifted InstanceDecFixityFixityDirectionInfixLInfixRInfixNLitCharLStringLIntegerL RationalLIntPrimL WordPrimL FloatPrimL DoublePrimL StringPrimL CharPrimLBodyGuardedBNormalBGuardNormalGPatGStmtBindSLetSNoBindSParSRangeFromR FromThenRFromToR FromThenToRTypeFamilyHeadTySynEqn FamFlavourTypeFamDataFamForeignImportFExportFCallconvStdCallCCall JavaScriptCApiPrimSafetySafeUnsafe InterruptiblePragmaInlineP SpecialisePSpecialiseInstPRulePAnnPLinePInlineNoInline Inlinable RuleMatchConLikeFunLikePhases AllPhases FromPhase BeforePhaseRuleBndrRuleVar TypedRuleVar AnnTargetModuleAnnotationTypeAnnotationValueAnnotationCxtSourceUnpackedness SourceUnpackSourceNoUnpackNoSourceUnpackednessSourceStrictness SourceLazy SourceStrictNoSourceStrictnessDecidedStrictness DecidedLazy DecidedStrict DecidedUnpackConNormalCRecCInfixCForallCGadtCRecGadtCBangFamilyResultSigKindSigTyVarSigNoSigTyLitNumTyLitStrTyLitRoleNominalRRepresentationalRPhantomRInferR AnnLookupAnnLookupModule AnnLookupNametoStringunescapeNodeLiteral Expression parseNodesLanguage.Haskell.TH.Quote QuasiQuoterGHC.ShowShow