Може да търсим функциите от Prelude и много други модули тук: https://hoogle.haskell.org
Искаме да скрием следните стандартни функции, така че да ги имплементираме.
import Prelude hiding (sum, length, (++), (!!), maximum, elem, reverse,
take, drop, concat, zipWith, takeWhile, dropWhile)
Напишете типови декларации и дефиниции на следните функции от Prelude:
sum
– сумира всички елементи на списък от числаlength
– намира дължина на списък(++)
– append-ва един списък след друг[1,2,3,4] ++ [5,6] --> [1,2,3,4,5,6]
(!!)
– връща n-тия елемент на списък, същото като list-ref в Scheme[0,1,2,3,4] !! 0 --> 0 [0,1,2,3,4] !! 3 --> 3
isSorted
- проверява дали списък от числа е сортиранisSorted [1,2,3,4] --> True isSorted [1,2,4,3] --> False
maximum
– намира най-големия елемент в списъкmaximum [1,2,3,4] --> 4
elem
– намира дали елемент се съдържа в списъкelem 'y' "xyz" --> True 'y' `elem` "XYZ" --> False
reverse
– обръща реда на елементите на списъкreverse "rekontra" --> "artnoker"
isPrefix
– приема два списъка и връща дали първия е префикс на вторияisPrefix [1,2,3] [1,2,3,4,5] --> True
take
– взима първитеn
елемента от даден списъкtake 10 [1..] --> [1,2,3,4,5,6,7,8,9,10]
drop
- премахва първитеn
елемента от даден списъкdrop 11 [1..15] --> [11,12,13,14,15]
zip
- по дадени два списъка връща списък от наредени двойки с елементите имzip [1,2,3] [4,5,6,7] --> [(1,4),(2,5),(3,6)]
concat
– по списък от списъци прави списък, тоест слепя всички елементи на списъкаconcat [[1,2,3],[4],[5,6]] --> [1,2,3,4,5,6]
zipWith
– по два списъка образува нов, извиквайки функция над всеки от елементитеzipWith (,) [1,2,3] [4,5,6,7] --> [(1,4),(2,5),(3,6)] zipWith (+) [1,2,3] [4,5,6,7] --> [5,7,9]
takeWhile
– приема предикат и списъкxs
и връща най-дългия префикс наxs
, за чийто всички елементи на предиката връщат истинаtakeWhile (>10) [11,12,20,2,3,11,15] --> [11,12,20]
dropWhile
– еквивалента наtakeWhile
, който премахва вместо да взимаdropWhile (>10) [11,12,20,2,3,11,15] --> [2,3,11,15]
maxRepeated
– по списък от цели числа връща дължината на най-дългия подсписък с еднакви числаmaxRepeated [1,1,1,2,3,3,3,1,4,2,2,2,2,1,1,1] --> 4
Бонус: направете
maxRepeated
да работи със списъци от каквито и да е елементи, който могат да се сравняват. Примерно:maxRepeated "kakvokazvashh" --> 2
histogram
– за всяка уникална стойност от даден списък връща списък от наредени двойки от вида(<стойност>, <общ брой срещания>)
histogram [1,1,2,3,3,3,4,2,2,2,1,1] --> [(1,4),(2,4),(3,3),(4,1)] histogram "kakkakvokoko" --> [('k',6),('a',2),('v',1),('o',3)]
permutations
– връща списъка от всички пермутации на даден списъкpermutations [1,2,3] --> [[1,2,3],[2,1,3],[3,2,1],[2,3,1],[3,1,2],[1,3,2]]
permutations
и други полезни функции се намират в модулаData.List
scanr
иscanl
– по дадени двуместна операцияop
, начална стойностnv
и списъкxs
, връщат списъка от извикванията съответно наfoldr
иfoldl
съсop
,nv
и всичките [съответно суфикси или префикси] наxs
scanl :: (b -> a -> b) -> b -> [a] -> [b] scanl (+) 0 [1..5] --> [0,1,3,6,10,15] scanr (+) 0 [1..5] --> [15,14,12,9,5,0]