Skip to content

Commit a63ec23

Browse files
authored
Merge pull request #6 from systek/hs
hs
2 parents 1a7be6c + 242c5c5 commit a63ec23

21 files changed

+18019
-1
lines changed

README.md

+23-1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ Det vil kreve at du logger inn (perfekt å logge inn med Github).
2929

3030
### Steg 3: Utføre workshoppen
3131

32+
Her kan man velge å løse oppgavene i TypeScript, eller Haskell.
33+
34+
#### TypeScript:
35+
3236
Inne i [workshop](./workshop)-mappen vil du finne følgende oppgaver:
3337

3438
- [01-pure-functions](./workshop/01-pure-functions/pure-functions.ts)
@@ -57,6 +61,24 @@ Eller så kan du kjøre en og en underoppgave:
5761

5862
Alle disse kommandoene vil re-kjøre testene når du endrer koden!
5963

64+
#### Haskell:
65+
66+
Inne i [ws-haskell](./ws-haskell)-mappen vil du finne følgende oppgaver:
67+
68+
- [01-pure-functions](./ws-haskell/lib/PureFunctions.hs)
69+
- [02-higher-order-functions](./ws-haskell/lib/HigherOrderFunctions.hs)
70+
- [03-currying-partial-application](./ws-haskell/lib/CurryingPartialApplication.hs)
71+
- [04-compose](./ws-haskell/lib/Compose.hs)
72+
73+
Hver av disse vil bestå av en oppgave-Haskell-fil, samt en test fil (som ligger i [tests](./ws-haskell/tests)). Du vil i
74+
utgangspunktet ikke trenge å åpne testfilene om du kjører testene fra terminalen.
75+
76+
Kjør testene etter at du har løst en oppgave. Her kan du velge å kjøre absolutt alle testene samtidig:
77+
`cabal test`
78+
79+
Eller så kan du kjøre en og en oppgave:
80+
`cabal test PureFunctions` for oppgave 01, `npm test HigherOrderFunctions` for oppgave 02 osv.
81+
6082
#### Jeg står fast!!
6183

62-
Rop ut, så skal vi hjelpe deg!
84+
Rop ut[fg_funkprog](https://systekkompis.slack.com/archives/C04AVTJM62Y) så skal vi hjelpe deg!

ws-haskell/CHANGELOG.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# Revision history for ws-haskell
2+
3+
## 0.1.0.0 -- YYYY-mm-dd
4+
5+
* First version. Released on an unsuspecting world.

ws-haskell/__spoilers/Compose.hs

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
{-# LANGUAGE OverloadedStrings #-}
2+
module Compose where
3+
4+
import qualified Control.Applicative as Applicative
5+
import qualified Data.Function as Function
6+
import qualified Data.Time.Calendar as Calendar
7+
import qualified Data.Time.Clock as Clock
8+
import qualified Data.Maybe as Maybe
9+
10+
import Transaction
11+
import Currency
12+
import CurryingPartialApplication
13+
14+
-- OPPGAVE 4.1: Lag en funksjon som konverterer fra DKK til NOK.
15+
dkkToNok :: Double -> Double
16+
dkkToNok = dkkToSek . sekToUsd . usdToGbp . eurToNok . gbpToEur
17+
18+
bySalary :: Transaction -> Bool
19+
bySalary a = transactionType a == "salary"
20+
21+
-- Oppgave 4.3: Calculate total earned salary
22+
sumSalary :: [Transaction] -> Double
23+
sumSalary = sum . map amount . filter bySalary
24+
25+
-- Oppgave 4.4: Calculate amount spent on a product in a specific currency
26+
amountSpentOnProductByCurrency :: Currency -> Product -> [Transaction] -> Double
27+
amountSpentOnProductByCurrency c p = sum . map amount . filter filterFn
28+
where
29+
filterFn :: Transaction -> Bool
30+
filterFn t = transactionProduct t == p && currency t == c
31+
32+
amountSpentOnProductInNok :: Product -> [Transaction] -> Double
33+
amountSpentOnProductInNok = amountSpentOnProductByCurrency "NOK"
34+
35+
pantsBoughtInNok :: [Transaction] -> Double
36+
pantsBoughtInNok = amountSpentOnProductInNok "Pants"
37+
38+
shoesBoughtInNok :: [Transaction] -> Double
39+
shoesBoughtInNok = amountSpentOnProductInNok "Shoes"

ws-haskell/__spoilers/Currency.hs

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
module Currency where
2+
3+
4+
type Currency = String
5+
6+
exchangeRateDKKToSEK = 1.54;
7+
exchangeRateSEKToUSD = 0.094;
8+
exchangeRateUSDToGBP = 0.82;
9+
exchangeRateGBPToEUR = 1.13;
10+
exchangeRateEURToNOK = 11.28;
11+
12+
dkk :: Currency
13+
dkk = "DKK"
14+
sek :: Currency
15+
sek = "SEK"
16+
usd :: Currency
17+
usd = "USD"
18+
gbp :: Currency
19+
gbp = "GBP"
20+
eur :: Currency
21+
eur = "EUR"
22+
nok :: Currency
23+
nok = "NOK"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
2+
-- Currying of functions
3+
4+
-- Copilot says:
5+
-- "Currying is the process of transforming a function that takes multiple arguments into a function that takes them one at a time."
6+
7+
module CurryingPartialApplication where
8+
9+
import Transaction
10+
import Currency
11+
import PureFunctions
12+
13+
14+
-- OPPGAVE 3.2: Gjør om isCurrency fra oppgave 1 til å være curried.
15+
isCurrencyCurried :: Currency -> Transaction -> Bool
16+
isCurrencyCurried = isCurrency
17+
18+
-- OPPGAVE 3.3: Bruk din curried versjon av convertCurrency fra oppgave 3.1 til
19+
-- å lage en funksjon som konverterer fra DKK til SEK.
20+
dkkToSek :: Double -> Double
21+
dkkToSek = convertCurrency exchangeRateDKKToSEK
22+
23+
sekToUsd :: Double -> Double
24+
sekToUsd = convertCurrency exchangeRateSEKToUSD
25+
26+
usdToGbp :: Double -> Double
27+
usdToGbp = convertCurrency exchangeRateUSDToGBP
28+
29+
gbpToEur :: Double -> Double
30+
gbpToEur = convertCurrency exchangeRateGBPToEUR
31+
32+
eurToNok :: Double -> Double
33+
eurToNok = convertCurrency exchangeRateEURToNOK
34+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
-- Higher order functions
2+
3+
-- Copilot sier:
4+
-- "Higher order functions are functions that take other functions as arguments or return functions as their results."
5+
6+
module HigherOrderFunctions where
7+
8+
import Currency
9+
import Transaction
10+
import PureFunctions
11+
12+
-- OPPGAVE 2.1: Lag en funksjon som tar inn en valuta og en liste med transaksjoner
13+
-- og filtrerer vekk alle andre transaksjoner enn de med den gitte valutaen.
14+
--
15+
-- Hint: Her får du isCurrency funksjonen fra oppgave 1.2 importert.
16+
filterByCurrency :: Currency -> [Transaction] -> [Transaction]
17+
filterByCurrency c t = filter (isCurrency c) t
18+
19+
-- OPPGAVE 2.2: Lag en funksjon som filtrerer vekk transaksjoner som ikke benytter valutaen NOK, og returnerer en liste med produkter.
20+
productsBoughtWithNOK :: [Transaction] -> [Product]
21+
productsBoughtWithNOK = map transactionProduct . filterByCurrency "NOK"
22+
23+
-- OPPGAVE 2.3: Denne funksjonen mottar et parameter som er en funksjon. Du skal da implementere
24+
-- en funksjon som filtrerer transaksjonene basert på filterfunksjonen som blir sendt inn.
25+
--
26+
-- Hint: Se på testen :)
27+
filterTransactionsByProduct :: [Transaction] -> (Transaction -> Bool) -> [Transaction]
28+
filterTransactionsByProduct t isRelevantTransaction = filter isRelevantTransaction t
29+
30+
-- OPPGAVE 2.4: Lag en funksjon som returnerer en funksjon som filtrerer en gitt transaksjon basert på valuta-parameteret.
31+
type CurrencyFilter = Transaction -> Bool
32+
33+
currencyFilter :: Currency -> CurrencyFilter
34+
currencyFilter = isCurrency
+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
module PureFunctions where
2+
import Currency
3+
import Transaction
4+
5+
-- OPPGAVE 1.1: En enkel pure function
6+
-- Lag en funksjon som konverterer et beløp fra en spesifikk valuta til
7+
-- en annen valuta basert på en vekslingskurs.
8+
9+
convertCurrency :: Double -> Double -> Double
10+
convertCurrency a r = r * a
11+
12+
-- OPPGAVE 1.2: Lag en funksjon som ser om en transaksjon er av en gitt valuta.
13+
isCurrency :: Currency -> Transaction -> Bool
14+
isCurrency c t = currency t == c

0 commit comments

Comments
 (0)