Difference between revisions of "User:PaoloMartini"
Jump to navigation
Jump to search
PaoloMartini (talk | contribs) (f . g . h = ((f .) . (. h)) g) |
PaoloMartini (talk | contribs) |
||
Line 16: | Line 16: | ||
<xerox> f . g . h = (\x -> f . x . h) g = (\x -> f . (x . h)) g = (\x -> (f .) ((.) x h)) g = ((f .) . (. h)) g |
<xerox> f . g . h = (\x -> f . x . h) g = (\x -> f . (x . h)) g = (\x -> (f .) ((.) x h)) g = ((f .) . (. h)) g |
||
</pre> |
</pre> |
||
+ | |||
+ | Experimenting with variadic functions. |
||
+ | |||
+ | <haskell> |
||
+ | {-# OPTIONS_GHC -fglasgow-exts -fallow-undecidable-instances #-} |
||
+ | module VarArg |
||
+ | where |
||
+ | |||
+ | data W a = W { unW :: a } deriving Show |
||
+ | |||
+ | -- `c' is: |
||
+ | -- |
||
+ | -- c f x = (f x) |
||
+ | -- c f x y = c (f x) y |
||
+ | -- |
||
+ | |||
+ | class C a r | r -> a where |
||
+ | c :: (a -> a -> a) -> a -> r |
||
+ | |||
+ | instance C a (W (a -> a)) where |
||
+ | c f x = W (\y -> f x y) |
||
+ | |||
+ | r :: Int -> W (Int -> Int) -> Int |
||
+ | r x = ($ x) . unW |
||
+ | |||
+ | instance C a r => C a (a -> r) where |
||
+ | c f x y = c f (f x y) |
||
+ | |||
+ | test1 = let t1 = c (+) 1 |
||
+ | t2 = c (+) 1 2 |
||
+ | t3 = c (+) 1 2 3 |
||
+ | t4 = c (+) 1 2 3 4 |
||
+ | in map (r 0) [t1,t2,t3,t4] |
||
+ | |||
+ | test2 = zipWith (==) [1, 1+2, sum [1,2,3], foldr (+) 0 [1,2,3,4]] test2 |
||
+ | |||
+ | -- `d' is: |
||
+ | -- |
||
+ | -- d f [ ] = f |
||
+ | -- d f (x:xs) = d (f x) xs |
||
+ | -- |
||
+ | -- ..for which `c' is the only valid `f'. |
||
+ | -- |
||
+ | |||
+ | class D a r | r -> a where |
||
+ | d :: (forall r. (C a r) => a -> r) -> [a] -> r |
||
+ | |||
+ | instance C a (W (a -> a)) => D a (W (a -> a)) where |
||
+ | d f (x:[]) = f x |
||
+ | d f (x:xs) = d (f x) xs |
||
+ | |||
+ | test3 = let t1 = d (c (^)) [2..3] |
||
+ | t2 = d (c (*)) [2..10] |
||
+ | t3 = d (c (+)) [2..100] |
||
+ | in map (r 1) [t1,t2,t3] |
||
+ | |||
+ | test4 = zipWith (==) [foldl1 (^) [2..3], foldl1 (*) [1..10], foldl1 (+) [1..100]] test3 |
||
+ | </haskell> |
Revision as of 01:28, 17 July 2006
\a b c -> a + (b*c) \a b c -> (+) a ((*) b c) \a b -> ((+) a) . ((*) b) \a -> (((+) a) .) . (*) \a -> (.) ((+ a) .) (*) \a -> (flip (.)) (*) ((+ a) .) \a -> (flip (.)) (*) (((.) (+ a)) (flip (.)) (*) . ((.) . (+)) <xerox> I think I deserve an award for that reduction. <dons> xerox reaches PointFree Hacker, Level 7.
<xerox> f . g . h = (\x -> f . x . h) g = (\x -> f . (x . h)) g = (\x -> (f .) ((.) x h)) g = ((f .) . (. h)) g
Experimenting with variadic functions.
{-# OPTIONS_GHC -fglasgow-exts -fallow-undecidable-instances #-}
module VarArg
where
data W a = W { unW :: a } deriving Show
-- `c' is:
--
-- c f x = (f x)
-- c f x y = c (f x) y
--
class C a r | r -> a where
c :: (a -> a -> a) -> a -> r
instance C a (W (a -> a)) where
c f x = W (\y -> f x y)
r :: Int -> W (Int -> Int) -> Int
r x = ($ x) . unW
instance C a r => C a (a -> r) where
c f x y = c f (f x y)
test1 = let t1 = c (+) 1
t2 = c (+) 1 2
t3 = c (+) 1 2 3
t4 = c (+) 1 2 3 4
in map (r 0) [t1,t2,t3,t4]
test2 = zipWith (==) [1, 1+2, sum [1,2,3], foldr (+) 0 [1,2,3,4]] test2
-- `d' is:
--
-- d f [ ] = f
-- d f (x:xs) = d (f x) xs
--
-- ..for which `c' is the only valid `f'.
--
class D a r | r -> a where
d :: (forall r. (C a r) => a -> r) -> [a] -> r
instance C a (W (a -> a)) => D a (W (a -> a)) where
d f (x:[]) = f x
d f (x:xs) = d (f x) xs
test3 = let t1 = d (c (^)) [2..3]
t2 = d (c (*)) [2..10]
t3 = d (c (+)) [2..100]
in map (r 1) [t1,t2,t3]
test4 = zipWith (==) [foldl1 (^) [2..3], foldl1 (*) [1..10], foldl1 (+) [1..100]] test3