Difference between revisions of "User:PaoloMartini"

From HaskellWiki
Jump to: navigation, search
(f . g . h = ((f .) . (. h)) g)
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