Övningar för vecka 5

Börja med att göra övningarna 9.2, 9.7 och 9.8 i boken.

1. Stavningskontroll.

I program för stavningskontroll jämförs alla ord i användarens text med orden i en ordlista; de ord som inte finns i ordlistan markeras som potentiellt felstavade. En mycket förenklad form av sådan kontroll är då funktionen
unknownWords :: [String] -> [String] -> [String]
där unknownWords dictionary usertext är listan av alla ord i usertext som inte ingår i dictionary. Definiera denna funktion i två versioner:
  1. utan speciella antaganden om dictionary;
  2. om man kan anta att dictionary är sorterad.

2. Delord

Definiera en funktion som tar ett "ord" (en sträng) som argument och producerar listan av alla delord till detta ord (där ett delord fås genom att stryka noll eller flera bokstäver i det ursprungliga ordet).
Main> subWords "apa"
["","a","p","pa","a","aa","ap","apa"]
Main> 
Notera att 'ordet' "a" förekommer två gånger eftersom det kan åstadkommas på två sätt (antingen stryks de två första eller de två sista bokstäverna). Hur modifierar man funktionen så att dubbletter inte förekommer? Hur många elements har subWords cs i den omodifierade varianten?

3. Punkter i planet

Vi representerar punkter i planet med par av flyttal:
type Point = (Float,Float)
Avståndet mellan två punkter kan beräknas med avståndsformeln:
distance :: Point -> Point -> Float
distance (x1,y1) (x2,y2) = sqrt((x1-x2)^2 + (y1-y2)^2)
  1. Definiera en funktion
    allDistances :: Point -> [Point] -> [Float]
    
    sådan att allDistances p ps är listan av alla avstånd mellan punkten p och punkterna i ps.
  2. Definiera en funktion
    distantPoints :: Float -> [Point] -> [Point]
    
    sådan att distantPoints x ps innehåller alla de punkter i ps som ligger på avstånd minst x från origo.
  3. (Svårare) Definiera en funktion
    shortestDistance :: [Point] -> Float
    
    som ger det kortaste avståndet mellan två punkter i argumentlistan (observera att dessa två punkter inte måste stå intill varandra i listan). Vad bör man göra om listan innehåller mindre än två punkter? Du kan behöva hjälpfunktionen minimum som tar en icke-tom lista av tal som argument och ger det minsta talet som resultat. Denna funktion finns i preluden, men definiera den gärna själv som övning.

4. Perfekta tal

Ett perfekt tal är ett positivt heltal sådant att summan av dess äkta delare är lika med talet självt. En äkta delare till ett heltal n är ett tal k så att k < n och n är jämnt delbart med k. Med dessa definitioner ser vi att 6 är perfekt ty 6 = 1+2+3. Bestäm alla perfekta tal <= 1000.

5. Function-level definitions

Den funktion som summerar funktionen f:s värden för alla argument ur en lista xs kan definieras på följande sätt:
sumFun f xs = sum(map f xs)
men vi kan också skriva definitionen utan att nämna argumentet xs genom att utnyttja funktionskomposition:
sumFun f = sum . map f
Detta är ett exempel på vad Thompson kallar function-level definitions. Skriv Dina lösningar till övning 9.7 på denna form. Eventuellt måste Du definiera någon hjälpfunktion för att åstadkomma detta. Vilken form föredrar Du, Dina tidigare lösningar eller de i denna uppgift?