I often read that I shouldn't mix tabs and spaces in Haskell, or that I shouldn't use tabs at all. Why?
相关问题
- What does an “empty line with semicolon” mean in C
- Understanding do notation for simple Reader monad:
- Making Custom Instances of PersistBackend
- Haskell: What is the differrence between `Num [a]
- applying a list to an entered function to check fo
相关文章
- Is it possible to write pattern-matched functions
- Haskell underscore vs. explicit variable
- Top-level expression evaluation at compile time
- Stuck in the State Monad
- What is the meaning of this syntax?
- foldr vs foldr1 usage in Haskell
- List of checkboxes with digestive-functors
- How does this list comprehension over the inits of
The problem is twofold. First of all, Haskell is indentation sensitive, e.g. the following code isn't valid:
Both bindings need to be indented with the same number of spaces/tabs (see off-side rule). While it's obvious in this case, it's rather hidden in the following one, where I denote a space by
·
and a tab by»
:This will look like valid Haskell code if the editor will show tabs aligned to multiples by four. But it isn't. Haskell tabs are aligned by multiples of eight, so the code will be interpreted like this:
Second, if you use only tabs, you can end up with a layout that doesn't look right. For example, the following code looks correct if a tab gets displayed with six or more spaces (eight in this case):
But in another editor that uses 4 spaces it won't look right anymore:
It's still correct, though. However, someone who's used to spaces might reindent
b
' binding with spaces and end up with a parser error.If you enforce a code convention throughout your code that makes sure that you only use tabs at the beginning of a line and use a newline after
where
,let
ordo
you can avoid some of the problems (see 11). However, current releases of GHC warn about tabs by default, because they have been a source of many parser errors in the past, so you probably want to get rid of them too.See also