Initial data commit
This commit is contained in:
parent
72d218235f
commit
f23f22d71c
199087 changed files with 3378941 additions and 0 deletions
46
Task/Y-combinator/Haskell/y-combinator-1.hs
Normal file
46
Task/Y-combinator/Haskell/y-combinator-1.hs
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
newtype Mu a = Roll
|
||||
{ unroll :: Mu a -> a }
|
||||
|
||||
fix :: (a -> a) -> a
|
||||
fix = g <*> (Roll . g)
|
||||
where
|
||||
g = (. (>>= id) unroll)
|
||||
|
||||
- this version is not in tail call position...
|
||||
-- fac :: Integer -> Integer
|
||||
-- fac =
|
||||
-- fix $ \f n -> if n <= 0 then 1 else n * f (n - 1)
|
||||
|
||||
-- this version builds a progression from tail call position and is more efficient...
|
||||
fac :: Integer -> Integer
|
||||
fac =
|
||||
(fix $ \f n i -> if i <= 0 then n else f (i * n) (i - 1)) 1
|
||||
|
||||
-- make fibs a function, else memory leak as
|
||||
-- head of the list can never be released as per:
|
||||
-- https://wiki.haskell.org/Memory_leak, type 1.1
|
||||
-- overly complex version...
|
||||
{--
|
||||
fibs :: () -> [Integer]
|
||||
fibs() =
|
||||
fix $
|
||||
(0 :) . (1 :) .
|
||||
(fix
|
||||
(\f (x:xs) (y:ys) ->
|
||||
case x + y of n -> n `seq` n : f xs ys) <*> tail)
|
||||
--}
|
||||
|
||||
-- easier to read, simpler (faster) version...
|
||||
fibs :: () -> [Integer]
|
||||
fibs() = 0 : 1 : fix fibs_ 0 1
|
||||
where
|
||||
fibs_ fnc f s =
|
||||
case f + s of n -> n `seq` n : fnc s n
|
||||
|
||||
main :: IO ()
|
||||
main =
|
||||
mapM_
|
||||
print
|
||||
[ map fac [1 .. 20]
|
||||
, take 20 $ fibs()
|
||||
]
|
||||
48
Task/Y-combinator/Haskell/y-combinator-2.hs
Normal file
48
Task/Y-combinator/Haskell/y-combinator-2.hs
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
-- note that this version of fix uses function recursion in its own definition;
|
||||
-- thus its use just means that the recursion has been "pulled" into the "fix" function,
|
||||
-- instead of the function that uses it...
|
||||
fix :: (a -> a) -> a
|
||||
fix f = f (fix f) -- _not_ the {fix f = x where x = f x}
|
||||
|
||||
fac :: Integer -> Integer
|
||||
fac =
|
||||
(fix $
|
||||
\f n i ->
|
||||
if i <= 0 then n
|
||||
else f (i * n) (i - 1)) 1
|
||||
|
||||
fib :: Integer -> Integer
|
||||
fib =
|
||||
(fix $
|
||||
\fnc f s i ->
|
||||
if i <= 1 then f
|
||||
else case f + s of n -> n `seq` fnc s n (i - 1)) 0 1
|
||||
|
||||
{--
|
||||
-- compute a lazy infinite list. This is
|
||||
-- a Y-combinator version of: fibs() = 0:1:zipWith (+) fibs (tail fibs)
|
||||
-- which is the same as the above version but easier to read...
|
||||
fibs :: () -> [Integer]
|
||||
fibs() = fix fibs_
|
||||
where
|
||||
zipP f (x:xs) (y:ys) =
|
||||
case x + y of n -> n `seq` n : f xs ys
|
||||
fibs_ a = 0 : 1 : fix zipP a (tail a)
|
||||
--}
|
||||
|
||||
-- easier to read, simpler (faster) version...
|
||||
fibs :: () -> [Integer]
|
||||
fibs() = 0 : 1 : fix fibs_ 0 1
|
||||
where
|
||||
fibs_ fnc f s =
|
||||
case f + s of n -> n `seq` n : fnc s n
|
||||
|
||||
-- This code shows how the functions can be used:
|
||||
main :: IO ()
|
||||
main =
|
||||
mapM_
|
||||
print
|
||||
[ map fac [1 .. 20]
|
||||
, map fib [1 .. 20]
|
||||
, take 20 fibs()
|
||||
]
|
||||
Loading…
Add table
Add a link
Reference in a new issue