• mamma på vift

    Någon som kan programmerings språket Haskell????

    Läser en kurs i programmering på högskolan och vi har nu kommit till Haskell. Jag förstår ingenting och skulle behöva lite hjälp med min labb. Om det är någon som kan haskell kanske ni kan kika på uppgifterna och ge mig lite tips...jag har kört fast totalt. Har lyckats att klara uppgift 1 a men kommer inte längre.

    1 b) Antag nu att vi har valt att representera mängder som listor. Det vi nu skall göra är att skapa funktioner som motsvarar snitt (intersection) och union. Snittet av två mängder utgörs av en lista med de element som finns med i båda listorna. Unionen av två mängder utgörs av en lista med de element som finns med i minst en av de två mängderna. Observera att varken snittmängden eller unionsmängden får innehålla några dubbletter. Vi kan anta att argumenten till våra funktioner intersection och union uppfyller vårt krav på mängder, d.v.s. argumenten är listor utan dubbletter. Koda funktionerna intersection och union. (Obs: Ni måste kalla funktionerna t.ex. intersection_ respektive union_ så de inte krockar med inbyggda funktionsnamn.)

    Exempel: intersection [1,4,6] [1,3,4,2] => [1,4]
    union [1,4,6] [1,3,4,2,3] => [1,2,3,4,6]

    c) Nu skall ni koda en funktion, låt oss kalla den foo1, som tar in ett element x och en lista xs för att skapa en ny lista ys. Den nya listan skall bestå av lika många förekomster av elementet x som det finns i listan ys.

    Exempel: foo1 1 [2,1,2,1,4,1] => [1,1,1]
    foo1 4 [2,1,2,1,4,1] => [4]

    d) Nästa steg är att göra en lite mer avancerad variant av foo1 kallad foo2. foo2 är en polymorf högre ordningens funktion eftersom den som första element tar in en funktion av typen a- > b - > Bool. Denna funktion används för att testa elementet (x enligt ovan) mot varje element i listan xs för att producera ys, som då förstås skall bestå av alla element i xs som ?klarade? testet. Om vi låter funktionen vara (==) får vi vår funktion foo1 i förra uppgiften.

    Exempel: foo2 (==) 2 [1,2,4,2,5] => [2,2]
    foo2 ( [4,5]
    foo2 (>) 2 [1,2,4,2,5] => [1]
    foo2 ( ['c','d']

    Uppgift 2:
    I denna uppgift skall vi koda sorteringsfunktionen mergesort. I den utdelade filen finns en funktion för att skapa en lista med slumptal, kallad randList1. Genom att anropa t.ex. randList 10 fås en lista med 10 slumptal. I den utdelade filen finns även en implementering av sorteringsfunktionerna insertionsort (isort) och quicksort (qsort) med. Detta är för att ni skall kunna pröva de funktionerna, och även se hur de är uppbyggda.

    a) Innan vi kodar själva mergesort måste vi skriva en funktion merge, vilken tar in två sorterade listor och slår ihop dessa. Merge jobbar genom att hela tiden jämföra respektive huvud och lägga in det minsta i resultatet av att köra merge på resten av de båda listorna.
    Exempel: merge [1,2,4] [3,7] => [1,2,3,4,7]

    b) Nu är vi helt klara att koda mergesort! Skriv först de båda basfallen dvs. vad ger en tom lista respektive en lista med bara ett element. Som bekant säger sedan rekursionen att vi skall ta merge på resultatet av att mergesortera de båda halvorna. (Tips: För att dela upp listan kan take och drop användas.)
    1 randlist är egentligen ett bedrövligt hack, som utnyttjar osäkra delar av Haskell. Dock hade det blivit betydligt mer kryptiskt om det skulle gjorts på korrekt Haskell-vis, eftersom vi inte gått igenom några IO-funktioner.

  • Svar på tråden Någon som kan programmerings språket Haskell????
  • mamma på vift

    Har kikat på den sidan + lite andra sidor på nätet men blir inte mycket klokare ändå. Haskell är verkligen inte mitt favorit språk....

  • jlhm

    Här är en länk till en implementation av mergesort i Haskell, en.literateprograms.org/Merge_sort_%28Haskell%29.

    Kanske den länken kan hjälpa dig att förstå mera av hur Haskell fungerar.

    Själv hade jag aldrig hört talas om språket innan du frågade här men det verkar intressant eftersom man koncentrerar sig på algoritmen man behöver för att lösa ett problem istället för hur man ska implementera algoritmen.

  • Intifada

    Nu har jag inte jag hållt på med Haskell på länge, så jag kan inte/har inte tid att lösa problemen åt dig.
    Men här finns en hel del nyttig information som borde hjälpa dig på vägen:
    en.wikibooks.org/wiki/Haskell
    (främst funktioner och listor under "Haskell Basics" och "Elementary Haskell")

  • mamma på vift

    tack så jätte mycket!!! Ska kika på sidorna ni skrivit....är så frustrerande då jag vet hur jag vill bygga upp det men inte får till det i funktionerna.

  • essarf

    Hej! Jag tog mig lite tid att göra ett försök till en lösning. Det är alltid skoj att fräscha upp haskellkunskaperna så de inte dammar igen fullständigt

    Som sagt, det var ett tag sedan sist, så det kanske inte är de snyggaste lösningarna. Haskell är ju en konstform mer än någonting annat om man får tro vissa professorer ;)

    Fråga om det är något du inte förstår av dessa kråkfötter :)

    intersec xs ys = [x | x

  • mamma på vift
    essarf skrev 2009-10-08 09:51:17 följande:
    Hmm.. Familjeliv verkar inte gilla haskellkod i sina forum. Nåja, lade upp koden här:pastebay.com/59830
    Tack!!! Ska kolla igenom och se om jag fattar annars skriver jag igen! tack än en gång för att du tog dig tid.
Svar på tråden Någon som kan programmerings språket Haskell????