Softwerkskammer

 

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