1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
/**
* Er is nog een probleem met fromString: deze geeft een onduidelijke warning bij het compileren (toInt geeft geen inline code).
* Verder wordt 5:a0 vrolijk gelezen als 5 minuten, 0 seconden, terwijl dit 0 minuten, 0 seconden zou moeten geven volgens de opgave.
* Ik weet niet zeker of dit een randgeval is waar de opgavemaker geen rekening mee heeft gehouden, of dat de code aangepast kan worden.
*/
implementation module StdT
import StdEnv
:: T = {m :: Int, s :: Int}
instance == T where == a b = a.m == b.m && a.s == b.s
instance < T where < a b = a.m < b.m || a.m == b.m && a.s < b.s
instance zero T where zero = {m = zero, s = zero}
instance + T where + a b = fromInt (toInt a + toInt b)
instance - T where - a b = if (a < b) zero (fromInt (toInt a - toInt b))
instance toInt T where toInt a = a.m * 60 + a.s
instance fromInt T where fromInt n = if (n < 0) zero {m = n/60, s = n rem 60}
instance toString T where
toString {m = x, s = 0} = toString x +++ ":00"
toString a = toString a.m +++ ":" +++ (if (a.s < 10) "0" "") +++ toString a.s
instance fromString T where
fromString s = if (s.[size s - 3] == ':')
{m = toInt (s % (0, size s - 4)), s = toInt (s % (size s - 2, size s - 1))}
zero
Start :: (Bool, Bool, T, T, T, Int, String, T, T)
Start = (LOTR == Tea, Tea < LOTR,
zero + LOTR, LOTR + Tea, Tea - LOTR,
toInt LOTR, toString Tea,
fromString "5:40", fromString "foo")
LOTR = {m=178, s=0}
Tea = {m=0,s=41}
|