Hello, noob needs help ^_^

73 views
Skip to first unread message

Aangkat

unread,
Oct 10, 2012, 3:39:14 AM10/10/12
to introduction-to-funct...@googlegroups.com
Hur skulle jag göra min egen take funktion?
Lol det var svårare än jag trodde.

Så här har jag skrivit. Jag vet att det är fel :D


take' :: Int -> [a] -> [a]
take' 0 [] = []
take' x (y:ys) = if x==1 then [y] else take' (x+1) ys


Skulle uppskatta om någon kunde hjälpa mig :)

Aangkat

unread,
Oct 10, 2012, 3:46:12 AM10/10/12
to introduction-to-funct...@googlegroups.com
Hur ska man veta när det ska bli x+1 eller x-1

Har jätte svårt för att se skillnaden :(

Anders

unread,
Oct 10, 2012, 3:46:55 AM10/10/12
to introduction-to-funct...@googlegroups.com
Idén är rätt, dvs att funktionen ska skrivas med rekursion med avseende på första argumentet, men både basfallet och det rekursiva fallet är konstigt. I basfallet borde du kunna ta 0 element från vilket lista som helst, dvs

take' 0 xs = []

I det rekursiva fallet borde du till att börja med anropa take' med x-1 istället för x+1. Vidare behövs inte någon if-sats, istället borde du lägga y till resultatet av att ta x-1 element från ys...


--
Anders

Anders

unread,
Oct 10, 2012, 3:50:15 AM10/10/12
to introduction-to-funct...@googlegroups.com
Du måste tänka "rekursivt", dvs om vi vill ta x element från en lista och sedan plockar bort det första elementet ur listan så vill vi nu ta x-1 element ur den kortare listan.

En annan sak att tänka på är att om du anropar med x+1 så kommer funktionen bara loopa eftersom du aldrig kommer nå basfallet (om inte x från början är negativt).


--
Anders

Aangkat

unread,
Oct 10, 2012, 4:07:22 AM10/10/12
to introduction-to-funct...@googlegroups.com
ok Jag förstod med x-1 och att nå mitt basfall.
Jag har också förstått med 0 xs = 0
Basfallet skall vara så.


Men jag vet inte hur jag ska göra utan if sats. Det är svårt att skriva en custom take lol.

Om jag gör med if sats då får jag till example 
take' 5 [1,2,3,4,5] = [5]

Detta är fel. Men hur ska jag patter matcha så jag får resten av elementer :( 

Anders

unread,
Oct 10, 2012, 4:47:01 AM10/10/12
to introduction-to-funct...@googlegroups.com
Eftersom du mönstermatcher på y:ys så har du ju kallat resten av elementen för ys. Så du kan skriva take' som:

take' :: Int -> [a] -> [a]
take' 0 xs = []
take' x (y:ys) = y : take' (x-1) ys

Vi tar alltså x-1 element från ys och lägger på y.

Försök nu att skriva drop. :)

--
Anders
Reply all
Reply to author
Forward
0 new messages