Haskell

Fra Wikipedia, den frie encyklopedi
Gå til: navigasjon, søk
Haskell
Haskell
Paradigme Funksjonelt
Kom til 1990; 24 år siden (1990)
Operativsystem Kryssplatform
Implementert i C, Haskell
Innflytelse av Alfl, APL, Clean, FP, Gofer, Hope and Hope+, Id, ISWIM, KRC, Lisp, Miranda, ML and Standard ML, Lazy ML, Orwell, Ponder, SASL, SISAL, Scheme
Innflytelse for Agda, Bluespec, Clojure, C#, CAL, Cat, Cayenne, Clean, Curry, Epigram, Escher, F#, Factor, Isabelle, Java Generics, Kaya, LINQ, Mercury, Omega, Perl 6, Python, Qi, Scala, Timber, Visual Basic 9.0
Nettside Haskell nettside

Haskell er et standardisert, rent funksjonelt programmeringsspråk navngitt etter matematikeren Haskell Curry. Haskell byr på sterk typesetting og lat evaluering i flere implementasjoner, deriblant GHC. Som et funksjonelt språk er bruken av funksjoner den primære måten å konstruere et program med. Språket har dype røtter i Curry sin forskning og har derfor en mer matematisk tilnærming til programmering enn imperative språk. Et eksempel på dette er at alle variabler er uforanderlige.

På grunn av at Haskell er et rent funksjonelt programmeringsspråk kan ikke funksjoner ha bivirkninger. Med andre ord, en funksjon kan ikke, i tillegg til å returnere en verdi, endre på en tilstand.

Historie[rediger | rediger kilde]

Haskell ble skapt som et standardisert språk etter stor etterspørsel etter et rent funksjonelt språk som kunne samle de mange mindre funksjonelle språkene som alle delte flere likhetstrekk i syntaks og funksjonalitet. Det var spesielt funksjonalitet som lat evaluering som bidro til ønsket om et standardisert språk.[1] En komité ble satt opp etter konferansen Functional Programming Languages and Computer Architecture i september 1987 for å utvikle spesifikasjonene til språket. Dette ble kalt Haskell, etter matematikeren Haskell Curry som med sine idéer og tanker rundt kombinatorisk logikk har hatt stor påvirkning på funksjonell programmering og Haskell spesielt.[2] I forkant av navngivningen av programmeringsspråket forhørte Paul Hudak og David Wise seg med enken til Haskell, Virginia, om hennes tillatelse om å bruke ektemannens navn. På et senere tidspunkt besøkte enken et foredrag som Hudak holdt om Haskell og sa "Du vet, Haskell likte egentlig aldri navnet sitt."[1]

Den første utgaven av Haskell, kalt Haskell 1.0 ble utgitt i 1990. Haskell 2010 er den siste utgaven som ble gitt ut i 2009.

Idéen Haskell[rediger | rediger kilde]

Før det fantes noen spesifikasjon eller implementasjon av Haskell satt komitéen seg ned og la ut et sett med mål som programmeringsspråket skulle oppfylle. Spesielt de to siste målene indikerte at Haskell skulle være et konservativt språk, og var ikke laget for å revolusjonere nytt grunnlag.[1][2]

  1. Det måtte være passelig for læring, forskning og applikasjoner – inkludert store, komplekse systemer
  2. Det skulle være beskrevet fullstendig i form av formell syntaks og semantikk.
  3. Det skulle være fritt tilgjengelig. Enhver skulle kunne implementere språket, og distribuere det som de ønsker.
  4. Det skulle være mulig å bruke det som grunnlag for fremtidig forskning innenfor programmeringsspråk.
  5. Det skulle være basert på idéer som var attraktive for folk flest og samlet konsensus.
  6. Det skulle redusere unødvendig ulikheter i funksjonelle programmeringsspråk

Haskell 98[rediger | rediger kilde]

I slutten av 1997 begynte arbeidet med å forme en ny utgave av Haskell. Ved utgivelsen av spesifikasjonene til Haskell 98 siktet komitéen seg inn på å spesifisere en stabil, minimal og høyst portabel versjon av språket. Spesifikasjonen inkluderte et standardbibliotek for læring, og la en basis for videre utvidelser av språket. Sistnevnte er noe blant annet kompilatoren og hovedimplementasjonen av Haskell, Glasgow Haskell Compiler (GHC), har tatt vidt i bruk.

Haskell 98 ble utgitt i 1999 under navnet The Haskell 98 Report. I 2003 kom en revidert utgave kalt Haskell 98 Language and Libraries: The Revised Report.[2] Språket fortsatte å utvikles og utvides, med GHC i spissen.

Haskell Prime[rediger | rediger kilde]

I tidlig 2006 ble økte behovet for en nyere utgave av Haskell, og en prosess ved navn Haskell Prime ble påbegynt. Denne prosessen er kontinuerlig og målet er å oppdatere Haskell-spesifikasjonen med en revidert utgave hvert år. Den første utgaven som faller under Haskell Prime er Haskell 2010, som ble annonsert i november 2009 or publisert i juli 2010. Under annonseringen av Haskell 2010 ble det også presisert at formasjonen av komitèen for den neste utgaven, Haskell 2011, er underveis.[3]

Haskell 2010[rediger | rediger kilde]

Haskell 2010 er den nyeste utgaven av programmeringsspråket Haskell. Blant de store forandringene siden Haskell 98 gir 2010-utgaven et grensesnitt mot andre språk, også kalt foreign function interface eller FFI. Haskell 2010 tillater også kildekode til å spesifisere enkelte krav for kompilering, som at brukeren må ha enkelte utvidelser eller at brukeren må ha en Haskell 2010-implementasjon. Navnene på utvidelsene som ble introdusert med Haskell 2010 er DoAndIfThenElse, HierarchicalModules, EmptyDataDeclarations, FixityResolution, ForeignFunctionInterface, LineCommentSyntax, PatternGuards, RelaxedDependencyAnalysis, LanguagePragma, NoNPlusKPatterns.[3]

Tidslinje[rediger | rediger kilde]

Følger er en tidslinje av de mest viktige øyeblikkene fra Haskells skapelse frem til nå.[1]

  • 1987, September: Møte med FCPA om å standardisere Haskell i Portland, Oregon
  • 1988, Juli: Første møte for komitèen om Haskell-spesifikasjonen
  • 1990, April: Komitéen publiserer Haskell versjon 1.0 på 125 sider.
  • 1991, August: Komitéen publiserer Haskell versjon 1.1. Dette var hovedsakelig en raffinert utgave av 1.0, men inkluderte bl.a. uttrykk som let
  • 1992, Mars: Komitéen publiserer Haskell versjon 1.2
  • 1996, Mai: Første store endring i Haskell siden 1.0 blir gjort når komitéen publiserer 1.3. Inkluderer blant annet do-uttrykket, IO-monaden og typeklasser.
  • 1997, April: Haskell 1.4 blir publisert, kun som en raffinert utgave av 1.3
  • 1999, Februar: Haskell 98 blir publisert. Denne utgivelsen hadde flere nye endringer og markerte slutten av komitéen slik den eksisterte da. Simon Peyton Jones fortsatte arbeidet
  • 2002, Desember: Simon Peyton Jones publiserer en revidert utgave av Haskell 98
  • 2009, Juli: Haskell 2010 blir publisert av Simon Marlow[3]

Kode og syntaks[rediger | rediger kilde]

En Hello World-kode er som regel det første hintet til hvordan et programmeringsspråks syntaks er utformet. En Hello World i Haskell følger, merk at den øverste linjen kan bli fjernet da Haskell er implisitt typededuksjon.

main :: IO ()
main = putStrLn "Hello, World!"

Et ofte brukt eksempel på kode i funksjonelle språk er faktorisering. Faktorisering er en matematisk metode for å dele opp et tall i alle tall det er sammensatt av.

faktoriser :: Integer -> Integer
faktoriser 0 = 1
faktoriser n | n > 0 = n * faktoriser (n-1)

Funksjoner i Haskell kan bli definert først med navn og type separert med to kolon (::). Typedeklareringen viser hvilke typer argumenter en funksjon kan få passert, den siste typedeklareringen er den returnerede typen. I eksempelet ovenfor, faktorisering, kan man se at funksjonen faktoriser tar èn integer og returnerer en annen integer.

Mønstertreffing[rediger | rediger kilde]

Eksempelet ovenfor illustrerer også hvordan man kan bruke mønstertreffing i Haskell. Mønstertreffing er når en funksjon analyserer innkommende argumenter mot et mønster som er spesifisert i funksjonsdeklareringen. I faktoriseringseksempelet ser man at funksjonen først sjekker om 0 blir passert til funksjonen, viser det seg å være sant returnerer den 1, hvis ikke fortsetter den videre til den treffer et mønster som passer.

Et annet enkelt eksempel på mønstertreffing vil være følgende funksjon, der resultatet på funksjonen blir annerledes utifra hvilken bokstav funksjonen får passert.

bokstavNavn :: Char -> String  
bokstavNavn 'a' = "Andreas"  
bokstavNavn 'b' = "Bodil"  
bokstavNavn 'c' = "Cato"

Et litt mer avansert eksempel på mønstertreffing vil være 3 funksjoner som hver tar et generiske sett med 3 objekter. taNummerEn treffer første objektet i settet og binder den til variabelen x, for så å returnere denne. taNummerTo treffer andre objektet og binder den til y, taNummerTre treffer siste og tredje objektet og binder det til z og i likhet med første funksjon returnerer alle det objektet de treffer.

taNummerEn :: (a, b, c) -> a  
taNummerEn (x, _, _) = x
taNummerTo :: (a, b, c) -> b  
taNummerTo (_, y, _) = y
taNummerTre :: (a, b, c) -> c  
taNummerTre (_, _, z) = z

Implementasjoner[rediger | rediger kilde]

Som nevnt var en del av tanken bak Haskell at det skulle være en fri og åpen spesifikasjon med flere implementasjoner. Glasgow Haskell Compiler, eller GHC, har i lange tider vært den mest oppdaterte Haskell-kompilatoren som også inkluderer flere egne utvidelser til Haskell. Èn av disse er et grensesnitt til Microsoft Windows.[4] GHC kompilerer Haskell kode ned til det aktuelle operativsystemet sin egen kode, som gjør at det ikke trenger å kjøres via en virtuell maskin.

Andre implementasjoner er:

  • Gofer, en dialekt utviklet til akademisk bruk. Hadde en tilleggsfunksjon kalt "konstruktklasser" utviklet av Mark Jones.
  • HBC, en eldre implementasjon som ikke lenger blir vedlikeholdt. Kompilerer også til operativsystemers egen kode.
  • Helium, en nyere og lettere dialekt av Haskell som skal gjøre læring av språket enklere. På grunn av at det mangler støtte for typeklasser vil mange Haskell-applikasjoner feile på denne kompilatoren.
  • Utrecht Haskell Compiler (UHC) er en Haskell-implementasjon fra Universitetet i Utrecht. Støtter nesten alle Haskell 98-funksjonene i tillegg til en del eksperimentelle utvidelser. Språket er hovedsakelig brukt til akademisk forskning innenfor genererte typesystemer og språkutvidelser.
  • Hugs, Haskell User's Gofer System, er en lett og portabel Haskell-kompilator som kompilerer til bytekode. Hugs gir kjapp kompilering av applikasjoner og er relativt kjapp under kjøring.
  • Jhc er en Haskell-kompilator skrevet av John Meacham. Kompilatoren setter fokus på hastighet og effektivitet av genererte programmet, så vell som utforskning av nye programendringer. LHC er en nylig fork av Jhc.
  • nhc98 er en annen bytekode-kompilator. Nhc98 er kompatibelt med Haskell 98-spesifikasjonen og fokuserer veldig på å minimisere minnebruk. Dette gjør at Nhc98 blir spesielt god på eldre og litt tregere maskiner.
  • Yhc, York Haskell Compiler var en fork av nhc98. Målet var å være enklere, mer portabel og effektiv. Yhc integrerte støtte for Hat, en Haskell tracer. Til forandring fra de andre inkluderte også Yhc en JavaScript-motor som lot brukeren kjøre Haskell-applikasjoner i en nettleser.

Utviklingsmiljø[rediger | rediger kilde]

Det finnes svært få dedikerte utviklingsmiljø til Haskell så flere foretrekker å bruke mer generiske tekstredigeringsprogrammer som Emacs, TextMate, Subtext og vi. Disse programmene har som regel støtte for Haskell-syntakse og fremhever denne med farger og andre effekter.

Den største applikasjonen som tilbyr et integrerte utviklingsmiljø til Haskell er Leksah (Haskel baklengs).[5] Leksah er skrevet i Haskell og er gitt ut under GPL. Med Leksah har utviklere muligheten til å formulere kode i et eget grafisk, integrert miljø med autofullføring av syntakse, import av biblioteker og integrasjon mot cabal; pakkesystemet til Haskell. Et annet verktøy skrevet i Haskell er Yi. Dette verktøyet minner svært om Vim og har mulighet til å integreres mot både Vim, Emacs og andre.[6]

Man finner også tilleggsfunksjoner til andre etablerte integrerte utviklingsmiljø, som for eksempel Eclipse[7]

Referanser[rediger | rediger kilde]

  1. ^ a b c d Jones, Simon Peyton; Hudak, Paul; Hughes, John; Wadler, Philip (2007). «A History of Haskell: The call for laziness» (PDF) (engelsk). 55 sider. Besøkt 25. juli 2011. 
  2. ^ a b c Peyton Jones, Simon. «Introduksjon til Haskell 98» (Tekst) (engelsk). Besøkt 25. juli 2011.  [ ]
  3. ^ a b c Marlow, Simon (6. juni 2010). «Haskell 2010 annonsering» (Tekst) (engelsk). Besøkt 25. juli 2011. 
  4. ^ Reid, Alastair. «Win32-2.2.0.2: A binding to part of the Win32 library» (HTML). HackageDB. Besøkt 26. juli 2011. 
  5. ^ Leksah Offisiell nettsted
  6. ^ Yi: Haskell tekstredigeringsverktøy
  7. ^ EclipseFP: Tillegg til Eclipse IDE

Lenker[rediger | rediger kilde]