initiial
This commit is contained in:
commit
ad8d2471a7
2 changed files with 130 additions and 0 deletions
130
haskell-book.hs
Normal file
130
haskell-book.hs
Normal file
|
@ -0,0 +1,130 @@
|
||||||
|
{-# LANGUAGE NoImplicitPrelude #-}
|
||||||
|
|
||||||
|
import Prelude hiding (map, filter, foldl, foldr, takeWhile)
|
||||||
|
import Debug.Trace
|
||||||
|
|
||||||
|
-- Base
|
||||||
|
|
||||||
|
map :: (a -> b) -> [a] -> [b]
|
||||||
|
map f [] = []
|
||||||
|
map f (x : xs) = f x : map f xs
|
||||||
|
|
||||||
|
filter :: (a -> Bool) -> [a] -> [a]
|
||||||
|
filter f [] = []
|
||||||
|
filter f (x : xs) = if f x then x : filter f xs else filter f xs
|
||||||
|
|
||||||
|
foldl :: (b -> a -> b) -> b -> [a] -> b
|
||||||
|
foldl f e [] = e
|
||||||
|
foldl f e (x : xs) = foldl f (f e x) xs
|
||||||
|
|
||||||
|
foldr :: (a -> b -> b) -> b -> [a] -> b
|
||||||
|
foldr f e [] = e
|
||||||
|
foldr f e (x : xs) = f x (foldr f e xs)
|
||||||
|
|
||||||
|
inserts :: a -> [a] -> [[a]]
|
||||||
|
inserts x [] = [[x]]
|
||||||
|
inserts x (y : ys) = (x : y : ys) : map (y :) (inserts x ys)
|
||||||
|
|
||||||
|
perms1 :: [a] -> [[a]]
|
||||||
|
perms1 [] = [[]]
|
||||||
|
perms1 (x : xs) = [zs | ys <- perms1 xs, zs <- inserts x ys]
|
||||||
|
|
||||||
|
-- Exercise 1.2
|
||||||
|
|
||||||
|
uncons :: [a] -> Maybe (a, [a])
|
||||||
|
uncons [] = Nothing
|
||||||
|
uncons (hd : tl) = Just (hd, tl)
|
||||||
|
|
||||||
|
-- Exercise 1.3
|
||||||
|
|
||||||
|
wrap :: a -> [a]
|
||||||
|
wrap x = [x]
|
||||||
|
|
||||||
|
unwrap :: [a] -> a
|
||||||
|
unwrap [x] = x
|
||||||
|
|
||||||
|
single :: [a] -> Bool
|
||||||
|
single [x] = True
|
||||||
|
single _ = False
|
||||||
|
|
||||||
|
-- Exercise 1.4
|
||||||
|
|
||||||
|
reverse :: [a] -> [a]
|
||||||
|
reverse = foldl (\a x -> x : a) []
|
||||||
|
|
||||||
|
-- Exercise 1.5
|
||||||
|
|
||||||
|
map2 :: (a -> b) -> [a] -> [b]
|
||||||
|
map2 f = foldr (\x a -> f x : a) []
|
||||||
|
|
||||||
|
filter2 :: (a -> Bool) -> [a] -> [a]
|
||||||
|
filter2 f = foldr (\x a -> if f x then x : a else a) []
|
||||||
|
|
||||||
|
-- Exercise 1.6
|
||||||
|
|
||||||
|
composed :: (a -> b -> b) -> (a -> Bool) -> b -> [a] -> b
|
||||||
|
composed f p e = foldr f e . filter p
|
||||||
|
|
||||||
|
composed2 :: (a -> b -> b) -> (a -> Bool) -> b -> [a] -> b
|
||||||
|
composed2 f p = foldr (\x a -> if p x then f x a else a)
|
||||||
|
|
||||||
|
-- Exercise 1.7
|
||||||
|
|
||||||
|
takeWhile :: (a -> Bool) -> [a] -> [a]
|
||||||
|
takeWhile f = foldr (\x a -> if f x then x : a else []) []
|
||||||
|
|
||||||
|
-- Exercise 1.8
|
||||||
|
|
||||||
|
dropWhileEnd :: Eq a => (a -> Bool) -> [a] -> [a]
|
||||||
|
dropWhileEnd f = foldr (\x a -> if f x && a == [] then [] else x : a) []
|
||||||
|
|
||||||
|
-- Exercise 1.9
|
||||||
|
-- This implementation is insanely slow because both `init` and `last` are O(n)
|
||||||
|
|
||||||
|
-- Exercise 1.10
|
||||||
|
-- e is the identity, op is associative
|
||||||
|
|
||||||
|
-- Exercise 1.11
|
||||||
|
|
||||||
|
integer :: [Int] -> Int
|
||||||
|
integer = foldl (\a x -> 10 * a + x) 0
|
||||||
|
|
||||||
|
fraction :: [Int] -> Double
|
||||||
|
fraction = (/ 10) . foldr (\x a -> fromIntegral x + a / 10) 0
|
||||||
|
|
||||||
|
-- Exercise 1.12
|
||||||
|
-- Fuck this
|
||||||
|
|
||||||
|
-- Exercise 1.13
|
||||||
|
|
||||||
|
apply :: Int -> (a -> a) -> a -> a
|
||||||
|
apply 0 f x = x
|
||||||
|
apply n f x = apply (n - 1) f (f x)
|
||||||
|
|
||||||
|
-- Exercise 1.14
|
||||||
|
|
||||||
|
-- inserts2 :: Show a => a -> [a] -> [[a]]
|
||||||
|
inserts2 n = foldr (\x (a, b) -> (trace ("{"++show a++","++show b++"}") (x : a), b)) ([], [])
|
||||||
|
|
||||||
|
-- 1 [2,3,4]
|
||||||
|
--
|
||||||
|
-- 1:2:3:4
|
||||||
|
-- map (2:) (inserts 1 [3,4])
|
||||||
|
-- 2: 1:3:4
|
||||||
|
-- 2: map (3:) (inserts 1 [4])
|
||||||
|
-- 2:3: 1:4
|
||||||
|
-- 2:3: map (4:) (inserts 1 [])
|
||||||
|
-- 2:3:4: 1
|
||||||
|
|
||||||
|
-- Exercise 1.15
|
||||||
|
|
||||||
|
remove :: Eq a => a -> [a] -> [a]
|
||||||
|
remove x ys = filter (/= x) ys
|
||||||
|
|
||||||
|
perms3 :: Eq a => [a] -> [[a]]
|
||||||
|
perms3 [] = [[]]
|
||||||
|
perms3 xs = [x : ys | x <- xs, ys <- perms3 (remove x xs)]
|
||||||
|
|
||||||
|
-- Exercise 1.16
|
||||||
|
|
||||||
|
|
BIN
minimal-elf
Executable file
BIN
minimal-elf
Executable file
Binary file not shown.
Loading…
Reference in a new issue