Hier die Zusammenfassung des ersten Kapitels von "Real World Haskell" und ein paar Diskussionsergebnissen dazu:
Chapter 1. Getting Started
Your Haskell environment
ghc, ghci, runghc
Getting started with ghci, the interpreter
- aka REPL
- Importieren von Modulen:
ghci> :module + Data.Ratio
:m +Data.Ratio
import Data.Ratio
Basic interaction: using ghci as a calculator
Simple arithmetic
- infix vs prefix form:
infix form: 2 + 2
prefix form: (+) 2 2
- "Integers can be arbitrarily large."
An arithmetic quirk: writing negative numbers
- "Haskell lets us define new operators at any time."
Boolean logic, operators, and value comparisons
- "not equal" Operator: /= (Haskell hat keine Zuweisungsoperatoren)
- "not" Funktion (nicht "!")
Operator precedence and associativity
- Precedence 0(low) - 9(high) (nicht wie im Buch angegeben 1-9)
- links/rechts assoziativ
- Operatoren sind "besondere Funktionen" die fixity rules besitzen
- Möglichkeit der Erstellung von DSLs
- Der Versuch, eine bestehende Funktion nachträglich mit fixity rules zu belegen, führt zu einem Parserfehler:
The fixity signature for map' lacks an accompanying binding (The fixity signature must be given where
map' is declared)
Undefined values, and introducing variables
- Exponentialfunktionen ** und ^
- Typfehler wenn man ^ mit einer Kommazahl als Exponenten aufruft:
Prelude Data.Ratio> 1 ** 1.1
1.0
Prelude Data.Ratio> 1 ^ 1.1
:8:5:
Ambiguous type variable b0' in the constraints: (Fractional b0) arising from the literal
1.1' at :8:5-7
(Integral b0) arising from a use of ^' at <interactive>:8:3 Probable fix: add a type signature that fixes these type variable(s) In the second argument of
(^)', namely 1.1' In the expression: 1 ^ 1.1 In an equation for
it': it = 1 ^ 1.1
=> Fehlermeldung kann man lesen als: "^ erwartet Typeclass Integral, aber 1.1 ist Fractional"
Dealing with precedence and associativity rules
- "It is sometimes better to leave at least some parentheses in place"
Command line editing in ghci
Lists
- Enumeration notation: [x..y] (inklusive)
- Intervallschritte
- unendliche Listen, z.B.: [1..]
- ".." ist kein Operator, sondern ein Sprachkonstrukt in Listenliteralen
- Haskell unterstützt keine heterogenen Listen (alle Elemente müssen vom selben Typ sein)
Operators on lists
++ concat
: "cons" (einzelnes Element vorne anhängen)
Strings and characters
- Strings sind Listen
- concat (++) ist relativ teuer
First steps with types
- "Haskell requires type names to start with an uppercase letter, and variable names must start with a lowercase letter."
- Typdeklarationen mit ::
- String ist ein Alias für [Char]
- Parametrisierte Typen: Ratio Integer
A simple program
- where ist ein Schlüsselwort, davor wird eine Variable benutzt die erst danach definiert wird
Sonstiges:
Organisatorisches:
- Nächster Hangout wieder kommenden Dienstag 21 Uhr
- Christian bereitet das zweite Kapitel vor