mirror of
https://github.com/sdiehl/wiwinwlh.git
synced 2024-08-16 23:40:41 +03:00
Update latex engine
This commit is contained in:
parent
0ff9a476e2
commit
53c11cbc8b
3
Makefile
3
Makefile
@ -3,6 +3,7 @@ IFORMAT = markdown
|
||||
TEMPLATE = resources/page.tmpl
|
||||
LTEMPLATE = resources/page.latex
|
||||
ETEMPLATE = resources/page.epubt
|
||||
LFLAGS = --top-level-division=chapter -V documentclass=book
|
||||
FLAGS = --standalone \
|
||||
--toc \
|
||||
--toc-depth=2 \
|
||||
@ -30,7 +31,7 @@ includes: includes.hs
|
||||
| $(PANDOC) -f $(IFORMAT) -t epub $(FLAGS) -o $@
|
||||
|
||||
%.pdf: %.md includes
|
||||
./includes < $< | $(PANDOC) -c -s -f $(IFORMAT) --template $(LTEMPLATE) --latex-engine=xelatex $(FLAGS) -o $@
|
||||
./includes < $< | $(PANDOC) -c -s -f $(IFORMAT) --template $(LTEMPLATE) --pdf-engine=xelatex $(FLAGS) $(LFLAGS) -o $@
|
||||
|
||||
clean:
|
||||
-rm $(CHAPTERS) $(HTML)
|
||||
|
@ -68,7 +68,7 @@ $toc$
|
||||
</h1>
|
||||
<p itemprop="version" class="document-version">
|
||||
Version
|
||||
<span class="version">2.3</span>
|
||||
<span class="version">2.5</span>
|
||||
</p>
|
||||
$body$
|
||||
</div>
|
||||
|
267
tutorial.md
267
tutorial.md
@ -1,10 +1,10 @@
|
||||
% What I Wish I Knew When Learning Haskell (Version 2.5)
|
||||
% Stephen Diehl
|
||||
% March 2016
|
||||
% January 2020
|
||||
|
||||
Stephen Diehl (<a class="author" href="https://twitter.com/smdiehl">@smdiehl</a> )
|
||||
|
||||
This is the fourth draft of this document.
|
||||
This is the fifth draft of this document.
|
||||
|
||||
#### License
|
||||
|
||||
@ -26,6 +26,16 @@ PDF Version
|
||||
Basics
|
||||
======
|
||||
|
||||
What is Haskell?
|
||||
----------------
|
||||
|
||||
TODO
|
||||
|
||||
GHC
|
||||
---
|
||||
|
||||
TODO
|
||||
|
||||
Cabal
|
||||
-----
|
||||
|
||||
@ -362,6 +372,78 @@ graphviz, then piped again into your favorite image viewer:
|
||||
$ stack dot --external | dot -Tpng | feh -
|
||||
```
|
||||
|
||||
HPack
|
||||
-----
|
||||
|
||||
TODO
|
||||
|
||||
Base
|
||||
----
|
||||
|
||||
The base library is split across
|
||||
|
||||
* Control
|
||||
* Data
|
||||
* Debug
|
||||
* Foreign
|
||||
* GHC
|
||||
* Numeric
|
||||
* Prelude
|
||||
* System
|
||||
* Text
|
||||
* Type
|
||||
* Unsafe
|
||||
|
||||
Prelude
|
||||
-------
|
||||
|
||||
The Prelude is the default standard module. The Prelude is imported by default into all
|
||||
Haskell modules unless either there is an explicit import statement for it, or
|
||||
the NoImplicitPrelude extension is enabled.
|
||||
|
||||
The Prelude exports several hundred symbols that are the default datatypes and
|
||||
functions for libraries that use the GHC-issued prelude. Many libraries these
|
||||
days do not use the standard prelude.
|
||||
|
||||
Boot Libraries
|
||||
--------------
|
||||
|
||||
GHC itself ships with a variety of libraries that are neccessary to bootstrap
|
||||
the compiler and compile itself.
|
||||
|
||||
* array
|
||||
* base
|
||||
* binary
|
||||
* bytestring
|
||||
* Cabal
|
||||
* containers
|
||||
* deepseq
|
||||
* directory
|
||||
* dist-haddock
|
||||
* filepath
|
||||
* ghc-boot
|
||||
* ghc-boot-th
|
||||
* ghc-compact
|
||||
* ghc-heap
|
||||
* ghci
|
||||
* ghc-prim
|
||||
* haskeline
|
||||
* hpc
|
||||
* integer-gmp
|
||||
* libiserv
|
||||
* mtl
|
||||
* parsec
|
||||
* pretty
|
||||
* process
|
||||
* stm
|
||||
* template-haskell
|
||||
* terminfo
|
||||
* text
|
||||
* time
|
||||
* transformers
|
||||
* unix
|
||||
* xhtml
|
||||
|
||||
Flags
|
||||
-----
|
||||
|
||||
@ -975,7 +1057,7 @@ which can be used to perform arbitrary print statements outside of the IO monad.
|
||||
|
||||
<div class="alert alert-danger">
|
||||
Trace uses ``unsafePerformIO`` under the hood and should **not** be used in
|
||||
stable code.
|
||||
production code.
|
||||
</div>
|
||||
|
||||
In addition to the ``trace`` function, several monadic ``trace`` variants are
|
||||
@ -1246,6 +1328,26 @@ to provide the user with any errors or warnings that would happen at compile
|
||||
time. When the developer edits and saves code loaded into ``ghcid``, the
|
||||
program automatically reloads and evaluates the code for errors and warnings.
|
||||
|
||||
Weeder
|
||||
------
|
||||
|
||||
TODO
|
||||
|
||||
HLint
|
||||
-----
|
||||
|
||||
TODO
|
||||
|
||||
Stylish-haskell
|
||||
---------------
|
||||
|
||||
TODO
|
||||
|
||||
Ormolu
|
||||
------
|
||||
|
||||
TODO
|
||||
|
||||
Haddock
|
||||
-------
|
||||
|
||||
@ -2485,7 +2587,7 @@ do type system research will have a very different interpretation of Haskell
|
||||
|
||||
<extensions></extensions>
|
||||
|
||||
See: [GHC Extension Reference](http://www.haskell.org/ghc/docs/7.8.2/html/users_guide/flag-reference.html#idp14615552)
|
||||
See: [GHC Extension Reference](https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts.html)
|
||||
|
||||
The Benign
|
||||
----------
|
||||
@ -2493,7 +2595,9 @@ The Benign
|
||||
It's not obvious which extensions are the most common but it's fairly safe to
|
||||
say that these extensions are benign and are safely used extensively:
|
||||
|
||||
* NoImplicitPrelude
|
||||
* OverloadedStrings
|
||||
* LambdaCase
|
||||
* FlexibleContexts
|
||||
* FlexibleInstances
|
||||
* GeneralizedNewtypeDeriving
|
||||
@ -2504,6 +2608,8 @@ say that these extensions are benign and are safely used extensively:
|
||||
* GADTs
|
||||
* BangPatterns
|
||||
* DeriveGeneric
|
||||
* DeriveAnyClass
|
||||
* DerivingStrategies
|
||||
* ScopedTypeVariables
|
||||
|
||||
The Dangerous
|
||||
@ -2512,15 +2618,15 @@ The Dangerous
|
||||
GHC's typechecker sometimes just casually tells us to enable language extensions when it can't solve certain
|
||||
problems. These include:
|
||||
|
||||
* AllowAmbigiousTypes
|
||||
* DatatypeContexts
|
||||
* OverlappingInstances
|
||||
* IncoherentInstances
|
||||
* ImpredicativeTypes
|
||||
* AllowAmbigiousTypes
|
||||
|
||||
These almost always indicate a design flaw and shouldn't be turned on to remedy the error at hand, as
|
||||
much as GHC might suggest otherwise!
|
||||
|
||||
Unless you know what you're doing, these extensions almost always indicate a
|
||||
design flaw and shouldn't be turned on to remedy the error at hand, as much as
|
||||
GHC might suggest otherwise!
|
||||
|
||||
NoMonomorphismRestriction
|
||||
-------------------------
|
||||
@ -2979,9 +3085,6 @@ an instance declaration for the type with no explicitly-defined methods. If
|
||||
the typeclass implements a default for each method then this will be
|
||||
well-defined and give rise to an automatic instances.
|
||||
|
||||
StaticPointers
|
||||
--------------
|
||||
|
||||
DuplicateRecordFields
|
||||
---------------------
|
||||
|
||||
@ -3098,6 +3201,26 @@ Or on the version of the base library used.
|
||||
It can also be abused to do terrible things like metaprogramming with strings,
|
||||
but please don't do this.
|
||||
|
||||
TypeApplications
|
||||
----------------
|
||||
|
||||
TODO
|
||||
|
||||
DerivingVia
|
||||
-----------
|
||||
|
||||
TODO
|
||||
|
||||
UndecidableSuperClasses
|
||||
-----------------------
|
||||
|
||||
TODO
|
||||
|
||||
DerivingStrategies
|
||||
-------------------
|
||||
|
||||
TODO
|
||||
|
||||
Historical Extensions
|
||||
---------------------
|
||||
|
||||
@ -3606,27 +3729,27 @@ implicit import of the whole namespace.
|
||||
import qualified Prelude as P
|
||||
```
|
||||
|
||||
What Should be in Base
|
||||
----------------------
|
||||
What Should be in Prelude
|
||||
--------------------------
|
||||
|
||||
To get work done you probably need.
|
||||
To get work done on industrial projects you probably need the following
|
||||
libraries:
|
||||
|
||||
<div class="alert alert-success">
|
||||
* async
|
||||
* bytestring
|
||||
* containers
|
||||
* mtl
|
||||
* stm
|
||||
* text
|
||||
* transformers
|
||||
* containers
|
||||
* unordered-containers
|
||||
* mtl
|
||||
* transformers
|
||||
* vector
|
||||
* filepath
|
||||
* directory
|
||||
* process
|
||||
* unix
|
||||
* deepseq
|
||||
* bytestring
|
||||
* optparse-applicative
|
||||
* stm
|
||||
* async
|
||||
* unix
|
||||
</div>
|
||||
|
||||
Custom Preludes
|
||||
@ -3667,6 +3790,20 @@ project is compiled without the implicit Prelude. Several packages have arisen
|
||||
that supply much of the same functionality in a way that appeals to more modern
|
||||
design principles.
|
||||
|
||||
Preludes
|
||||
--------
|
||||
|
||||
There are many approaches to custom preludes:
|
||||
|
||||
* [rio]
|
||||
* [protolude]
|
||||
* [base-prelude]
|
||||
* [relude]
|
||||
* [foundation]
|
||||
* [rebase]
|
||||
* [classy-prelude]
|
||||
* [basic-prelude]
|
||||
|
||||
Protolude
|
||||
---------
|
||||
|
||||
@ -3681,13 +3818,6 @@ writing modern Haskell and is compatible with existing code.
|
||||
import Protolude
|
||||
```
|
||||
|
||||
Other examples for alternative Preludes include (your mileage may vary with these):
|
||||
|
||||
* [base-prelude](http://hackage.haskell.org/package/base-prelude)
|
||||
* [basic-prelude](http://hackage.haskell.org/package/basic-prelude)
|
||||
* [classy-prelude](http://hackage.haskell.org/package/classy-prelude)
|
||||
* [Other Preludes](https://hackage.haskell.org/packages/#cat:Prelude)
|
||||
|
||||
Partial Functions
|
||||
-----------------
|
||||
|
||||
@ -3958,31 +4088,6 @@ data Tree a = Node a [Tree a]
|
||||
|
||||
See: [Typeclassopedia](http://wiki.haskell.org/Typeclassopedia)
|
||||
|
||||
Corecursion
|
||||
-----------
|
||||
|
||||
```haskell
|
||||
unfoldr :: (b -> Maybe (a, b)) -> b -> [a]
|
||||
```
|
||||
|
||||
A recursive function consumes data and eventually terminates, a corecursive
|
||||
function generates data and **coterminates**. A corecursive function is said to be
|
||||
*productive* if it can always evaluate more of the resulting value in bounded time.
|
||||
|
||||
```haskell
|
||||
import Data.List
|
||||
|
||||
f :: Int -> Maybe (Int, Int)
|
||||
f 0 = Nothing
|
||||
f x = Just (x, x-1)
|
||||
|
||||
rev :: [Int]
|
||||
rev = unfoldr f 10
|
||||
|
||||
fibs :: [Int]
|
||||
fibs = unfoldr (\(a,b) -> Just (a,(b,a+b))) (0,1)
|
||||
```
|
||||
|
||||
split
|
||||
-----
|
||||
|
||||
@ -4048,6 +4153,10 @@ Variant Module
|
||||
<b>strict bytestring</b> Data.ByteString
|
||||
<b>lazy bytestring</b> Data.ByteString.Lazy
|
||||
|
||||
Escaping Text
|
||||
--------------
|
||||
|
||||
Haskell uses C-style single-character escape codes
|
||||
|
||||
#### Conversions
|
||||
|
||||
@ -4233,6 +4342,11 @@ form.
|
||||
~~~~ {.haskell include="src/07-text-bytestring/convert.hs"}
|
||||
~~~~
|
||||
|
||||
Regex
|
||||
-----
|
||||
|
||||
TODO
|
||||
|
||||
<hr/>
|
||||
|
||||
Applicatives
|
||||
@ -9068,11 +9182,9 @@ Cryptography
|
||||
cryptonite
|
||||
----------
|
||||
|
||||
**Ciphers**
|
||||
|
||||
Symmetric-key algorithms are algorithms for cryptography that use the same
|
||||
cryptographic keys for both encryption of plaintext and decryption of
|
||||
ciphertext.
|
||||
Cryptonite is the standard Haskell cryptography library. It provides support for
|
||||
hash functions, elliptic curve cryptography, ciphers, one time passwords and
|
||||
safe memory handling.
|
||||
|
||||
* AES
|
||||
* Blowfish
|
||||
@ -9084,7 +9196,7 @@ ciphertext.
|
||||
* Salsa
|
||||
* TripleDES
|
||||
|
||||
**Hash**
|
||||
**Hashing**
|
||||
|
||||
A cryptographic hash function is a special class of hash function that has
|
||||
certain properties which make it suitable for use in cryptography. It is a
|
||||
@ -9122,6 +9234,25 @@ convertToBase :: (ByteArrayAccess bin, ByteArray bout) => Base -> bin -> bout
|
||||
convertFromBase :: (ByteArrayAccess bin, ByteArray bout) => Base -> bin -> Either String bout
|
||||
```
|
||||
|
||||
galois-field
|
||||
------------
|
||||
|
||||
TODO
|
||||
|
||||
elliptic-curve
|
||||
--------------
|
||||
|
||||
TODO
|
||||
|
||||
pairing
|
||||
-------
|
||||
|
||||
TODO
|
||||
|
||||
arithmetic-circuits
|
||||
-------------------
|
||||
|
||||
TODO
|
||||
|
||||
Date and Time
|
||||
=============
|
||||
@ -12526,6 +12657,8 @@ polymorphism* through typeclasses.
|
||||
|
||||
Haskell is *pure* and statically tracks effects.
|
||||
|
||||
Haskell has a *managed runtime*.
|
||||
|
||||
Haskell employs *lazy evaluation* by default using *call-by-need*.
|
||||
|
||||
Haskell's package manager is cabal-install or stack.
|
||||
@ -12841,6 +12974,8 @@ Erlang is *impure* by default and does not statically track effects.
|
||||
Elixir
|
||||
------
|
||||
|
||||
TODO
|
||||
|
||||
Java
|
||||
------
|
||||
|
||||
@ -13160,14 +13295,26 @@ The majority of PHP implementations are garbage collected.
|
||||
Perl
|
||||
----
|
||||
|
||||
TODO
|
||||
|
||||
Lua
|
||||
---
|
||||
|
||||
TODO
|
||||
|
||||
<hr/>
|
||||
|
||||
Code
|
||||
====
|
||||
|
||||
All code is available from this Github repository. This code is dedicated to the
|
||||
public domain. You can copy, modify, distribute and perform the work, even for
|
||||
commercial purposes, all without asking permission.
|
||||
|
||||
**https://github.com/sdiehl/wiwinwlh**
|
||||
|
||||
Chapters:
|
||||
|
||||
* [01-basics/ ](https://github.com/sdiehl/wiwinwlh/tree/master/src/01-basics/)
|
||||
* [02-monads/ ](https://github.com/sdiehl/wiwinwlh/tree/master/src/02-monads/)
|
||||
* [03-monad-transformers/](https://github.com/sdiehl/wiwinwlh/tree/master/src/03-monad-transformers/)
|
||||
|
Loading…
Reference in New Issue
Block a user