1 Programmera med strängar nr 9 Tal till sträng Sträng till tal Grep Sträng till lista av ord
2 Omvandla tal till strängar Specifikation –En funktion som givet ett heltal returnerar talet som en sträng, om talet är negativ ska det starta med en tilde. Design –Kontrollera först om det är negativt, om det är det se till att strängen börjar med en tilde. –Den delar upp det positiva talet med en entalsdel och den andra som resten av talet. –Entalsdelen omvandlas till ett tecken och läggs sist. –Resten behandla på samma sätt som hela det positiva talet.
3 Implementation fun int2char n =chr (n + ord "0") val int2char = fn : int -> string fun pos2string n = if n < 10 then int2char n else pos2string (n div 10)^ int2char (n mod 10) val pos2string = fn : int -> string fun int2string n = if n < 0 then "~" ^ pos2string (abs n) else pos2string n val int2string = fn : int -> string uml> int2string 234; val it = "234" : string uml> int2string ~776; val it = "~776" : string
4 Omvandla en sträng av siffror till ett tal Design –Omvandla till listor av tecken –Kontrollera om första tecknet är ~, dvs talet är negativt –Omvandla varje tecken till en tal –Omvandla listan av tal till ett tal, uttnyttja positionen dvs 235 = 2 * * * 10 0 och 235 = * ( * 2)
5 Implementation Tecken till tal fun char2int c = ord c - ord "0" val char2int = fn : string -> int Omvandla en listan av tecken till ett tal, förutsätt att den är i omvänd ordning fun charlist2int [] = 0 | charlist2int (x::xs) = char2int x + 10 * charlist2int xs val charlist2int = fn : string list -> int Kontroll om första tecknet är negativt fun list2int ("~"::xs) = ~ (charlist2int (rev xs)) | list2int xs = charlist2int (rev xs) val list2int = fn : string list -> int
6 Sträng till tal val string2int = list2int o explode val string2int = fn : string -> int Test - string2int "234"; > val it = 234 : int - string2int "~345"; > val it = ~345 : int - string2int(int2string ~98245); > val it = ~98245 : int
7 Grep - finns en sträng i en annan sträng? Design –Omvandla båda strängarna till listor av tecken –Kontrollera om den andra strängen börjar med den första genom att jämföra tecken för tecken. –Om den inte gör det ta bort ett tecken från andra strängen och försök igen.
8 Implementation Kontrollera om en lista är början på en annan lista fun startswith nil _ = true | startswith _ nil = false | startswith (x::xs) (y::ys) = x = y andalso startswith xs ys > val startswith = fn : ''a list -> (''a list -> bool) Kontrollera om en lista är en dellista av annan lista fun sublist [ ] lin = true | sublist _ [ ] = false | sublist reg lin = startswith reg lin orelse sublist reg (tl lin) > val sublist = fn : ''a list -> (''a list -> bool)
9 Huvudfunktion Omvandla till listor av strängar och se om första lista är en dellista till den andra fun grep regexp line = sublist (explode regexp) (explode line) > val grep = fn : string -> (string -> bool) Test - grep "HEE" "HEHHEHHEE"; > val it = true : bool - grep "HEE" "HEHHEHHE"; > val it = false : bool - grep "" "Any string"; > val it = true : bool - grep "Any string" ""; > val it = false : bool
10 Hitta orden i en sträng Design –Omvandla strängen till en lista av tecken –Sök till första tecken som särskiljer ord (avskiljare) –Spar listan fram till det tecknet (ett ord) –Tag bort de avskiljare som nu finns först –Upprepa det tidigare tills listan är tom –Omvandla orden som från listor till strängar
11 Implementation Känna igen en avskiljare fun isseparator x = member x (explode ",.()?") val isseparator = fn : string -> bool Ta bort avskiljare från början av en lista fun rem_sep [] = [] | rem_sep (x::xs) = if isseparator x then rem_sep xs else x::xs val rem_sep = fn : string list -> string list
12 Implementation forts. Söka till separerare och och spara del orden i en ackumulator. Dela på det sättet upp listan. fun wordsplit word [] = [rev word] | wordsplit word (x::xs) = if isseparator x then rev word :: wordsplit [] (rem_sep xs) else wordsplit (x::word) xs val wordsplit = fn : string list -> (string list -> string list list) Omvandla till lista, dela upp i ord, omvandla tillbaka till strängar val words = map implode o wordsplit [] o explode val words = fn : string -> string list
13 Exempel words "Hej detta är ett (litet) meddelande. Vi ses"; val it = ["Hej","detta","är","ett","litet","meddelande", "Vi","ses"] : string list