debug-0.0.2: README.md
# Haskell Debugger [](https://hackage.haskell.org/package/debug) [](https://www.stackage.org/package/debug) [](https://travis-ci.org/ndmitchell/debug) [](https://ci.appveyor.com/project/ndmitchell/debug)
A library for debugging Haskell programs. To use, take the functions that you are interested in debugging, e.g.:
```haskell
module QuickSort(quicksort) where
import Data.List
quicksort :: Ord a => [a] -> [a]
quicksort [] = []
quicksort (x:xs) = quicksort lt ++ [x] ++ quicksort gt
where (lt, gt) = partition (<= x) xs
```
Turn on the `TemplateHaskell` and `ViewPatterns` extensions, import `Debug`, indent your code and place it under a call to `debug`, e.g.:
```haskell
{-# LANGUAGE TemplateHaskell, ViewPatterns #-}
module QuickSort(quicksort) where
import Data.List
import Debug
debug [d|
quicksort :: Ord a => [a] -> [a]
quicksort [] = []
quicksort (x:xs) = quicksort lt ++ [x] ++ quicksort gt
where (lt, gt) = partition (<= x) xs
|]
```
We can now run our debugger with:
```console
$ ghci QuickSort.hs
GHCi, version 8.2.1: http://www.haskell.org/ghc/ :? for help
[1 of 1] Compiling QuickSort ( QuickSort.hs, interpreted )
Ok, 1 module loaded.
*QuickSort> quicksort "haskell"
"aehklls"
*QuickSort> debugView
```
The call to `debugView` starts a web browser to view the recorded information, looking something like:

## Limitations
This tool is quite new, so it has both limitations, places it is incomplete and bugs. Some notable issues:
* It calls `show` on all the values in encounters, meaning they must all have a `Show` instance (it defines a global `Show` instance which should get used as a fallback), and they will be fully evaluated. If your program relies on laziness it probably won't work.
* It doesn't really understand shadowed variables, so it will work, but the debug results will be lower quality.
* For function values it won't give you a whole lot of information.
## Alternatives
For practical alternatives for debugging Haskell programs you may wish to consider:
* [GHCi debugger](https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/ghci.html#the-ghci-debugger), simple imperative-style debugger in which you can stop a running computation in order to examine the values of variables. The debugger is integrated into GHCi. Robust, reliable, somewhat difficult to use.
* [Hood](https://hackage.haskell.org/package/hood) and [Hoed](https://hackage.haskell.org/package/Hoed), a value-based observational debugger with a difficult user interface, deals well with laziness.
* [Hat](https://hackage.haskell.org/package/hat), good ideas, but I've never got it working.
Compared to the above, `debug` stresses simplicitly of integration and user experience.
## FAQ
### Q: `debugView` fails talking about Wine?
A: If you get `wine: invalid directory "/home/f/.wine" in WINEPREFIX: not an absolute path` when running `debugView` that means `xdg-open` is handled by [Wine](https://www.winehq.org/). Fix that and it will work once more.