Vagter i Haskell er en funktion, der tilføjer en smule mere fleksibilitet, når man definerer funktioner. De giver dig mulighed for at angive forskellige betingelser og køre forskellige stykker kode afhængigt af, om disse betingelser er opfyldt. Paralleller kan laves med betingede udsagn, man kan se på andre sprog, men med en mere elegant og kortfattet implementering. Haskell er et rent funktionelt sprog, hvilket betyder, at bivirkninger som at ændre data andre steder i programmet er forbudte. Vagter giver en måde at håndtere sådanne forhold inden for dette paradigme.
Problemet med indlejrede vagter
Ofte i Haskell, vil du finde den situation, hvor en bestemt betingelse skal være opfyldt, men inden for denne betingelse skal en anden betingelse også være opfyldt. Disse forhold er dog ikke altid naturligt udtrykt med 'hvis' og 'andet'-udsagn eller med en liste over mønstre. Her kan indlejrede vagter være nyttige.
I første omgang understøtter Haskell ikke indlejrede vagter på en måde, der ville tillade en vagt at indeholde en anden direkte. Mens mønstertilpasning kan bygges på ubestemt tid, er vagter begrænset til en "flad" struktur. Derfor skal der tages en anden tilgang.
Løsning på problemet
For at løse dette problem og opnå funktionaliteten af indlejrede vagter har ingeniører udtænkt strategien med at inkorporere case-udtryk i vagter. Kasusudtryk i Haskell er i det væsentlige switches, der evaluerer et udtryk og sender kontrollen til den første gren, der matcher. De giver et vist niveau af indlejret logik, når de kombineres med vagter.
checkNumber nummer =
| num > 0 = tilfælde (num `mod` 2 == 0) af
Sandt -> "Positiv og jævn"
Falsk -> "Positiv og ulige"
| num < 0 = "Negativ" | ellers = "Nul" [/kode] I ovenstående kodestykke er en funktion "checkNumber" defineret med en parameter "num". Inden for vagten bruges et kasusudtryk til yderligere at opdele tilstanden. I tilfælde, hvor 'num' er et positivt tal, kontrollerer funktionen, om det er lige eller ulige.
Trin-for-trin forklaring af koden
- Funktionen "checkNumber" forudsiger karakteren af et givet tal.
- Når funktionen aktiveres, evalueres den parameter, der er overført, af vagterne.
- Den første vagt tjekker, om tallet er større end nul. Hvis det er sandt, påberåbes et kasusudtryk.
- Kasusudtrykket kontrollerer, om tallet er lige eller ulige, og returnerer den relevante streng.
- Hvis tallet ikke er positivt, flytter vagten til den næste tilstand, som tjekker, om den er negativ. Hvis det er sandt, returneres "Negativ".
- Hvis tallet ikke er positivt eller negativt, skal det være nul, og derfor returneres "Nul".
Strategien med at bruge case-udtryk i guards giver en måde at efterligne den ønskede indlejrede guard-funktionalitet. Dette koncept er nøglen til kodeklarhed og styring af programflowet på en intuitiv måde inden for rammerne af funktionel programmering.
Resumé
Overordnet set kan det i rene funktionelle sprog som Haskell ofte være en udfordring at styre programflow og betingelser. Beskyttere og kasusudtryk kan bruges effektivt til at give rig, intuitiv tilstandslogik og kontrolflow, der holder koden klar, let at forstå og vedligeholde.