Stan Report

This is the Haskell Static Analysis report generated by Stan

Stan Info

In this section, you can find the general information about the used Stan tool, compile-time and run-time environment variables and settings, including build information, system data and execution configurations.

Stan Version
Version0.1.3.0
Git Revision76e40f2fe61850f543518b3a028d0d11bf944344
Release DateMon Dec 9 20:42:40 2024 +0000
System Info
Operating Systemdarwin
Architectureaarch64
Compilerghc
Compiler Version9.10
Environment
Environment VariablesSTAN_USE_DEFAULT_CONFIG=True
TOML configuration files/Users/kamilzabinski/IdeaProjects/helvm/helps/.stan.toml
CLI arguments-s --hide-solution report

Project Info

Information about the analysed project

Project namehelps
Cabal Fileshelps.cabal
HIE Files Directory.hie
Files Number18

Analysis Info

Summary stats from the static analysis

Modules18
LoC2550
Extensions33
SafeHaskell Extensions0
Available inspections48
Checked inspections48
Found Observations15
Ignored Observations0

Static Analysis Summary

Here you can find the overall conclusion based on the various metadata and gathered information during the work of Stan on this project.

Observations

Based on the analysis results, Stan found several areas for improvement in the analysed files. In Stan terminology, we call these findings Observations. Below you can see the more detailed information about each observation, and find the possible ways to fix them for your project.

📄 hs/app/Lang.hs

  • ModuleLang
    Lines of Code10
    1. EmptyDataDecls
    2. ExistentialQuantification
    3. FlexibleContexts
    4. FlexibleInstances
    5. FunctionalDependencies
    6. GADTs
    7. GeneralizedNewtypeDeriving
    8. InstanceSigs
    9. KindSignatures
    10. LambdaCase
    11. MultiParamTypeClasses
    12. MultiWayIf
    13. NamedFieldPuns
    14. OverloadedStrings
    15. PartialTypeSignatures
    16. PatternGuards
    17. PolyKinds
    18. RankNTypes
    19. RecordWildCards
    20. ScopedTypeVariables
    21. StandaloneDeriving
    22. TupleSections
    23. TypeFamilies
    24. TypeSynonymInstances
    25. ViewPatterns
    26. TypeOperators
    27. DerivingStrategies
    28. ConstraintKinds
    29. StrictData
    1. Observations

      IDOBS-STAN-0010-dpyWB1-10:29
      SeverityWarning
      DescriptionUsage of partial function 'succ' for enumerable types
      Inspection IDSTAN-0010
      Category
      • Partial
      Filehs/app/Lang.hs
         9 ┃ 
        10 ┃   deriving stock (Bounded , Enum , Eq , Read , Show)
        11 ┃                             ^^^^
      

      Possible solutions

      • Use '(+ 1)' for integral types (but be aware of arithmetic overflow)
      • {Extra dependency} Use 'next' from 'Relude.Extra.Enum' in 'relude'
      IDOBS-STAN-0012-dpyWB1-10:29
      SeverityWarning
      DescriptionUsage of partial function 'toEnum' for enumerable types
      Inspection IDSTAN-0012
      Category
      • Partial
      Filehs/app/Lang.hs
         9 ┃ 
        10 ┃   deriving stock (Bounded , Enum , Eq , Read , Show)
        11 ┃                             ^^^^
      

      Possible solutions

      • {Extra dependency} Use 'safeToEnum' from 'Relude.Extra.Enum' in 'relude'
      IDOBS-STAN-0011-dpyWB1-10:29
      SeverityWarning
      DescriptionUsage of partial function 'pred' for enumerable types
      Inspection IDSTAN-0011
      Category
      • Partial
      Filehs/app/Lang.hs
         9 ┃ 
        10 ┃   deriving stock (Bounded , Enum , Eq , Read , Show)
        11 ┃                             ^^^^
      

      Possible solutions

      • Use '(- 1)' for integral types (but be aware of arithmetic overflow)
      • {Extra dependency} Use 'prev' from 'Relude.Extra.Enum' in 'relude'

    📄 hs/src/HelVM/HelPS/Compiler/Compiler.hs

    • ModuleHelVM.HelPS.Compiler.Compiler
      Lines of Code10
      1. EmptyDataDecls
      2. ExistentialQuantification
      3. FlexibleContexts
      4. FlexibleInstances
      5. FunctionalDependencies
      6. GADTs
      7. GeneralizedNewtypeDeriving
      8. InstanceSigs
      9. KindSignatures
      10. LambdaCase
      11. MultiParamTypeClasses
      12. MultiWayIf
      13. NamedFieldPuns
      14. OverloadedStrings
      15. PartialTypeSignatures
      16. PatternGuards
      17. PolyKinds
      18. RankNTypes
      19. RecordWildCards
      20. ScopedTypeVariables
      21. StandaloneDeriving
      22. TupleSections
      23. TypeFamilies
      24. TypeSynonymInstances
      25. ViewPatterns
      26. TypeOperators
      27. DerivingStrategies
      28. ConstraintKinds
      29. StrictData
      1. Observations

        IDOBS-STAN-0010-IrRJYa-10:29
        SeverityWarning
        DescriptionUsage of partial function 'succ' for enumerable types
        Inspection IDSTAN-0010
        Category
        • Partial
        Filehs/src/HelVM/HelPS/Compiler/Compiler.hs
           9 ┃ 
          10 ┃   deriving stock (Bounded , Enum , Eq , Read , Show)
          11 ┃                             ^^^^
        

        Possible solutions

        • Use '(+ 1)' for integral types (but be aware of arithmetic overflow)
        • {Extra dependency} Use 'next' from 'Relude.Extra.Enum' in 'relude'
        IDOBS-STAN-0012-IrRJYa-10:29
        SeverityWarning
        DescriptionUsage of partial function 'toEnum' for enumerable types
        Inspection IDSTAN-0012
        Category
        • Partial
        Filehs/src/HelVM/HelPS/Compiler/Compiler.hs
           9 ┃ 
          10 ┃   deriving stock (Bounded , Enum , Eq , Read , Show)
          11 ┃                             ^^^^
        

        Possible solutions

        • {Extra dependency} Use 'safeToEnum' from 'Relude.Extra.Enum' in 'relude'
        IDOBS-STAN-0011-IrRJYa-10:29
        SeverityWarning
        DescriptionUsage of partial function 'pred' for enumerable types
        Inspection IDSTAN-0011
        Category
        • Partial
        Filehs/src/HelVM/HelPS/Compiler/Compiler.hs
           9 ┃ 
          10 ┃   deriving stock (Bounded , Enum , Eq , Read , Show)
          11 ┃                             ^^^^
        

        Possible solutions

        • Use '(- 1)' for integral types (but be aware of arithmetic overflow)
        • {Extra dependency} Use 'prev' from 'Relude.Extra.Enum' in 'relude'

      📄 hs/src/HelVM/HelPS/Compiler/Compiler/Classy.hs

      • ModuleHelVM.HelPS.Compiler.Compiler.Classy
        Lines of Code589
        1. EmptyDataDecls
        2. ExistentialQuantification
        3. FlexibleContexts
        4. FlexibleInstances
        5. FunctionalDependencies
        6. GADTs
        7. GeneralizedNewtypeDeriving
        8. InstanceSigs
        9. KindSignatures
        10. LambdaCase
        11. MultiParamTypeClasses
        12. MultiWayIf
        13. NamedFieldPuns
        14. OverloadedStrings
        15. PartialTypeSignatures
        16. PatternGuards
        17. PolyKinds
        18. RankNTypes
        19. RecordWildCards
        20. ScopedTypeVariables
        21. StandaloneDeriving
        22. TupleSections
        23. TypeFamilies
        24. TypeSynonymInstances
        25. ViewPatterns
        26. TypeOperators
        27. DerivingStrategies
        28. ConstraintKinds
        29. StrictData
        1. BlockArguments
      • Observations

        IDOBS-STAN-0010-HNeOU4-175:70
        SeverityWarning
        DescriptionUsage of partial function 'succ' for enumerable types
        Inspection IDSTAN-0010
        Category
        • Partial
        Filehs/src/HelVM/HelPS/Compiler/Compiler/Classy.hs
         174 ┃ 
         175 ┃ expr precTab = fix \r n -> ife (n <= 9) (liftA2 (opFold precTab) (r (succ n)) (many (liftA2 (\a b -> (a,b)) (opWithPrec precTab n) (r (succ n))))) (aexp (r 0));
         176 ┃                                                                      ^^^^
        

        Possible solutions

        • Use '(+ 1)' for integral types (but be aware of arithmetic overflow)
        • {Extra dependency} Use 'next' from 'Relude.Extra.Enum' in 'relude'
        IDOBS-STAN-0010-HNeOU4-175:136
        SeverityWarning
        DescriptionUsage of partial function 'succ' for enumerable types
        Inspection IDSTAN-0010
        Category
        • Partial
        Filehs/src/HelVM/HelPS/Compiler/Compiler/Classy.hs
         174 ┃ 
         175 ┃ expr precTab = fix \r n -> ife (n <= 9) (liftA2 (opFold precTab) (r (succ n)) (many (liftA2 (\a b -> (a,b)) (opWithPrec precTab n) (r (succ n))))) (aexp (r 0));
         176 ┃                                                                                                                                        ^^^^
        

        Possible solutions

        • Use '(+ 1)' for integral types (but be aware of arithmetic overflow)
        • {Extra dependency} Use 'next' from 'Relude.Extra.Enum' in 'relude'
        IDOBS-STAN-0010-HNeOU4-247:91
        SeverityWarning
        DescriptionUsage of partial function 'succ' for enumerable types
        Inspection IDSTAN-0010
        Category
        • Partial
        Filehs/src/HelVM/HelPS/Compiler/Compiler/Classy.hs
         246 ┃ 
         247 ┃ rank ds v = foldr (\d t -> ife (lstEq v (fst d)) (\n -> ('[':) . showInt n . (']':)) (t . succ)) undefined ds 0;
         248 ┃                                                                                           ^^^^
        

        Possible solutions

        • Use '(+ 1)' for integral types (but be aware of arithmetic overflow)
        • {Extra dependency} Use 'next' from 'Relude.Extra.Enum' in 'relude'

      📄 hs/src/HelVM/HelPS/Compiler/Compiler/Typically.hs

      • ModuleHelVM.HelPS.Compiler.Compiler.Typically
        Lines of Code406
        1. EmptyDataDecls
        2. ExistentialQuantification
        3. FlexibleContexts
        4. FlexibleInstances
        5. FunctionalDependencies
        6. GADTs
        7. GeneralizedNewtypeDeriving
        8. InstanceSigs
        9. KindSignatures
        10. LambdaCase
        11. MultiParamTypeClasses
        12. MultiWayIf
        13. NamedFieldPuns
        14. OverloadedStrings
        15. PartialTypeSignatures
        16. PatternGuards
        17. PolyKinds
        18. RankNTypes
        19. RecordWildCards
        20. ScopedTypeVariables
        21. StandaloneDeriving
        22. TupleSections
        23. TypeFamilies
        24. TypeSynonymInstances
        25. ViewPatterns
        26. TypeOperators
        27. DerivingStrategies
        28. ConstraintKinds
        29. StrictData
        1. BlockArguments
      • Observations

        IDOBS-STAN-0010-F9BzRn-170:70
        SeverityWarning
        DescriptionUsage of partial function 'succ' for enumerable types
        Inspection IDSTAN-0010
        Category
        • Partial
        Filehs/src/HelVM/HelPS/Compiler/Compiler/Typically.hs
         169 ┃ 
         170 ┃ expr precTab = fix \r n -> ife (n <= 9) (liftA2 (opFold precTab) (r (succ n)) (many (liftA2 (\a b -> (a,b)) (opWithPrec precTab n) (r (succ n))))) (aexp (r 0));
         171 ┃                                                                      ^^^^
        

        Possible solutions

        • Use '(+ 1)' for integral types (but be aware of arithmetic overflow)
        • {Extra dependency} Use 'next' from 'Relude.Extra.Enum' in 'relude'
        IDOBS-STAN-0010-F9BzRn-170:136
        SeverityWarning
        DescriptionUsage of partial function 'succ' for enumerable types
        Inspection IDSTAN-0010
        Category
        • Partial
        Filehs/src/HelVM/HelPS/Compiler/Compiler/Typically.hs
         169 ┃ 
         170 ┃ expr precTab = fix \r n -> ife (n <= 9) (liftA2 (opFold precTab) (r (succ n)) (many (liftA2 (\a b -> (a,b)) (opWithPrec precTab n) (r (succ n))))) (aexp (r 0));
         171 ┃                                                                                                                                        ^^^^
        

        Possible solutions

        • Use '(+ 1)' for integral types (but be aware of arithmetic overflow)
        • {Extra dependency} Use 'next' from 'Relude.Extra.Enum' in 'relude'
        IDOBS-STAN-0010-F9BzRn-231:91
        SeverityWarning
        DescriptionUsage of partial function 'succ' for enumerable types
        Inspection IDSTAN-0010
        Category
        • Partial
        Filehs/src/HelVM/HelPS/Compiler/Compiler/Typically.hs
         230 ┃ 
         231 ┃ rank ds v = foldr (\d t -> ife (lstEq v (fst d)) (\n -> ('[':) . showInt n . (']':)) (t . succ)) undefined ds 0;
         232 ┃                                                                                           ^^^^
        

        Possible solutions

        • Use '(+ 1)' for integral types (but be aware of arithmetic overflow)
        • {Extra dependency} Use 'next' from 'Relude.Extra.Enum' in 'relude'

      📄 hs/src/HelVM/HelPS/MiniHaskell/Classy.hs

      • ModuleHelVM.HelPS.MiniHaskell.Classy
        Lines of Code1240
        1. EmptyDataDecls
        2. ExistentialQuantification
        3. FlexibleContexts
        4. FlexibleInstances
        5. FunctionalDependencies
        6. GADTs
        7. GeneralizedNewtypeDeriving
        8. InstanceSigs
        9. KindSignatures
        10. LambdaCase
        11. MultiParamTypeClasses
        12. MultiWayIf
        13. NamedFieldPuns
        14. OverloadedStrings
        15. PartialTypeSignatures
        16. PatternGuards
        17. PolyKinds
        18. RankNTypes
        19. RecordWildCards
        20. ScopedTypeVariables
        21. StandaloneDeriving
        22. TupleSections
        23. TypeFamilies
        24. TypeSynonymInstances
        25. ViewPatterns
        26. TypeOperators
        27. DerivingStrategies
        28. ConstraintKinds
        29. StrictData
        1. CPP
        2. FlexibleInstances
        3. NoMonomorphismRestriction
        4. TupleSections
        5. TypeSynonymInstances
      • Observations

        IDOBS-STAN-0010-I+Wgp0-579:57
        SeverityWarning
        DescriptionUsage of partial function 'succ' for enumerable types
        Inspection IDSTAN-0010
        Category
        • Partial
        Filehs/src/HelVM/HelPS/MiniHaskell/Classy.hs
         578 ┃ 
         579 ┃       ((fromMaybe undefined .) . opFold' precTab <$> r (succ n) <*>
         580 ┃                                                         ^^^^
        

        Possible solutions

        • Use '(+ 1)' for integral types (but be aware of arithmetic overflow)
        • {Extra dependency} Use 'next' from 'Relude.Extra.Enum' in 'relude'
        IDOBS-STAN-0010-I+Wgp0-580:52
        SeverityWarning
        DescriptionUsage of partial function 'succ' for enumerable types
        Inspection IDSTAN-0010
        Category
        • Partial
        Filehs/src/HelVM/HelPS/MiniHaskell/Classy.hs
         579 ┃ 
         580 ┃        many (liftA2 (,) (opWithPrec precTab n) (r (succ n))))
         581 ┃                                                    ^^^^
        

        Possible solutions

        • Use '(+ 1)' for integral types (but be aware of arithmetic overflow)
        • {Extra dependency} Use 'next' from 'Relude.Extra.Enum' in 'relude'
        IDOBS-STAN-0010-I+Wgp0-737:71
        SeverityWarning
        DescriptionUsage of partial function 'succ' for enumerable types
        Inspection IDSTAN-0010
        Category
        • Partial
        Filehs/src/HelVM/HelPS/MiniHaskell/Classy.hs
         736 ┃ 
         737 ┃             ife (v == fst x) (Just ('[' : showInt c "]")) (loop xs v (succ c)) } }
         738 ┃                                                                       ^^^^
        

        Possible solutions

        • Use '(+ 1)' for integral types (but be aware of arithmetic overflow)
        • {Extra dependency} Use 'next' from 'Relude.Extra.Enum' in 'relude'

      Configurations

      This section describes the final Stan configuration that was used on the project and explains how this result was assembled. Stan runtime settings have many parts, and each of them can come from different configuration sources. Stan is using Environment variables, TOML configuration file and CLI arguments to get the final results. If some option is specified through the multiple sources, the most prioritized one is used.

      ActionFilterScope

      Configuration Process Information

      Information and warnings that were gathered during the configuration assemble process. This helps to understand how different parts of the configurations were retrieved.

      • No TOML value is specified for key: check
      • No CLI option specified for: checks
      • configChecks is set through the source: TOML
      • No TOML value is specified for key: remove
      • No CLI option specified for: remove
      • configRemoved is set through the source: TOML
      • No TOML value is specified for key: ignore
      • No CLI option specified for: ignore
      • configIgnored is set through the source: TOML

      Report Explained

      Inspections

      List of Inspections used for analysing the project

      Inspection STAN-0001

      Partial: ghc-internal/head

      Usage of partial function 'head' for lists

      Warning
      • Partial
      • List

      Possible solutions

      • Replace list with 'NonEmpty' from 'Data.List.NonEmpty'
      • Use explicit pattern-matching over lists

      Inspection STAN-0002

      Partial: ghc-internal/tail

      Usage of partial function 'tail' for lists

      Warning
      • Partial
      • List

      Possible solutions

      • Replace list with 'NonEmpty' from 'Data.List.NonEmpty'
      • Use explicit pattern-matching over lists

      Inspection STAN-0003

      Partial: ghc-internal/init

      Usage of partial function 'init' for lists

      Warning
      • Partial
      • List

      Possible solutions

      • Replace list with 'NonEmpty' from 'Data.List.NonEmpty'
      • Use explicit pattern-matching over lists

      Inspection STAN-0004

      Partial: ghc-internal/last

      Usage of partial function 'last' for lists

      Warning
      • Partial
      • List

      Possible solutions

      • Replace list with 'NonEmpty' from 'Data.List.NonEmpty'
      • Use explicit pattern-matching over lists

      Inspection STAN-0005

      Partial: ghc-internal/!!

      Usage of partial function '!!' for lists

      Warning
      • Partial
      • List

      Inspection STAN-0006

      Partial: ghc-internal/cycle

      Usage of partial function 'cycle' for lists

      Warning
      • Partial
      • List

      Possible solutions

      • Replace list with 'NonEmpty' from 'Data.List.NonEmpty'
      • Use explicit pattern-matching over lists

      Inspection STAN-0007

      Partial: ghc-internal/genericIndex

      Usage of partial function 'genericIndex' for lists

      Warning
      • Partial
      • List

      Inspection STAN-0008

      Partial: ghc-internal/fromJust

      Usage of partial function 'fromJust' for 'Maybe'

      Warning
      • Partial

      Possible solutions

      • Use explicit pattern-matching over Maybe
      • Use one of the standard functions: 'maybe', 'fromMaybe'

      Inspection STAN-0009

      Partial: ghc-internal/read

      Usage of partial function 'read' for parsing 'String'

      Warning
      • Partial

      Possible solutions

      • Use 'readMaybe' or 'readEither' to handle failed parsing

      Inspection STAN-0010

      Partial: ghc-internal/succ

      Usage of partial function 'succ' for enumerable types

      Warning
      • Partial

      Possible solutions

      • Use '(+ 1)' for integral types (but be aware of arithmetic overflow)
      • {Extra dependency} Use 'next' from 'Relude.Extra.Enum' in 'relude'

      Inspection STAN-0011

      Partial: ghc-internal/pred

      Usage of partial function 'pred' for enumerable types

      Warning
      • Partial

      Possible solutions

      • Use '(- 1)' for integral types (but be aware of arithmetic overflow)
      • {Extra dependency} Use 'prev' from 'Relude.Extra.Enum' in 'relude'

      Inspection STAN-0012

      Partial: ghc-internal/toEnum

      Usage of partial function 'toEnum' for enumerable types

      Warning
      • Partial

      Possible solutions

      • {Extra dependency} Use 'safeToEnum' from 'Relude.Extra.Enum' in 'relude'

      Inspection STAN-0013

      Partial: ghc-internal/maximum

      Usage of partial function 'maximum' for

      Warning
      • Partial

      Inspection STAN-0014

      Partial: ghc-internal/minimum

      Usage of partial function 'minimum' for

      Warning
      • Partial

      Inspection STAN-0015

      Partial: ghc-internal/maximumBy

      Usage of partial function 'maximumBy' for

      Warning
      • Partial

      Inspection STAN-0016

      Partial: ghc-internal/minimumBy

      Usage of partial function 'minimumBy' for

      Warning
      • Partial

      Inspection STAN-0017

      Partial: ghc-internal/foldl1

      Usage of partial function 'foldl1' for

      Warning
      • Partial

      Inspection STAN-0018

      Partial: ghc-internal/foldl1'

      Usage of partial function 'foldl1'' for lists

      Warning
      • Partial
      • List

      Possible solutions

      • Replace list with 'NonEmpty' from 'Data.List.NonEmpty'
      • Use explicit pattern-matching over lists

      Inspection STAN-0019

      Partial: ghc-internal/foldr1

      Usage of partial function 'foldr1' for

      Warning
      • Partial

      Inspection STAN-0020

      Partial: ghc-internal/fromList

      Usage of partial function 'fromList' for

      Warning
      • Partial

      Inspection STAN-0021

      Partial: ghc-internal/fromInteger

      Usage of partial function 'fromInteger' for

      Warning
      • Partial

      Inspection STAN-0022

      Partial: ghc-internal/fromRational

      Usage of partial function 'fromRational' for Scientific

      Warning
      • Partial

      Possible solutions

      • Use a function like 'Data.Scientific.fromRationalRepetend' that handles repeating decimals
      • Convert to a fractional type like 'Double'

      Inspection STAN-0023

      Partial: ghc-internal/realToFrac

      Usage of partial function 'realToFrac' for Scientific

      Warning
      • Partial

      Possible solutions

      • Use 'Data.Scientific.fromFloatDigits'
      • use a function that handles repeating decimals, e.g. 'Data.Scientific.fromRationalRepetend . toRational'

      Inspection STAN-0024

      Partial: ghc-internal/recip

      Usage of partial function 'recip' for Scientific

      Warning
      • Partial

      Possible solutions

      • Convert to a fractional type like 'Double'

      Inspection STAN-0025

      Partial: ghc-internal//

      Usage of partial function '/' for Scientific

      Warning
      • Partial

      Possible solutions

      • Convert to a fractional type like 'Double'

      Inspection STAN-0101

      Infinite: ghc-internal/reverse

      Usage of the 'reverse' function that hangs on infinite lists

      PotentialBug
      • Infinite
      • List

      Possible solutions

      • Don't use 'reverse' if you expect your function to work with infinite lists
      • {Extra dependency} Use the 'slist' library for fast and safe functions on infinite lists

      Inspection STAN-0102

      Infinite: ghc-internal/isSuffixOf

      Usage of the 'isSuffixOf' function that hangs on infinite lists

      PotentialBug
      • Infinite
      • List

      Possible solutions

      • Don't use 'isSuffixOf' if you expect your function to work with infinite lists
      • {Extra dependency} Use the 'slist' library for fast and safe functions on infinite lists

      Inspection STAN-0103

      Infinite: ghc-internal/length

      Usage of the 'length' function that hangs on infinite lists

      PotentialBug
      • Infinite
      • List

      Possible solutions

      • Don't use 'length' if you expect your function to work with infinite lists
      • {Extra dependency} Use the 'slist' library for fast and safe functions on infinite lists

      Inspection STAN-0104

      Infinite: ghc-internal/genericLength

      Usage of the 'genericLength' function that hangs on infinite lists

      PotentialBug
      • Infinite
      • List

      Possible solutions

      • Don't use 'genericLength' if you expect your function to work with infinite lists
      • {Extra dependency} Use the 'slist' library for fast and safe functions on infinite lists

      Inspection STAN-0105

      Infinite: ghc-internal/sum

      Usage of the 'sum' function that hangs on infinite lists

      PotentialBug
      • Infinite
      • List

      Possible solutions

      • Don't use 'sum' if you expect your function to work with infinite lists
      • {Extra dependency} Use the 'slist' library for fast and safe functions on infinite lists

      Inspection STAN-0106

      Infinite: ghc-internal/product

      Usage of the 'product' function that hangs on infinite lists

      PotentialBug
      • Infinite
      • List

      Possible solutions

      • Don't use 'product' if you expect your function to work with infinite lists
      • {Extra dependency} Use the 'slist' library for fast and safe functions on infinite lists

      Inspection STAN-0201

      Anti-pattern: [0 .. length xs]

      Creating a list with wrong number of indices

      PotentialBug
      • AntiPattern

      Possible solutions

      • Replace '[0 .. length xs]' with '[0 .. length xs - 1]'
      • Use 'zip [0 ..] xs` to work with list of pairs: index and element

      Inspection STAN-0202

      Anti-pattern: foldl

      Usage of space-leaking function 'foldl'

      Error
      • SpaceLeak
      • AntiPattern

      Possible solutions

      • Replace 'foldl' with 'foldl''
      • Use 'foldr (flip . f)` instead of 'foldl f'

      Inspection STAN-0203

      Anti-pattern: Data.ByteString.Char8.pack

      Usage of 'pack' function that doesn't handle Unicode characters

      Error
      • AntiPattern

      Possible solutions

      • Convert to 'Text' and use 'encodeUtf8' from 'Data.Text.Encoding'
      • {Extra dependency} Use 'encodeUtf8' from 'relude'
      • {Extra dependency} Use the 'utf8-string' package

      Inspection STAN-0204

      Anti-pattern: HashMap size

      Usage of 'size' or 'length' for 'HashMap' that runs in linear time

      Performance
      • AntiPattern

      Possible solutions

      • {Extra dependency} Switch to 'Map' from 'containers'

      Inspection STAN-0205

      Anti-pattern: HashSet size

      Usage of 'size' or 'length' for 'HashSet' that runs in linear time

      Performance
      • AntiPattern

      Possible solutions

      • {Extra dependency} Switch to 'Set' from 'containers'

      Inspection STAN-0206

      Data types with non-strict fields

      Defining lazy fields in data types can lead to unexpected space leaks

      Performance
      • SpaceLeak
      • Syntax

      Possible solutions

      • Add '!' before the type, e.g. !Int or !(Maybe Bool)
      • Enable the 'StrictData' extension: {-# LANGUAGE StrictData #-}

      Inspection STAN-0207

      Anti-pattern: Foldable methods on possibly error-prone structures

      Usage of Foldable methods on (,), Maybe, Either

      PotentialBug
      • AntiPattern

      Possible solutions

      • Use more explicit functions with specific monomorphic types

      Inspection STAN-0208

      Anti-pattern: Slow 'length' for Text

      Usage of 'length' for 'Text' that runs in linear time

      Performance
      • AntiPattern

      Possible solutions

      • {Extra dependency} Switch to 'ByteString' from 'bytestring'

      Inspection STAN-0209

      Anti-pattern: Slow 'nub' for lists

      Usage of 'nub' on lists that runs in quadratic time

      Performance
      • AntiPattern

      Possible solutions

      • {Extra dependency} Switch list to 'Set' from 'containers'
      • {Extra dependency} Use 'ordNub/hashNub/sortNub/unstableNub' from 'relude'
      • {Extra dependency} Use 'nubOrd' from 'containers'
      • {Extra dependency} Use 'nubOrd' from 'extra'

      Inspection STAN-0210

      Anti-pattern: Slow 'for_' on ranges

      Usage of 'for_' or 'forM_' on numerical ranges is slow

      Performance
      • AntiPattern

      Possible solutions

      • {Extra dependency} Use 'loop' library for fast monadic looping

      Inspection STAN-0211

      Anti-pattern: '</>' for URLs

      Usage of '</>' for URLs results in the errors on Windows

      Error
      • AntiPattern

      Possible solutions

      • {Extra dependency} Use type-safe library for URLs
      • Concatenate URLs with slashes '/'

      Inspection STAN-0212

      Anti-pattern: unsafe functions

      Usage of unsafe functions breaks referential transparency

      Error
      • Unsafe
      • AntiPattern

      Possible solutions

      • Remove 'undefined' or at least replace with 'error' to give better error messages
      • Replace 'unsafeCoerce' with 'coerce'
      • Rewrite the code to avoid using 'unsafePerformIO' and other unsafe IO functions

      Inspection STAN-0213

      Anti-pattern: Pattern matching on '_'

      Pattern matching on '_' for sum types can create maintainability issues

      Warning
      • AntiPattern

      Possible solutions

      • Pattern match on each constructor explicitly
      • Add meaningful names to holes, e.g. '_anyOtherFailure'

      Inspection STAN-0214

      Anti-pattern: use 'compare'

      Usage of multiple comparison operators instead of single 'compare'

      Performance
      • AntiPattern

      Possible solutions

      • Rewrite code to use single 'compare' instead of many comparison operators

      Inspection STAN-0215

      Anti-pattern: Slashes in paths

      Usage of '/' or '\' in paths results in the errors on different operation systems

      Error
      • AntiPattern

      Possible solutions

      • {Extra dependency} Use '</>' operator from 'filepath'

      Inspection STAN-0301

      Missing fixity declaration for operator

      Using the implicit default fixity for operator: infixl 9

      Style
      • Syntax

      Possible solutions

      • Add 'infix[l|r]' declaration to the operator with explicit precedence

      Inspection STAN-0302

      Big tuples

      Using tuples of big size (>= 4) can decrease code readability

      Style
      • AntiPattern
      • Syntax

      Possible solutions

      • Consider defining and using a custom data type to improve code comprehension

      Severity

      We are using the following severity system to indicate the observation level

      SeverityDescription
      StyleCode style issues. Usually harmless.
      PerformanceSerious defects that could cause slowness and space leaking.
      PotentialBugHuman errors in code.
      WarningPotential runtime errors on some inputs.
      ErrorDangerous behaviour.