Zum Inhalt springen

Haskell (Programmiersprache)

aus Wikipedia, der freien Enzyklopädie
{{#if: Logo der Programmiersprache Haskell | {{#if: | {{#if:funktional, nicht-strikt, modular, deklarativ| {{#if:1990| {{#if:| {{#if:Simon Peyton Jones, Paul Hudak,<ref><templatestyles src="Webarchiv/styles.css" />{{#if:20110607204813 {{#if:| {{#if:| {{#if:statisch, stark, Typinferenz| {{#if:GHC, Hugs, NHC, JHC, Yhc| {{#if:Helium, Gofer| {{#if:| {{#if:APL, LISP, Miranda, ML, C++| {{#if:Agda, Cayenne, Clean, Curry, Idris, Python, Rust, Scala, C#, F#, Swift, JavaScript| {{#if:| {{#if:| {{#if:haskell.org|
{{#if: Haskell | Haskell | {{#invoke:WLink|getArticleBase}} }}
colspan="2" class="notheme" style="text-align:center; background-color:#Vorlage:Standardfarbe;" | Logo der Programmiersprache Haskell |
 {{#if: {{#invoke:Wikidata|claim|P154}} |
[[Datei:{{#invoke:Wikidata|claim|P154}}|150px]]
 }}

}}

{{{Screenshot}}}{{#if: |
}}|

}}

Basisdaten
Paradigmen: funktional, nicht-strikt, modular, deklarativ

}}

Erscheinungsjahr: 1990 |
 {{#if: {{#invoke:Wikidata|claim|P571}} | 
Erscheinungsjahr: claim|P571|references=ja}}
 }}

}}

Designer:
 {{#if: {{#invoke:Wikidata|claim|P287}} | 
Designer: claim|P287|parameter=link|references=ja|list=, }}
 }}

}}

* Vorlage:Webarchiv/Wartung/Stern{{#if: Professor Paul Hudak’s Website | {{#invoke:WLink|getEscapedTitle|Professor Paul Hudak’s Website}} | {{#invoke:Webarchiv|getdomain|http://www.cs.yale.edu/homes/hudak-paul/}} }} (Archivversionen) 20110607204813}} {{#if: }}Vorlage:Webarchiv/Wartung/DatumDer Wert des Parameters {{#if: wayback | wayback | Datum }} muss ein gültiger Zeitstempel der Form YYYYMMDDHHMMSS sein! {{#invoke:WLink|getEscapedTitle|Professor Paul Hudak’s Website}} | {{#invoke:Webarchiv|getdomain|http://www.cs.yale.edu/homes/hudak-paul/}} }}] {{#ifeq: | [] | [ | ( }}Memento{{#if: {{#if: | {{{archiv-bot}}} | }} | des Vorlage:Referrer }} vom {{#time: j. F Y|20110607204813}} im Internet Archive{{#if: | ; }}{{#ifeq: | [] | ] | ) }}
      }}
  }}
{{#if: {{{webciteID}}}}} len|{{{webciteID}}}}} {{#invoke:WLink|getEscapedTitle|Professor Paul Hudak’s Website}} | {{#invoke:Webarchiv|getdomain|http://www.cs.yale.edu/homes/hudak-paul/}} }}] {{#ifeq: | [] | [ | ( }}Memento{{#if: {{#if: | {{{archiv-bot}}} | }} | des Vorlage:Referrer }} vom {{#time: j. F Y| 19700101000000 + {{#expr: floor {{#expr: {{#invoke:Str|sub|{{{webciteID}}}|1|10}}/86400}} }} days}} auf WebCite{{#if: | ; }}{{#ifeq: | [] | ] | ) }} {{#invoke:WLink|getEscapedTitle|Professor Paul Hudak’s Website}} | {{#invoke:Webarchiv|getdomain|http://www.cs.yale.edu/homes/hudak-paul/}} }}] {{#ifeq: | [] | [ | ( }}Memento{{#if: {{#if: | {{{archiv-bot}}} | }} | des Vorlage:Referrer}} vom {{#time: j. F Y| 19700101000000 + {{#expr: floor {{#expr: {{#invoke:Str|sub|{{#invoke:Expr|base62|{{{webciteID}}}}}|1|10}}/86400}} }} days}} auf WebCite{{#if: | ; }}{{#ifeq: | [] | ] | ) }} webciteID | ID }} muss entweder ein Zeitstempel der Form YYYYMMDDHHMMSS oder ein Schüsselwert mit 9 Zeichen oder eine 16-stellige Zahl sein!Vorlage:Webarchiv/Wartung/webcitation{{#if: }}
      }}
{{{webciteID}}}}} {{#if: Professor Paul Hudak’s Website | {{#invoke:WLink|getEscapedTitle|Professor Paul Hudak’s Website}} | {{#invoke:Webarchiv|getdomain|http://www.cs.yale.edu/homes/hudak-paul/}} }}] (Memento{{#if: {{#if: | {{{archiv-bot}}} | }} | des Vorlage:Referrer}} vom {{#time: j. F Y|{{{webciteID}}}}} auf WebCite{{#if: | ; }}{{#ifeq: | [] | ] | ) }}
  }}
{{#if: Vorlage:Webarchiv/Today {{#if: Vorlage:Webarchiv/Generisch {{#invoke:WLink|getEscapedTitle|Professor Paul Hudak’s Website}} | {{#invoke:Webarchiv|getdomain|http://www.cs.yale.edu/homes/hudak-paul/}} }}]
                 }}}}}}}}{{#if:
Vorlage:Webarchiv/archiv-bot
  }}{{#invoke:TemplatePar|check
all = url= opt = text= wayback= webciteID= archive-is= archive-today= archiv-url= archiv-datum= ()= archiv-bot= format= original= cat = Wikipedia:Vorlagenfehler/Vorlage:Webarchiv errNS = 0 template = Vorlage:Webarchiv format = * preview = 1
  }}{{#ifexpr: {{#if:20110607204813|1|0}}{{#if:|+1}}{{#if:|+1}}{{#if:|+1}}{{#if:|+1}} <> 1
{{#if: }}Vorlage:Webarchiv/Wartung/Parameter{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Genau einer der Parameter 'wayback', 'webciteID', 'archive-today', 'archive-is' oder 'archiv-url' muss angegeben werden.|1}}
  }}{{#if: 
getdomain|{{{archiv-url}}}}} web.archive.org =
          {{#if:  || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von Internet Archive erkannt, bitte Parameter 'wayback' benutzen.|1}} 
webcitation.org =
          {{#if:  || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von WebCite erkannt, bitte Parameter 'webciteID' benutzen.|1}} 
archive.is |archive.ph |archive.fo |archive.li |archive.md |archive.vn =
          {{#if:  || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von archive.today erkannt, bitte Parameter 'archive-today' benutzen.|1}}
      }}{{#if: 
Execute}}|}} {{#if: }}Vorlage:Webarchiv/Wartung/Parameter{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Wert des Parameter 'archiv-datum' ist ungültig oder hat ein ungültiges Format.|1}} }} {{#if: }}Vorlage:Webarchiv/Wartung/Parameter{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Pflichtparameter 'archiv-datum' wurde nicht angegeben.|1}}
      }}
{{#if: {{#if: }}Vorlage:Webarchiv/Wartung/Parameter{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Parameter 'archiv-datum' ist nur in Verbindung mit 'archiv-url' angebbar.|1}}
      }}
  }}{{#if:{{#invoke:URLutil|isHostPathResource|http://www.cs.yale.edu/homes/hudak-paul/}}
{{#if: }}
  }}{{#if: Professor Paul Hudak’s Website
isBracketedLink|Professor Paul Hudak’s Website}} {{#if: }}
      }}
{{#if: }}Vorlage:Webarchiv/Wartung/Linktext_fehlt
  }}{{#switch: 
addlpages= {{#if: }}{{#if: 1 |Vorlage:Webarchiv/Wartung/Parameter}}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: enWP-Wert im Parameter 'format'.|1}}
  }}{{#ifeq: {{#invoke:Str|find|http://www.cs.yale.edu/homes/hudak-paul/%7Carchiv}} |-1
{{#ifeq: {{#invoke:Str|find|{{#invoke:Str|cropleft|http://www.cs.yale.edu/homes/hudak-paul/%7C4}}%7Chttp}} |-1 {{#switch: {{#invoke:Webarchiv|getdomain|http://www.cs.yale.edu/homes/hudak-paul/ }} daserste.ndr.de | inarchive.com | webcitation.org = #default = {{#if: }}{{#if: 1 |Vorlage:Webarchiv/Wartung/URL}}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Archiv-URL im Parameter 'url' anstatt URL der Originalquelle. Entferne den vor der Original-URL stehenden Mementobestandteil und setze den Archivierungszeitstempel in den Parameter 'wayback', 'webciteID', 'archive.today' oder 'archive-is' ein, sofern nicht bereits befüllt.|1}}
            }} 
       }}
  }} an der Yale University</ref> Philip Wadler et al.|
Entwickler: Simon Peyton Jones, Paul Hudak,<ref><templatestyles src="Webarchiv/styles.css" />{{#if:20110607204813 * Vorlage:Webarchiv/Wartung/Stern{{#if: Professor Paul Hudak’s Website | {{#invoke:WLink|getEscapedTitle|Professor Paul Hudak’s Website}} | {{#invoke:Webarchiv|getdomain|http://www.cs.yale.edu/homes/hudak-paul/}} }} (Archivversionen) 20110607204813}} {{#if: }}Vorlage:Webarchiv/Wartung/DatumDer Wert des Parameters {{#if: wayback | wayback | Datum }} muss ein gültiger Zeitstempel der Form YYYYMMDDHHMMSS sein! {{#invoke:WLink|getEscapedTitle|Professor Paul Hudak’s Website}} | {{#invoke:Webarchiv|getdomain|http://www.cs.yale.edu/homes/hudak-paul/}} }}] {{#ifeq: | [] | [ | ( }}Memento{{#if: {{#if: | {{{archiv-bot}}} | }} | des Vorlage:Referrer }} vom {{#time: j. F Y|20110607204813}} im Internet Archive{{#if: | ; }}{{#ifeq: | [] | ] | ) }}
      }}
  }}
{{#if: {{{webciteID}}}}} len|{{{webciteID}}}}} {{#invoke:WLink|getEscapedTitle|Professor Paul Hudak’s Website}} | {{#invoke:Webarchiv|getdomain|http://www.cs.yale.edu/homes/hudak-paul/}} }}] {{#ifeq: | [] | [ | ( }}Memento{{#if: {{#if: | {{{archiv-bot}}} | }} | des Vorlage:Referrer }} vom {{#time: j. F Y| 19700101000000 + {{#expr: floor {{#expr: {{#invoke:Str|sub|{{{webciteID}}}|1|10}}/86400}} }} days}} auf WebCite{{#if: | ; }}{{#ifeq: | [] | ] | ) }} {{#invoke:WLink|getEscapedTitle|Professor Paul Hudak’s Website}} | {{#invoke:Webarchiv|getdomain|http://www.cs.yale.edu/homes/hudak-paul/}} }}] {{#ifeq: | [] | [ | ( }}Memento{{#if: {{#if: | {{{archiv-bot}}} | }} | des Vorlage:Referrer}} vom {{#time: j. F Y| 19700101000000 + {{#expr: floor {{#expr: {{#invoke:Str|sub|{{#invoke:Expr|base62|{{{webciteID}}}}}|1|10}}/86400}} }} days}} auf WebCite{{#if: | ; }}{{#ifeq: | [] | ] | ) }} webciteID | ID }} muss entweder ein Zeitstempel der Form YYYYMMDDHHMMSS oder ein Schüsselwert mit 9 Zeichen oder eine 16-stellige Zahl sein!Vorlage:Webarchiv/Wartung/webcitation{{#if: }}
      }}
{{{webciteID}}}}} {{#if: Professor Paul Hudak’s Website | {{#invoke:WLink|getEscapedTitle|Professor Paul Hudak’s Website}} | {{#invoke:Webarchiv|getdomain|http://www.cs.yale.edu/homes/hudak-paul/}} }}] (Memento{{#if: {{#if: | {{{archiv-bot}}} | }} | des Vorlage:Referrer}} vom {{#time: j. F Y|{{{webciteID}}}}} auf WebCite{{#if: | ; }}{{#ifeq: | [] | ] | ) }}
  }}
{{#if: Vorlage:Webarchiv/Today {{#if: Vorlage:Webarchiv/Generisch {{#invoke:WLink|getEscapedTitle|Professor Paul Hudak’s Website}} | {{#invoke:Webarchiv|getdomain|http://www.cs.yale.edu/homes/hudak-paul/}} }}]
                 }}}}}}}}{{#if:
Vorlage:Webarchiv/archiv-bot
  }}{{#invoke:TemplatePar|check
all = url= opt = text= wayback= webciteID= archive-is= archive-today= archiv-url= archiv-datum= ()= archiv-bot= format= original= cat = Wikipedia:Vorlagenfehler/Vorlage:Webarchiv errNS = 0 template = Vorlage:Webarchiv format = * preview = 1
  }}{{#ifexpr: {{#if:20110607204813|1|0}}{{#if:|+1}}{{#if:|+1}}{{#if:|+1}}{{#if:|+1}} <> 1
{{#if: }}Vorlage:Webarchiv/Wartung/Parameter{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Genau einer der Parameter 'wayback', 'webciteID', 'archive-today', 'archive-is' oder 'archiv-url' muss angegeben werden.|1}}
  }}{{#if: 
getdomain|{{{archiv-url}}}}} web.archive.org =
          {{#if:  || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von Internet Archive erkannt, bitte Parameter 'wayback' benutzen.|1}} 
webcitation.org =
          {{#if:  || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von WebCite erkannt, bitte Parameter 'webciteID' benutzen.|1}} 
archive.is |archive.ph |archive.fo |archive.li |archive.md |archive.vn =
          {{#if:  || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von archive.today erkannt, bitte Parameter 'archive-today' benutzen.|1}}
      }}{{#if: 
Execute}}|}} {{#if: }}Vorlage:Webarchiv/Wartung/Parameter{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Wert des Parameter 'archiv-datum' ist ungültig oder hat ein ungültiges Format.|1}} }} {{#if: }}Vorlage:Webarchiv/Wartung/Parameter{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Pflichtparameter 'archiv-datum' wurde nicht angegeben.|1}}
      }}
{{#if: {{#if: }}Vorlage:Webarchiv/Wartung/Parameter{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Parameter 'archiv-datum' ist nur in Verbindung mit 'archiv-url' angebbar.|1}}
      }}
  }}{{#if:{{#invoke:URLutil|isHostPathResource|http://www.cs.yale.edu/homes/hudak-paul/}}
{{#if: }}
  }}{{#if: Professor Paul Hudak’s Website
isBracketedLink|Professor Paul Hudak’s Website}} {{#if: }}
      }}
{{#if: }}Vorlage:Webarchiv/Wartung/Linktext_fehlt
  }}{{#switch: 
addlpages= {{#if: }}{{#if: 1 |Vorlage:Webarchiv/Wartung/Parameter}}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: enWP-Wert im Parameter 'format'.|1}}
  }}{{#ifeq: {{#invoke:Str|find|http://www.cs.yale.edu/homes/hudak-paul/%7Carchiv}} |-1
{{#ifeq: {{#invoke:Str|find|{{#invoke:Str|cropleft|http://www.cs.yale.edu/homes/hudak-paul/%7C4}}%7Chttp}} |-1 {{#switch: {{#invoke:Webarchiv|getdomain|http://www.cs.yale.edu/homes/hudak-paul/ }} daserste.ndr.de | inarchive.com | webcitation.org = #default = {{#if: }}{{#if: 1 |Vorlage:Webarchiv/Wartung/URL}}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Archiv-URL im Parameter 'url' anstatt URL der Originalquelle. Entferne den vor der Original-URL stehenden Mementobestandteil und setze den Archivierungszeitstempel in den Parameter 'wayback', 'webciteID', 'archive.today' oder 'archive-is' ein, sofern nicht bereits befüllt.|1}}
            }} 
       }}
  }} an der Yale University</ref> Philip Wadler et al. |
 {{#if: {{#invoke:Wikidata|claim|P178}} | 
Entwickler: claim|P178|parameter=link|references=ja|list=, }}
 }}

}}

Aktuelle Version: {{{AktuelleVersion}}}  ({{{AktuelleVersionFreigabeDatum}}}) |

{{#if: {{#invoke:Wikidata|claim|P348}} |

Aktuelle Version {{#invoke:Wikidata|claim|P348|references=ja}}{{#if: {{#invoke:Wikidata|claim|Version|qualifier=P577}} | ({{#invoke:Wikidata|claim|Version|qualifier=P577}})}}}}

}}

Aktuelle Vorabversion:  ()

}}

Typisierung: statisch, stark, Typinferenz

}}

Wichtige Implementierungen: GHC, Hugs, NHC, JHC, Yhc

}}

Dialekte: Helium, Gofer

}}

Standardisierungen:

}}

Beeinflusst von: APL, LISP, Miranda, ML, C++ |
 {{#if: {{#invoke:Wikidata|claim|P737}} | 
Beeinflusst von: claim|P737|parameter=link|references=ja|list=, }}
 }}

}}

Beeinflusste: Agda, Cayenne, Clean, Curry, Idris, Python, Rust, Scala, C#, F#, Swift, JavaScript

}}

Betriebssystem:
 {{#if: {{#invoke:Wikidata|claim|P306}} | 
Betriebssystem: claim|P306|parameter=link|references=ja|list=, }}
 }}

}}

Lizenz:
 {{#if: {{#invoke:Wikidata|claim|P275}} | 
Lizenz: claim|P275|parameter=link|references=ja|list=, }}
 }}

}}

haskell.org |
 {{#if: {{#invoke:Wikidata|claim|P856}} | 
{{#invoke: WLink | formatURL | {{#invoke:Wikidata|claim|P856|parameter=link}}}}
 }}

}}

Haskell ist eine rein funktionale Programmiersprache<ref>{{#if:|{{#iferror: {{#iferror:{{#invoke:Vorlage:FormatDate|Execute}}|}}| |}}}}{{#if:|{{{autor}}}: }}{{#if:|{{#if:The Haskell 98 Report: Introduction|[{{#invoke:Vorlage:Internetquelle|archivURL|1={{#invoke:URLutil|getNormalized|1={{{archiv-url}}}}}}} {{#invoke:Vorlage:Internetquelle|TitelFormat|titel=The Haskell 98 Report: Introduction}}]{{#if:| ({{{format}}})}}{{#if:| {{{titelerg}}}{{#invoke:Vorlage:Internetquelle|Endpunkt|titel={{{titelerg}}}}}}}}}|{{#if:https://www.haskell.org/onlinereport/intro.html%7C{{#if:{{#invoke:TemplUtl%7Cfaculty%7C}}%7C{{#invoke:Vorlage:Internetquelle%7CTitelFormat%7Ctitel={{#invoke:WLink%7CgetEscapedTitle%7C1=The Haskell 98 Report: Introduction}}}}|[{{#invoke:URLutil|getNormalized|1=https://www.haskell.org/onlinereport/intro.html}} {{#invoke:Vorlage:Internetquelle|TitelFormat|titel={{#invoke:WLink|getEscapedTitle|1=The Haskell 98 Report: Introduction}}}}]}}{{#if:| ({{{format}}}{{#if:{{#if: 2021-03-31 | {{#if:{{#invoke:TemplUtl|faculty|}}||1}}}}

          | )
          | {{#if:{{#ifeq:de|de||{{#if:|1}}}}| ; 
              | )}}}}}}{{#if:| {{{titelerg}}}{{#invoke:Vorlage:Internetquelle|Endpunkt|titel={{{titelerg}}}}}}}}}}}{{#if:https://www.haskell.org/onlinereport/intro.html%7C{{#if:{{#invoke:URLutil%7CisResourceURL%7C1=https://www.haskell.org/onlinereport/intro.html}}%7C%7C}}}}{{#if:The Haskell 98 Report: Introduction|{{#if:{{#invoke:WLink|isValidLinktext|1=The Haskell 98 Report: Introduction|lines=0}}||}}}}{{#if: | In: {{#invoke:Vorlage:Internetquelle|TitelFormat|titel={{{werk}}}}}}}{{#if: | {{{hrsg}}}{{#if: |,|{{#if: 2021-03-31 | {{#if:{{#invoke:TemplUtl|faculty|}}|;|,}}}}}}}}{{#if: | {{#if:{{#invoke:DateTime|format|{{{datum}}}|noerror=1}}
            |{{#invoke:DateTime|format|{{{datum}}}|T._Monat JJJJ}}
            |{{#invoke:TemplUtl|failure|1=Fehler bei Vorlage:Internetquelle, datum={{{datum}}}|class=Zitationswartung}} }}{{#if: |,|{{#if: 2021-03-31 | {{#if:{{#invoke:TemplUtl|faculty|}}|;|,}}}}}}}}{{#if: | S. {{{seiten}}}{{#if: |,|{{#if: 2021-03-31 | {{#if:{{#invoke:TemplUtl|faculty|}}|;|,}}}}}}}}{{#if: {{#invoke:TemplUtl|faculty|}}| {{#if:|{{#if:|archiviert|ehemals}}|{{#if:|Archiviert|Ehemals}}}} {{#if:|vom|im}} Vorlage:Referrer{{#if:{{#invoke:TemplUtl|faculty|}}| (nicht mehr online verfügbar)}}{{#if: | am {{#iferror: {{#iferror:{{#invoke:Vorlage:FormatDate|Execute}}|}}|{{{archiv-datum}}}{{#if:22284||(?)}}}}}}{{#if: 2021-03-31|;}}}}{{#if: 2021-03-31| {{#if:{{#invoke:TemplUtl|faculty|}}|abgerufen|Abgerufen}} {{#switch: {{#invoke:Str|len| {{#invoke:DateTime|format| 2021-03-31 |ISO|noerror=1}} }}
       |4=im Jahr
       |7=im
       |10=am
       |#default={{#invoke:TemplUtl|failure|1=Fehler bei Vorlage:Internetquelle, abruf=2021-03-31|class=Zitationswartung}} }} {{#invoke:DateTime|format|2021-03-31|T._Monat JJJJ}}
    | {{#invoke:TemplUtl|failure|1=Vorlage:Internetquelle | abruf=2026-MM-TT ist Pflichtparameter}} }}{{#if:{{#ifeq:de|de||{{#if:|1}}}}|{{#if:{{#if: 2021-03-31 | {{#if:{{#invoke:TemplUtl|faculty|}}||1}}}}
       |  (
       | {{#if: | |  (}}
       }}{{#ifeq:{{#if:de|de|de}}|de||
          {{#invoke:Multilingual|format|{{{sprache}}}|slang=!|split=[%s,]+|shift=m|separator=, }}}}{{#if: |{{#ifeq:{{#if:de|de|de}}|de||, }}{{{kommentar}}}}})}}{{#if: {{#if: 2021-03-31 | {{#if:{{#invoke:TemplUtl|faculty|}}||1}} }}|{{#if: |: {{
 #if: 
 | {{
     #ifeq: {{#if:{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|de}} | de
     | Vorlage:Str trim
     | {{#invoke:Vorlage:lang|flat}}
     }}
 | {{#ifeq: {{#if:{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|de}} | de
     | „Vorlage:Str trim“
     | {{#invoke:Text|quote
         |1={{#if: 
              | {{#invoke:Vorlage:lang|flat}}
              | {{#invoke:Vorlage:lang|flat}} }}
         |2={{#if: {{#invoke:TemplUtl|faculty|}}|de-CH|de}}
         |3=1}} }}

}}{{#if:

   |  (<templatestyles src="Person/styles.css" />{{#if:  | :  }}{{#if:  | , deutsch: „“ }})
   | {{#if: 
       |  ({{#if:  | , deutsch: „“ }})
       | {{#if:  |  (deutsch: „“) }}
 }}

}}{{#if: {{{zitat}}}

   | {{#if: 
       | {{#if: {{{zitat}}}
           | Vorlage:": Text= und 1= gleichzeitig, bzw. Pipe zu viel }} }}
   | Vorlage:": Text= fehlt }}{{#if:  | {{#if: {{#invoke:Text|unstrip|{{{ref}}}}}
             | Vorlage:": Ungültiger Wert: ref=
             | {{{ref}}} }}

}}|.{{#if:{{#invoke:TemplUtl|faculty|}}|{{#if:||{{#ifeq: | JaKeinHinweis |{{#switch:

   |0|=Vorlage:Toter Link/Core{{#if: https://www.haskell.org/onlinereport/intro.html
       | {{#if:  | [1] }} (Seite {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar{{#if:  | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. Suche im Internet Archive ){{#if: 
           | {{#if: deadurlausgeblendet | | Vorlage:Toter Link/archivebot }}
         }}
       |   (Seite {{#switch:|no|0|=|#default=dauerhaft }}nicht mehr abrufbar{{#if:  | , festgestellt im {{#invoke:DateTime|format||F Y}} }}.)
     }}{{#switch: 
         |no|0|=
         |#default={{#if:  ||  }}
    }}{{#invoke:TemplatePar|check
         |opt      = inline= url= text= datum= date= archivebot= bot= botlauf= fix-attempted= checked=
         |cat      = Wikipedia:Vorlagenfehler/Vorlage:Toter Link
         |errNS    = 0
         |template = Vorlage:Toter Link
         |format   = 
         |preview  = 1
    }}{{#if: https://www.haskell.org/onlinereport/intro.html
      | {{#if:{{#invoke:URLutil|isWebURL|https://www.haskell.org/onlinereport/intro.html}}
          || {{#if:  ||  }} 
        }}
      | {{#if: 
           | {{#if:  ||  }}
           | {{#if:  ||  }}
        }}
    }}{{#if: 
       | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}}
             || {{#if:  ||  }} 
         }}
    }}{{#switch: deadurl
         |checked|deadurl|= 
         |#default=  {{#if:  ||  }}
    }}|#default= https://wiki-de.moshellshocker.dns64.de/index.php?title=Wikipedia:Defekte_Weblinks&dwl=https://www.haskell.org/onlinereport/intro.html Die nachstehende Seite ist {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar]{{#if:  | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. (Suche im Internet Archive. )  {{#if: 
            | {{#if: deadurlausgeblendet | | Vorlage:Toter Link/archivebot }}
         }}Vorlage:Toter Link/Core{{#switch: 
          |no|0|=
          |#default= {{#if:  ||  }}
        }}{{#invoke:TemplatePar|check
         |all      = inline= url=
         |opt      = datum= date= archivebot= bot= botlauf= fix-attempted= checked=
         |cat      = Wikipedia:Vorlagenfehler/Vorlage:Toter Link
         |errNS    = 0
         |template = Vorlage:Toter Link
         |format   = 
         |preview  = 1
       }}{{#if: https://www.haskell.org/onlinereport/intro.html
       | {{#if:{{#invoke:URLutil|isWebURL|https://www.haskell.org/onlinereport/intro.html}}
          || {{#if:  ||  }} 
        }}
    }}{{#if: 
         | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}}
             || {{#if:  ||  }} 
           }}
    }}{{#switch: deadurl
         |checked|deadurl|= 
         |#default=  {{#if:  ||  }}
    }}[https://www.haskell.org/onlinereport/intro.html }}|{{#switch: 
   |0|=Vorlage:Toter Link/Core{{#if: https://www.haskell.org/onlinereport/intro.html
       | {{#if:  | [2] }} (Seite {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar{{#if:  | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. Suche im Internet Archive ){{#if: 
           | {{#if:  | | Vorlage:Toter Link/archivebot }}
         }}
       |   (Seite {{#switch:|no|0|=|#default=dauerhaft }}nicht mehr abrufbar{{#if:  | , festgestellt im {{#invoke:DateTime|format||F Y}} }}.)
     }}{{#switch: 
         |no|0|=
         |#default={{#if:  ||  }}
    }}{{#invoke:TemplatePar|check
         |opt      = inline= url= text= datum= date= archivebot= bot= botlauf= fix-attempted= checked=
         |cat      = Wikipedia:Vorlagenfehler/Vorlage:Toter Link
         |errNS    = 0
         |template = Vorlage:Toter Link
         |format   = 
         |preview  = 1
    }}{{#if: https://www.haskell.org/onlinereport/intro.html
      | {{#if:{{#invoke:URLutil|isWebURL|https://www.haskell.org/onlinereport/intro.html}}
          || {{#if:  ||  }} 
        }}
      | {{#if: 
           | {{#if:  ||  }}
           | {{#if:  ||  }}
        }}
    }}{{#if: 
       | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}}
             || {{#if:  ||  }} 
         }}
    }}{{#switch: 
         |checked|deadurl|= 
         |#default=  {{#if:  ||  }}
    }}|#default= https://wiki-de.moshellshocker.dns64.de/index.php?title=Wikipedia:Defekte_Weblinks&dwl=https://www.haskell.org/onlinereport/intro.html Die nachstehende Seite ist {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar]{{#if:  | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. (Suche im Internet Archive. )  {{#if: 
            | {{#if:  | | Vorlage:Toter Link/archivebot }}
         }}Vorlage:Toter Link/Core{{#switch: 
          |no|0|=
          |#default= {{#if:  ||  }}
        }}{{#invoke:TemplatePar|check
         |all      = inline= url=
         |opt      = datum= date= archivebot= bot= botlauf= fix-attempted= checked=
         |cat      = Wikipedia:Vorlagenfehler/Vorlage:Toter Link
         |errNS    = 0
         |template = Vorlage:Toter Link
         |format   = 
         |preview  = 1
       }}{{#if: https://www.haskell.org/onlinereport/intro.html
       | {{#if:{{#invoke:URLutil|isWebURL|https://www.haskell.org/onlinereport/intro.html}}
          || {{#if:  ||  }} 
        }}
    }}{{#if: 
         | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}}
             || {{#if:  ||  }} 
           }}
    }}{{#switch: 
         |checked|deadurl|= 
         |#default=  {{#if:  ||  }}
    }}[https://www.haskell.org/onlinereport/intro.html }} }}}}}}}}}}{{#if:|
        {{#invoke:Vorlage:Internetquelle|archivBot|stamp={{{archiv-bot}}}|text={{#if:|Vorlage:Webarchiv/archiv-bot}}

}}}}{{#invoke:TemplatePar|check |all= url= titel= |opt= autor= hrsg= format= sprache= titelerg= werk= seiten= datum= abruf= zugriff= abruf-verborgen= archiv-url= archiv-datum= archiv-bot= kommentar= zitat= AT= CH= offline= |cat= {{#ifeq: 0 | 0 | Wikipedia:Vorlagenfehler/Vorlage:Internetquelle}} |template= Vorlage:Internetquelle |format=0 |preview=1 }}</ref>, benannt nach dem US-amerikanischen Mathematiker Haskell Brooks Curry, dessen Arbeiten zur mathematischen Logik eine Grundlage funktionaler Programmiersprachen bilden. Haskell basiert auf dem Lambda-Kalkül, weshalb auch der griechische Buchstabe Lambda als Logo verwendet wird. Die wichtigste Implementierung ist der Glasgow Haskell Compiler (GHC).

Entwicklung

Vorlage:Hinweisbaustein Gegen Ende der 1980er Jahre gab es bereits einige funktionale Programmiersprachen.<ref>{{#invoke:Vorlage:Literatur|f}}</ref> Um der Wissenschaft eine einheitliche Forschungs- und Entwicklungsbasis bereitzustellen, sollte eine standardisierte und moderne Sprache die funktionale Programmierung vereinheitlichen. Zunächst wollte man dazu Miranda als Ausgangspunkt benutzen, doch deren Entwickler waren nicht daran interessiert. So wurde 1990 Haskell 1.0 veröffentlicht.<ref>{{#invoke:Vorlage:Literatur|f}}</ref>

Die Sprachderivate von Haskell sind zahlreich; dazu zählen Parallel Haskell, Distributed Haskell (ehemals Goffin), Eager Haskell, Eden mit einem neuen Ansatz zum parallelen Programmieren und Bedarfsauswertung, DNA-Haskell und sogar objektorientierte Varianten (Haskell++, O’Haskell, Mondrian). Des Weiteren diente Haskell beim Entwurf neuer Programmiersprachen als Vorlage. So wurde beispielsweise im Falle von Python die Lambda-Notation sowie Listenverarbeitungssyntax übernommen.

Eigenschaften

Programmfluss

Haskell ist eine rein funktionale Programmiersprache. Funktionen geben nur Werte zurück, ändern aber nicht den Zustand eines Programms (d. h. Funktionen haben keine Nebeneffekte). Das Ergebnis einer Funktion hängt deshalb nur von den Eingangsparametern ab, und nicht vom Kontext, in dem die Funktion aufgerufen wird (z. B. Zeitpunkt des Aufrufs). Daraus folgt, dass bei wiederholtem Aufrufen einer Funktion mit denselben Parametern auch jedes Mal dasselbe Ergebnis folgt. Dies können Haskell-Implementationen nutzen, um Funktionen zu cachen.

Es gibt keine nativen imperativen Sprachkonstrukte. Durch die IO-Monade ist es möglich, Ein- und Ausgabeoperationen und zustandsabhängige Berechnungen, wie Zufallszahlengeneratoren, rein funktional zu behandeln. Haskell stellt jedoch die sogenannte do-Notation bereit, welche es erlaubt, die Verkettung von Monaden in Stil von imperativen Sprachen darzustellen<syntaxhighlight lang="haskell"> -- Die Definition einer IO aktion, welche einen Namen von der Konsole einliest -- und dann den String "Hallo <name>! Willkommen" ausgibt aktion = getLine >>= (\eingabe -> putStr ("Hallo, " ++ eingabe)) >> putStrLn "! Willkommen"

-- Eine Identische Definition mit do-Notation aktion = do

 eingabe <- getLine
 putStr ("Hallo, " ++ eingabe)
 putStrLn "! Willkommen"

</syntaxhighlight>Es gibt keine Unterscheidung zwischen Variablen und Konstanten, da der Wert einer Variable in Haskell nicht verändert werden kann. Man spricht von unveränderlichen oder nicht veränderbaren Variablen. Dies ist auch der Grund, weshalb es keine Unterscheidung von Identität und Gleichwertigkeit von Variablen gibt. Durch diese Eigenschaften ist Haskell der Mathematik sehr nahe und es ist möglich, die Richtigkeit gewisser Programme zu beweisen, beispielsweise durch Vollständige Induktion.

Haskell ist nicht-strikt. Es werden nur Ausdrücke ausgewertet, die für die Berechnung des Ergebnisses gebraucht werden. <syntaxhighlight lang="haskell">

       first x y = x
       quadrat x = x * x

</syntaxhighlight>

Die Funktion first liefert bei Eingabe zweier Parameter den ersten als Ergebnis zurück. Bei der Eingabe von first x (3+7) ist die Auswertung der Summe (3+7) zur Ergebnisbestimmung nicht notwendig, sollte also unberücksichtigt bleiben.
Die Funktion quadrat berechnet bei Eingabe eines Parameters dessen Quadrat. Bei Eingabe von quadrat(3+5), was im Laufe des Auswertungsprozesses zu (3+5)*(3+5) wird, wäre eine doppelte Berechnung der Summe (3+5) ineffizient, sollte also vermieden werden.
Die Auswertungsstrategie, welche die beiden eben geschilderten Probleme umgeht, wird Bedarfsauswertung ({{#invoke:Vorlage:lang|full|CODE=en|SCRIPTING=Latn|SERVICE=englisch}}) genannt und kommt in Haskell meist zum Einsatz.
Die Bedarfsauswertung ist vor allem wegen der strengen Einhaltung des funktionalen Konzepts möglich. Umgekehrt macht die Bedarfsauswertung die funktionale Programmierung angenehmer, denn sie erlaubt es besser, Funktionen, die reine Berechnungen durchführen, von Ein-/Ausgabefunktionen zu trennen.
Die Bedarfsauswertung erlaubt das Arbeiten mit undefinierten Werten und potentiell unendlich großen Datenmengen. So kann man elegant mit Potenzreihen, Zeitreihen (etwa Audiosignalströmen), Kettenbruchzerlegungen, Entscheidungsbäumen und ähnlichem umgehen. Aber auch bei endlichen, aber großen, oder endlichen und noch nicht vollständig bekannten Daten erlaubt diese Art der Ausführung elegante Programme. So kann man etwa eine Transformation eines XML-Dokumentes als Folge von Transformationen des gesamten XML-Baumes beschreiben. Ausgeführt wird die Gesamttransformation aber von Beginn zum Ende des XML-Dokumentes, auch wenn das Ende noch gar nicht verfügbar ist.
Man beachte allerdings, dass Haskell nach Sprachdefinition lediglich nicht-strikt ist; die Bedarfsauswertung ist nur eine mögliche Implementierung der Nicht-Striktheit - die allerdings von allen gängigen Haskell-Übersetzern angewandt wird. Andere Implementierungen sind möglich (z. B. optimistic evaluation, Ennals & Peyton Jones, ICFP’03).

Typsystem

  • Haskell erlaubt Typvariablen. Damit können Funktionen sehr allgemein formuliert werden. Wird eine allgemeingehaltene Funktion für bestimmte Typen verwendet, werden automatisch die Typen abgeglichen (Typinferenz).
Die Funktion map wendet eine beliebige Funktion auf die Elemente einer Liste an. Ihr Typ wird so angegeben:

<syntaxhighlight lang="haskell">

       map :: (a -> b) -> [a] -> [b]

</syntaxhighlight>

Wird map etwa mit der speziellen Funktion toUpper vom Typ Char -> Char aufgerufen, ergibt der Typabgleich

<syntaxhighlight lang="haskell">

       map toUpper :: [Char] -> [Char]

</syntaxhighlight>

  • Haskell ist von der Grundidee her statisch typisiert, obwohl es auch Erweiterungen für dynamische Typen gibt. Das bedeutet, dass für die meisten Berechnungen die Typen bereits zum Zeitpunkt der Programmübersetzung feststehen. Dies deckt viele „offensichtliche“ Fehler noch vor Ausführung des Programms auf.
  • Haskell unterstützt Funktionen höherer Ordnung (Funktionale).<ref>{{#invoke:Vorlage:Literatur|f}}</ref> Das sind Funktionen, die Funktionen als Eingabeparameter bzw. Funktionen als Ergebnis haben. Ein Beispiel ist die map-Funktion, die eine Funktion f auf jedes Element eines Datentyps (hier Liste) anwendet.

<syntaxhighlight lang="haskell">

       map :: (a -> b) -> [a] -> [b]
       map f [] = []
       map f (x:xs) = f x : map f xs
       map quadrat [1,2,3] = [quadrat 1, quadrat 2, quadrat 3] = [1,4,9]

</syntaxhighlight>

  • Funktionen erlauben Currying. Während man in anderen Sprachen Tupel als Argumente an Funktionen übergibt, also Funktionstypen der Form <syntaxhighlight lang="haskell" inline style="white-space:nowrap">(a, b) -> c</syntaxhighlight> verwendet, ist in Haskell die Curry-Form <syntaxhighlight lang="haskell" inline style="white-space:nowrap">a -> b -> c</syntaxhighlight> üblicher. Damit wird die partielle Auswertung von Funktionen bequem möglich. Der Ausdruck map toUpper ist beispielsweise eine teilweise Auswertung von map, denn er beschreibt eine Funktion, nämlich die Funktion, welche alle Kleinbuchstaben einer Liste in Großbuchstaben verwandelt.
  • Haskell erlaubt benutzerdefinierte Datentypen. Diese algebraischen Datentypen werden mit Hilfe von Datenkonstruktoren definiert.

<syntaxhighlight lang="haskell">

       data Tree = Leaf Int | Branch Int Tree Tree

</syntaxhighlight>

Das Beispiel zeigt die Datenstruktur eines mit ganzen Zahlen beschrifteten binären Baumes. Solch ein Baum Tree besteht entweder aus einem Blatt (Leaf Int) oder einer Verzweigung (<syntaxhighlight lang="haskell" inline>Branch Int t1 t2</syntaxhighlight>), wobei t1 und t2 die Teilbäume darstellen, die wiederum die Struktur Tree haben. Zur Definition dieser Datenstruktur wurde sowohl der einstellige Konstruktor Leaf als auch der dreistellige Konstruktor Branch verwendet.
Datentypen mit mehreren ausschließlich parameterlosen Konstruktoren können als Aufzählungen eingesetzt werden.

<syntaxhighlight lang="haskell">

       data Tag = Montag | Dienstag | Mittwoch | Donnerstag | Freitag | Samstag | Sonntag
            deriving (Show, Eq, Ord, Ix, Enum)

</syntaxhighlight>

  • Haskell unterstützt Typenklassen. Mit Typenklassen lassen sich Typen zusammenfassen, welche eine bestimmte Menge an Operationen unterstützen. In Signaturen von Funktionen dürfen als Abstufung zwischen festen Typen wie Char und freien Typvariablen auch noch Typvariablen mit Einschränkung auf bestimmte Klassen verwendet werden.
Alle Ausprägungen einer Methode der Typklasse tragen den gleichen Namen. In gewisser Weise entsprechen Typklassen also dem Überladen von Funktionen. Der gleiche Funktionsname steht also abhängig vom Typ für verschiedene Funktionen. Zum Beispiel ist mit der ==-Methode der Klasse Eq der Vergleich sowohl zweier Zahlen als auch zweier Texte möglich. Trotzdem arbeitet der Gleichheitstest je nach Argumenttyp anders.

<syntaxhighlight lang="haskell">

       putStrLn :: String -> IO ()
       getLine  :: IO String

</syntaxhighlight>

putStrLn gibt einen Text und einen Zeilenumbruch auf der Standardausgabe aus. Da es kein informationstragendes Ergebnis gibt, wird der Einheitstyp <syntaxhighlight lang="haskell" inline>()</syntaxhighlight> als Rückgabetyp verwendet. getLine liest eine Textzeile von der Standardeingabe. Der <syntaxhighlight lang="haskell" inline>IO</syntaxhighlight>-Typkonstruktor stellt sicher, dass man den Nutzern der Funktion offenlegen muss, dass die Ergebnisse durch Ein-/Ausgabe gewonnen wurden. Diese strenge Handhabung ermuntert Haskell-Programmierer zur klaren Trennung von Ein- und Ausgabe und anderen Teilen eines Programms. Der größte Teil eines Haskell-Programms besteht in der Regel aus Funktionen ohne Ein- und Ausgabe. Man kann <syntaxhighlight lang="haskell" inline>IO</syntaxhighlight>-Typen natürlich auch in andere Typen einbetten und so zum Beispiel einen speziellen IO-Typ definieren, der nur Eingaben erlaubt.

Syntax

Haskell unterscheidet Groß- und Kleinschreibung.<ref>{{#invoke:Vorlage:Literatur|f}}</ref> Bezeichner, die mit einem Großbuchstaben beginnen, stehen für Typ- und Wertkonstruktoren. Bezeichner, die mit einem Kleinbuchstaben beginnen, stehen für Typvariablen, Funktionen und Parameter.

Der Umgang mit Leerzeichen und Zeilenumbrüchen geschieht in Anlehnung an das intuitive Verständnis von mathematischer Notation, bei Zeilenumbrüchen muss lediglich eine Einrückung beliebiger Tiefe geschehen, damit der Zusammenhang nicht verlorengeht. So ist der Ausdruck <syntaxhighlight lang="haskell">

  fun a b = a*b

</syntaxhighlight> völlig gleichwertig zu <syntaxhighlight lang="haskell">

  fun a  b= a  *
      b

</syntaxhighlight>

Haskell unterstützt einzeilige und mehrzeilige Kommentare, erstere ab den Zeichen -- bis zum Ende der Zeile und letztere im Einschluss von {- und -}. <syntaxhighlight lang="haskell">

   f x = x**2
   -- f y = y*5 diese Zeile ist auskommentiert
   {- Alles, was
      hier drin steht, wird auch nicht beachtet.
      f z = z*2
   -}

</syntaxhighlight>

Haskell bietet eine Reihe von syntaktischen Besonderheiten. Diese sollen nicht darüber hinwegtäuschen, dass alles rein funktional erklärt ist.

  • Die do-Notation verleiht Berechnungen mit Monaden das Aussehen von imperativen Programmen.
    Statt

<syntaxhighlight lang="haskell">

       readFile "eingabe.txt" >>= writeFile "ausgabe.txt"

</syntaxhighlight>

oder

<syntaxhighlight lang="haskell">

       readFile "eingabe.txt" >>= (\inhalt -> writeFile "ausgabe.txt" inhalt)

</syntaxhighlight>

kann man auch

<syntaxhighlight lang="haskell">

       do inhalt <- readFile "eingabe.txt"
          writeFile "ausgabe.txt" inhalt

</syntaxhighlight>

schreiben.
  • Sowohl symbolische Bezeichner (bestehend etwa aus +, -, *, /, >, <) als auch alphanumerische Bezeichner (Buchstaben, Ziffern und Apostroph) können für Funktionsnamen verwendet werden und sowohl als Infix-Operatoren als auch in Präfixschreibweise eingesetzt werden. Es gilt beispielsweise

<syntaxhighlight lang="haskell">

       a + b      =  (+) a b
       a `div` b  =  div a b

</syntaxhighlight>

  • Haskell erlaubt spezielle Notationen bei der Listenverarbeitung. So können unter anderem Zahlenfolgen mit zwei Punkten (<syntaxhighlight lang="haskell" inline>..</syntaxhighlight>) angedeutet werden:

<syntaxhighlight lang="haskell">

       [0..5] = [0,1,2,3,4,5]
       ['a'..'e'] = ['a','b','c','d','e'] = "abcde"
       [0,2..10] = [0,2,4,6,8,10]

</syntaxhighlight>

Wird kein Endwert angegeben, dann wird eine unendliche Liste erzeugt

<syntaxhighlight lang="haskell">

       [1..] = [1,2,3 usw.]
       [10,20..] = [10,20,30 usw.]

</syntaxhighlight>

Des Weiteren ist eine Notation erlaubt, genannt „list comprehension“, die an die mathematische Schreibweise für Mengendefinitionen angelehnt ist. In folgendem Beispiel wird aus der Folge der positiven natürlichen Zahlen die Folge der geraden Zahlen extrahiert.

<syntaxhighlight lang="haskell">

       [ x | x <- [1..], even x]

</syntaxhighlight>

als Umschreibung für

<syntaxhighlight lang="haskell">

       do
          x <- [1..]
          guard $ even x
          return x

</syntaxhighlight>

Im Allgemeinen kann hinter dem senkrechten Strich eine beliebige nichtleere Folge aus Generatoren (pat <- xs), Prädikaten (Ausdrücken mit dem Typ Bool) und let-Bindungen angegeben werden. Insbesondere ist es möglich, überhaupt keine Generatoren zu verwenden. Der Ausdruck

<syntaxhighlight lang="haskell">

       [x | odd x]

</syntaxhighlight>

nimmt je nach Wert von x, welches als bereits definiert vorausgesetzt wird, den Wert [] oder [x] an.

Programmierung

  • Haskell erlaubt Mustervergleiche (engl. {{#invoke:Vorlage:lang|flat}}). So nennt man die Verwendung von Konstruktortermen als formale Parameter. Dabei sind die Parameterterme die Muster (engl. {{#invoke:Vorlage:lang|flat}}) der Funktionsargumente.

<syntaxhighlight lang="haskell">

       fak :: Integer -> Integer
       fak 0 = 1
       fak n = n * fak (n-1)

</syntaxhighlight>

Die Funktion fak berechnet die Fakultät einer Zahl. 0 und n sind dabei die Muster (Pattern), von denen die Ergebnisbestimmung abhängt. Für Zahlen größer als 0 greift nur das Muster n, so dass zweitere Alternative verwendet wird. Diese errechnet das Ergebnis durch <syntaxhighlight lang="haskell" inline>n * fak (n-1)</syntaxhighlight>, wobei sie sich, solange <syntaxhighlight lang="haskell" inline>(n-1) > 0</syntaxhighlight> ist, rekursiv selbst aufruft, bis sie bei 0 ankommt. Dort greift dann das Muster 0, so dass erstere Alternative verwendet wird, welches die Rekursion sauber abschließt, 1 zurückgibt und die Rücksprungkette einleitet.

Module

Zu Haskell gehört auch ein Modulsystem. Der Haskell-98-Standard definiert eine Grundmenge von Modulen,<ref>haskell.org</ref> die ein standardkonformes Haskell-System zur Verfügung stellen muss. Beispielsweise ein Modul, welches Ein- und Ausgabe-Funktionen bereitstellt oder ein Modul, welches Funktionen auf Listen implementiert.

Um Module nutzen zu können, muss man sie importieren. Dies geschieht mithilfe des <syntaxhighlight lang="haskell" inline>import</syntaxhighlight>-Befehls. <syntaxhighlight lang="haskell">

  import List
  import Maybe

</syntaxhighlight>

In verschiedenen Modulen können Funktionen und Typen die gleichen Namen besitzen. Diese Bezeichner können unterschieden werden,

  • indem nur einer der Bezeichner importiert wird,

<syntaxhighlight lang="haskell">

       import Data.List(delete)
       x = delete 'a' "abc"

</syntaxhighlight>

  • oder indem die Bezeichner qualifiziert, also durch Verbinden mit dem Modulnamen eindeutig gemacht werden.

<syntaxhighlight lang="haskell">

       import qualified Data.List
       x = Data.List.delete 'a' "abc"

</syntaxhighlight>

  • oder

<syntaxhighlight lang="haskell">

       import qualified Data.List as List
       x = List.delete 'a' "abc"

</syntaxhighlight>

Ebenfalls möglich, aber nicht empfohlen ist das Ausblenden von Bezeichnern beim Importieren mit hiding.

Beispiele

Fakultät

Eine elegante Definition der Fakultätsfunktion, die Haskells Notation für Listen benutzt: <syntaxhighlight lang="haskell">

   fac :: Integer -> Integer
   fac n = product [1..n]

</syntaxhighlight>

Oft wird aber auch rekursiv gearbeitet:

<syntaxhighlight lang="haskell">

   facr :: Integer -> Integer
   facr 0 = 1
   facr n = n * facr (n-1)

</syntaxhighlight>

Endrekursion ist dabei oftmals effizienter, aber auch aufwendiger zu schreiben:

<syntaxhighlight lang="haskell">

   facrt :: Integer -> Integer
   facrt n = _facrt n 1
       where _facrt 0 r = r
             _facrt n r = _facrt (n-1) (r*n)

</syntaxhighlight>

Diesen Schreibaufwand kann man jedoch reduzieren. In _facrt enthält der Parameter r das jeweilige (Zwischen-)Resultat. Zu Beginn der Iteration wird r auf den Startwert gesetzt. Bei jedem Iterationsschritt wird das neue Zwischenergebnis mit einer bestimmten Funktion aus dem bisherigen Zwischenresultat und n berechnet. Zum Schluss wird r als Endergebnis zurückgegeben. Dieses Prinzip kann man durch eine wiederverwendbare Funktion recur ausdrücken:

<syntaxhighlight lang="haskell">

   recur :: (Num a, Eq a) => (b -> a -> b) -> b -> a -> b
   recur f r 0 = r
   recur f r n = recur f (f r n) (n-1)

</syntaxhighlight>

Unter Verwendung von recur kann man die Fakultätsfunktion mit Endrekursion dann sehr kompakt schreiben:

<syntaxhighlight lang="haskell">

   facrg :: Integer -> Integer
   facrg = recur (*) 1

</syntaxhighlight>

Fibonacci

Eine einfache Implementierung der Fibonacci-Funktion: <syntaxhighlight lang="haskell">

   fib :: Integer -> Integer
   fib 0 = 0
   fib 1 = 1
   fib n = fib (n - 2) + fib (n - 1)

</syntaxhighlight>

Eine schnelle Implementierung der Folge: <syntaxhighlight lang="haskell">

   fibs :: [Integer]
   fibs = 0 : 1 : (zipWith (+) fibs (tail fibs))

</syntaxhighlight>

tail entfernt das erste Element aus einer Liste, zipWith kombiniert zwei Listen elementweise mithilfe einer weiteren Funktion (hier (+)). Die Definition entspricht einer Fixpunktgleichung. Dass die Definition stimmt, überprüft man am schnellsten, indem man sich vorstellt, dass fibs bereits fertig berechnet vorliegt. Als Nächstes muss man sich noch überlegen, dass die Definition auch ausgewertet werden kann. Die ersten beiden Glieder von fibs sind unmittelbar klar: 0 und 1. Für das Berechnen jedes weiteren Gliedes muss aber nur auf bereits berechnete Glieder von fibs zurückgegriffen werden. Die Bedarfsauswertung führt dazu, dass die Folge fibs tatsächlich elementweise berechnet wird.

Man könnte auch sagen, dass fibs ein Fixpunkt der Funktion   <syntaxhighlight lang="haskell" inline>\xs -> 0 : 1 : (zipWith (+) xs (tail xs))</syntaxhighlight>   ist. Das wiederum lässt sich in Haskell direkt notieren als <syntaxhighlight lang="haskell">

   fix (\xs -> 0 : 1 : (zipWith (+) xs (tail xs)))

</syntaxhighlight>

Differenzengleichung

Man kann auf diese Weise sehr elegant Differentialgleichungen bezüglich Potenzreihen oder Differenzengleichungen bezüglich Zahlenfolgen formulieren und gleichzeitig lösen.

Angenommen, man möchte die Differentialgleichung   y'(x) = f(x, y(x))   bezüglich y in Form einer Zeitreihe lösen, also einer Liste von Zahlen. Durch diese Diskretisierung wird die Differentialgleichung zur Differenzengleichung. Statt eines Integrals berechnen wir Partialsummen. Die folgende Funktion hat als Parameter die Integrationskonstante und eine Zahlenfolge. <syntaxhighlight lang="haskell">

   integrate :: Num a => a -> [a] -> [a]
   integrate = scanl (+)

</syntaxhighlight>

scanl akkumuliert die Werte einer Folge mit Hilfe einer anderen Funktion, hier (+), und gibt die Liste der Akkumulatorzustände zurück.

Damit kann man bereits das explizite Eulerverfahren für die Schrittweite 1 implementieren. x0 und y0 sind hierbei die Anfangswerte. Der Apostroph hat keine eigenständige Bedeutung, er ist Teil des Namens y'.

<syntaxhighlight lang="haskell">

   eulerExplicit :: Num a => (a -> a -> a) -> a -> a -> [a]
   eulerExplicit f x0 y0 =
      let x  = iterate (1+) x0
          y  = integrate y0 y'
          y' = zipWith f x y
      in  y

</syntaxhighlight>

Diese Funktionsdefinition besteht also im Wesentlichen aus der Feststellung, dass y das Integral von y' mit Anfangswert y0 ist, (oder umgekehrt, y' die Ableitung von y) und aus der eigentlichen Differentialgleichung   <syntaxhighlight lang="haskell" inline>y' = zipWith f x y</syntaxhighlight>. Weil man hierbei den Algorithmus eher in der Form der Aufgabenstellung als in Form eines Lösungsweges notiert, spricht man hierbei von deklarativer Programmierung.

Quicksort

Der Quicksort-Algorithmus, formuliert in Haskell: <syntaxhighlight lang="haskell">

   qsort :: Ord a => [a] -> [a]
   qsort []     = []
   qsort (x:xs) = qsort kleinergl ++ [x] ++ qsort groesser
                  where
                     kleinergl = [y | y <- xs, y <= x]
                     groesser  = [y | y <- xs, y > x]

</syntaxhighlight>

Die erste Zeile definiert die Signatur von Quicksort. Die zweite Zeile gibt an, dass die Funktion auf eine leere Liste angewendet wieder eine leere Liste ergeben soll. Die dritte Zeile sortiert rekursiv nicht-leere Listen: das erste Element x wird als mittleres Element der Ergebnisliste verwendet. Davor werden alle nicht-größeren sortiert, dahinter alle größeren Elemente eingeordnet. Listenbeschreibungen werden dazu verwendet, aus der Restliste xs alle diejenigen auszuwählen, die größer als x sind, und alle jene, die es nicht sind.

Wie man es von Quicksort erwartet, besitzt auch diese Implementierung eine mittlere asymptotische Laufzeit von O(n·logn) und eine Worst-Case-Laufzeit von O(n²). Im Gegensatz zur geläufigen Implementierung in einer imperativen Sprache arbeitet dieses qsort jedoch nicht in-place.

Algebra

Dieses Beispiel stellt die Nutzung von Typklassen heraus. <syntaxhighlight lang="haskell"> data PhiNum a = PhiNum { numPart :: a, phiPart :: a } deriving (Eq, Show)

instance Num a => Num (PhiNum a) where

   fromInteger n = PhiNum (fromInteger n) 0
   PhiNum a b + PhiNum c d = PhiNum (a+c) (b+d)
   PhiNum a b * PhiNum c d = PhiNum (a*c+b*d) (a*d+b*c+b*d)
   negate (PhiNum a b) = PhiNum (-a) (-b)
   abs = undefined
   signum = undefined

fib n = phiPart $ PhiNum 0 1 ^ n </syntaxhighlight>

fib stellt eine schnelle Berechnung von Elementen der Fibonacci-Folge dar. Ausgenutzt wird das vordefinierte ^, das auf Num-implementierenden Typen arbeitet.

Implementierungen

Es gibt inzwischen eine Reihe Haskell-Implementierungen, von denen die meisten aber den Sprachstandard nicht vollständig umsetzen.

  • Der Glasgow Haskell Compiler<ref>The Glasgow Haskell Compiler. Projekt-Website. Abgerufen am 9. Januar 2010.</ref> (GHC) unterstützt Haskell 98 sowie zahlreiche Spracherweiterungen. Er übersetzt Haskell-Programme in Maschinencode; für nicht direkt unterstützte Plattformen erzeugt er C-Code, der dann mit einem C-Compiler übersetzt wird.
  • Hugs<ref>Hugs 98. Projekt-Website. Abgerufen am 9. Januar 2010.</ref> ist ein Bytecode-Compiler, der Haskell 98 fast vollständig sowie einige Erweiterungen implementiert. Hugs ist selbst in C geschrieben.
  • nhc<ref>nhc98. Projekt-Website. Abgerufen am 9. Januar 2010.</ref><ref>Niklas Rojemo: nhc – Nearly a Haskell Compiler. (PDF) Chalmers Tech Report, 1994.</ref> (auch nhc98) ist ein weiterer Bytecode-Compiler, der Haskell 98 mit gewissen Einschränkungen unterstützt. Der York Haskell Compiler oder Yhc ist eine Weiterentwicklung von nhc mit dem Ziel, Portabilität und Performance der kompilierten Programme zu verbessern.
  • Der Utrecht Haskell Compiler<ref>Atze Dijkstra, Jeroen Fokker, S. Doaitse Swierstra: The architecture of the Utrecht Haskell compiler. In: Haskell ’09: Proceedings of the 2nd ACM SIGPLAN symposium on Haskell. ACM, New York NY 2009, S. 93–104, doi:10.1145/1596638.1596650.</ref> (UHC) ist eine experimentelle Implementierung, die an der Universität Utrecht entwickelt wird. Der Compiler basiert auf Attributgrammatiken und übersetzt Haskell in C-Code. Er implementiert Haskell 98 fast vollständig sowie einige Erweiterungen.
  • Helium<ref>Bastiaan Heeren, Daan Leijen, Arjan van IJzendoorn: Helium, for learning Haskell. In: Haskell ’03: Proceedings of the 2003 ACM SIGPLAN workshop on Haskell. ACM, New York NY 2003, S. 62–71, doi:10.1145/871895.871902.</ref> wird ebenfalls an der Universität Utrecht entwickelt. Der Schwerpunkt des Projekts liegt darauf, leicht verständliche Fehlermeldungen zu erzeugen, um Anfängern das Erlernen von Haskell zu erleichtern. Daher wird auch ein eingeschränkter Haskell-Dialekt implementiert, der unter anderem keine Typklassen hat.

Die hier genannten Implementierungen sind alle Open-Source-Software. Bis auf Hugs sind sie auch alle in Haskell selbst implementiert.

Einfluss

Haskell dient wegen seiner stark akademischen Herkunft vielen Programmier- und Scriptsprachen als Vorbild für neue Sprachfunktionalität. So haben u. a. Perl, Python, JavaScript, Java, Scala, Rust und PHP Ideen der funktionalen Programmierung von Haskell übernommen. Dazu gehören Funktionen höherer Ordnung wie map, filter usw., Teile der Art, wie generische Programmierung implementiert wurde, und anderes.

Siehe auch

Literatur

  • {{#ifexist:Vorlage:bibISBN/{{#invoke:URIutil|plainISBN|0134843460}}

| {{bibISBN/{{#invoke:URIutil|plainISBN|0134843460}}

  |record = Vorlage:bibISBN/{{#invoke:URIutil|plainISBN|0134843460}}
  |format = Literatur
  |Autor = 
  |Titel = 
  |TitelErg = 
  |Band = 
  |Auflage = 
  |Kommentar= 
  |Kapitel = 
  |Seite = 
  |Seiten = 
  |Spalten = 
  |ArtikelNr = 
  |Fundstelle = 
  |DOI = 
  |Online = 
  |URL = 
  |Linktext = 
  |Format = 
  |KBytes = 
  |Abruf = 
  |Typ = 

}}{{#ifeq: 0 | 0

   | {{#invoke:TemplatePar|check
       |all= 1=
       |opt= 2= format= Autor= Titel= TitelErg= Hrsg= Sammelwerk= WerkErg= Band= Nummer= Auflage= Datum= Sprache= NummerReihe= BandReihe= HrsgReihe= Kommentar= Kapitel= Seite= Seiten= Spalten= ArtikelNr= Fundstelle= DOI= Online= URL= Linktext= Format= KBytes= Abruf= Typ=

|template=Vorlage:bibISBN |cat=Wikipedia:Vorlagenfehler/Vorlage:BibISBN}}

     }}

| {{#if:||{{#if:{{#invoke:URIutil|plainISBN|0134843460}}|Der BibISBN-Eintrag [[Vorlage:BibISBN/{{#invoke:URIutil|plainISBN|0134843460}}]] ist nicht vorhanden. Bitte prüfe die ISBN und lege ggf. einen {{#ifeq:Vorlage:bibISBN/{{#invoke:URIutil|plainISBN|0134843460}}|Haskell (Programmiersprache)|{{#switch:{{{LINK}}}|JA=|NEIN=}}}}[[[:Vorlage:Neuer Abschnitt/URL]] neuen Eintrag] an.|Die angegebene ISBN „0134843460“ ist fehlerhaft. Bitte prüfe und korrigiere die ISBN.}}{{#ifeq: 0 | 0 | }}}}}}

  • {{#invoke:Vorlage:Literatur|f}}
  • {{#invoke:Vorlage:Literatur|f}}
  • {{#invoke:Vorlage:Literatur|f}}
  • {{#invoke:Vorlage:Literatur|f}}
  • {{#invoke:Vorlage:Literatur|f}}
  • {{#invoke:Vorlage:Literatur|f}}
  • {{#ifexist:Vorlage:bibISBN/{{#invoke:URIutil|plainISBN|0521826144}}

| {{bibISBN/{{#invoke:URIutil|plainISBN|0521826144}}

  |record = Vorlage:bibISBN/{{#invoke:URIutil|plainISBN|0521826144}}
  |format = Literatur
  |Autor = 
  |Titel = 
  |TitelErg = 
  |Band = 
  |Auflage = 
  |Kommentar= 
  |Kapitel = 
  |Seite = 
  |Seiten = 
  |Spalten = 
  |ArtikelNr = 
  |Fundstelle = 
  |DOI = 
  |Online = 
  |URL = 
  |Linktext = 
  |Format = 
  |KBytes = 
  |Abruf = 
  |Typ = 

}}{{#ifeq: 0 | 0

   | {{#invoke:TemplatePar|check
       |all= 1=
       |opt= 2= format= Autor= Titel= TitelErg= Hrsg= Sammelwerk= WerkErg= Band= Nummer= Auflage= Datum= Sprache= NummerReihe= BandReihe= HrsgReihe= Kommentar= Kapitel= Seite= Seiten= Spalten= ArtikelNr= Fundstelle= DOI= Online= URL= Linktext= Format= KBytes= Abruf= Typ=

|template=Vorlage:bibISBN |cat=Wikipedia:Vorlagenfehler/Vorlage:BibISBN}}

     }}

| {{#if:||{{#if:{{#invoke:URIutil|plainISBN|0521826144}}|Der BibISBN-Eintrag [[Vorlage:BibISBN/{{#invoke:URIutil|plainISBN|0521826144}}]] ist nicht vorhanden. Bitte prüfe die ISBN und lege ggf. einen {{#ifeq:Vorlage:bibISBN/{{#invoke:URIutil|plainISBN|0521826144}}|Haskell (Programmiersprache)|{{#switch:{{{LINK}}}|JA=|NEIN=}}}}[[[:Vorlage:Neuer Abschnitt/URL]] neuen Eintrag] an.|Die angegebene ISBN „0521826144“ ist fehlerhaft. Bitte prüfe und korrigiere die ISBN.}}{{#ifeq: 0 | 0 | }}}}}}

  • {{#invoke:Vorlage:Literatur|f}}

Weblinks

[{{canonicalurl:Commons:Category:{{#if:Haskell|Haskell|Haskell (Programmiersprache)}}|uselang=de}} Commons: {{#if:|{{{2}}}|{{#if:Haskell|Haskell|{{#invoke:WLink|getArticleBase}}}}}}]{{#switch:1

|X|x= |0|-= |S|s= – Sammlung von Bildern |1|= – Sammlung von Bildern{{#if:

    | {{#switch: {{#invoke:TemplUtl|faculty|1}}/{{#invoke:TemplUtl|faculty|1}}
        |1/=  und Videos
        |1/1=, Videos und Audiodateien
        |/1=  und Audiodateien}}
    | , Videos und Audiodateien
  }}

|#default= – }}{{#if: Haskell

   | {{#ifeq: {{#invoke:Str|left|haskell|9}} 
       | category: 
| FEHLER: Ohne Category: angeben!}}}}

Vorlage:Wikidata-Registrierung

[[b:{{#if:|{{{lang}}}:}}{{#if:Funktionale Programmierung mit Haskell|Funktionale Programmierung mit Haskell|Haskell (Programmiersprache)}}|Wikibooks: {{#if:Funktionale Programmierung mit Haskell|Funktionale Programmierung mit Haskell|{{#if:Funktionale Programmierung mit Haskell|Funktionale Programmierung mit Haskell|Haskell (Programmiersprache)}}}}]]{{#switch: 1

|1|= – Lern- und Lehrmaterialien |0|-= |X|x={{#switch: 0

      |0|4|10|12|14|100=}}

|#default= – {{{suffix}}}

}}{{#if: | ({{#invoke:Multilingual|format|{{{lang}}}|slang=!|shift=m}}) }}

{{#invoke:TemplatePar|check

  |opt= 1= 2= lang= suffix=
  |template=Vorlage:Wikibooks
  |cat=Wikipedia:Vorlagenfehler/Schwesterprojekt
  }}
[[b:{{#if:en|en:}}{{#if:Haskell|Haskell|Haskell (Programmiersprache)}}|Wikibooks: {{#if:Haskell|Haskell|{{#if:Haskell|Haskell|Haskell (Programmiersprache)}}}}]]{{#switch: 1

|1|= – Lern- und Lehrmaterialien |0|-= |X|x={{#switch: 0

      |0|4|10|12|14|100=}}

|#default= – {{{suffix}}}

}}{{#if: en| ({{#invoke:Multilingual|format|en|slang=!|shift=m}}) }}

{{#invoke:TemplatePar|check

  |opt= 1= 2= lang= suffix=
  |template=Vorlage:Wikibooks
  |cat=Wikipedia:Vorlagenfehler/Schwesterprojekt
  }}

Einzelnachweise

<references />

{{#ifeq: s | p | | {{#if: 4318275-6 | |

}} }}{{#ifeq:||{{#if: | [[Kategorie:Wikipedia:GND fehlt {{#invoke:Str|left|{{{GNDCheck}}}|7}}]] }}{{#if: | {{#if: | | }} }} }}{{#if: | {{#ifeq: 0 | 2 | | }} }}{{#if: | {{#ifeq: 0 | 2 | | }} }}{{#ifeq: s | p | {{#if: 4318275-6 | | {{#if: {{#statements:P227}} | | }} }} }}{{#ifeq: s | p | {{#if: 4318275-6 | {{#if: {{#invoke:Wikidata|pageId}} | {{#if: {{#statements:P227}} | | }} }} }} }}{{#ifeq: s | p | {{#if: | | {{#if: {{#statements:P244}} | | }} }} }}{{#ifeq: s | p | {{#if: | {{#if: {{#invoke:Wikidata|pageId}} | {{#if: {{#statements:P244}} | | }} }} }} }}{{#ifeq: s | p | {{#if: | | {{#if: {{#statements:P214}} | | }} }} }}{{#ifeq: s | p | {{#if: | {{#if: {{#invoke:Wikidata|pageId}} | {{#if: {{#statements:P214}} | | }} }} }} }}Vorlage:Wikidata-Registrierung