prime 1 = False prime n = null [ d | d<-[2..sqn], n `mod` d == 0] where sqn = floor . sqrt . fromIntegral $ n -- можем да си дефинираме такива списъци -- като константи, които после да обработваме primes = filter prime [1..] -- list comprehension вместо map/filter -- <=> primeSqSum a b = sum $ map (^2) $ filter prime [a..b] primeSqSum a b = sum [ x^2 | x<-[a..b], prime x ] -- отново дефинираме целия ред като обикновен безкраен списък series = [ (sign x) / fromIntegral x | x<-[1..] ] where sign x = if odd x then 1 else -1 seriesSum n = sum $ take n series -- най-удобно е да използваме вградените функции take и drop -- а може и slice i j lst = drop (i-1) $ take j lst slice i j lst = take (j - i + 1) $ drop (i - 1) lst removeNth _ [] = [] -- можем и да проверяваме дали length lst < n и да връщаме lst removeNth n lst = take (n - 1) lst ++ removeNth n (drop n lst) merge lst [] = lst merge [] lst = lst merge (x:xs) (y:ys) | x < y = x : merge xs (y:ys) | otherwise = y : merge (x:xs) ys mergeSort [] = [] mergeSort [x] = [x] mergeSort lst = merge (mergeSort l1) (mergeSort l2) where (l1,l2) = splitAt (length lst `div` 2) lst -- splitAt n l <=> (take n l, drop n l) - разцепва списъка на n-тата позиция goldbachPair n | odd n || n<4 = (0,0) | otherwise = (a,b) where a = head [ x | x<-primes, prime (n - x) ] b = n - a