On 12/01/10 21:35, Larry Evans wrote:
> On 11/30/10 13:43, Noah Easterly wrote:
[snip]
>> Thanks, Larry, this is some interesting stuff.
>>
>> I'm not sure yet whether Q is equivalent - it may be, but I haven't been
>> able to thoroughly grok it yet.
>>
[snip]
>
> Hi Noah,
>
> The attached is my attempt at reproducing your code and also
> contains an alternative attempt at emulating the code in
> section 12.5 of:
>
> http://www.thocp.net/biographies/papers/backus_turingaward_lecture.pdf
>
The attached code is a revision of my previous if_recur attempt
at emulated the section 12.5 code. This revision added the i
function from the seciton 12.5 (instead of delegating that
task to the h function). The 2nd attachment shows the output.
It shows that by modifying the args to if_recur, you can
reproduce the output from foldl or foldr.
{-
Purpose:
create a function, if_recur, like the f in section 12.5 of:
[BAC77]
http://www.thocp.net/biographies/papers/backus_turingaward_lecture.pdf
-}
module IfRecur where
-- {*if_recur
if_recur :: state_down
-> (state_down -> Bool)
-> (state_down -> state_down)
-> (state_down -> state_saved)
-> ((state_saved,state_up) -> state_up)
-> (state_down -> state_up)
-> state_up
if_recur state_now -- current state
recur_ -- continue recursion?
then_down -- ::state_down -> state_down
save_state -- ::state_down -> state_saved
now_up -- ::((state_saved,state_up)->state_up
else_ -- ::state_down -> state_up
{- The following table shows the corresponndence
between the f in section 12.5 of [BAC77]
and the arguments to this function:
[BAC77] [if_recur]
======= ==========
p recur_
g else_
j then_down
i save_state
h now_up
-}
= if recur_ state_now
then now_up
( save_state state_now
, if_recur (then_down state_now)
recur_
then_down
save_state
now_up
else_
)
else else_ state_now
-- }*if_recur
{--}
palindrome :: [a] -> [a]
palindrome x = if_recur
(x,[]) --state_now
(not.null.fst) --recur_
(\(sn,cd) -> (tail sn,(head sn):cd)) --then_down
(\(sn,cd) -> head sn) --save_state
(\(ss,cu) -> ss:cu) --now_up
(\(sn,cd) -> cd) --else_
if_recur_foldl :: [a] -> [a]
if_recur_foldl x = if_recur
(x,[]) --state_now
(not.null.fst) --recur_
(\(sn,cd) -> (tail sn,(head sn):cd)) --then_down
(\(sn,cd) -> ()) --save_state
(\(ss,cu) -> cu) --now_up
(\(sn,cd) -> cd) --else_
if_recur_foldr :: [a] -> [a]
if_recur_foldr x = if_recur
(x,[]) --state_now
(not.null.fst) --recur_
(\(sn,cd) -> (tail sn,cd)) --then_down
(\(sn,cd) -> head sn) --save_state
(\(ss,cu) -> ss:cu) --now_up
(\(sn,cd) -> cd) --else_
test = sequence
[ print "palindrome [1,2,3]:"
, print (palindrome [1,2,3])
, print "if_recur_foldl [1,2,3]:"
, print (if_recur_foldl [1,2,3])
, print "(foldl (flip(:)) [] [1,2,3]):"
, print (foldl (flip(:)) [] [1,2,3])
, print "if_recur_foldr [1,2,3]:"
, print (if_recur_foldr [1,2,3])
, print "(foldr (:) [] [1,2,3]):"
, print (foldr (:) [] [1,2,3])
]
{--}
/home/evansl/prog_dev/haskell/my-code $ ghci IfRecur.hs
GHCi, version 6.12.1: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
[1 of 1] Compiling IfRecur ( IfRecur.hs, interpreted )
Ok, modules loaded: IfRecur.
*IfRecur> test
"palindrome [1,2,3]:"
[1,2,3,3,2,1]
"if_recur_foldl [1,2,3]:"
[3,2,1]
"(foldl (flip(:)) [] [1,2,3]):"
[3,2,1]
"if_recur_foldr [1,2,3]:"
[1,2,3]
"(foldr (:) [] [1,2,3]):"
[1,2,3]
[(),(),(),(),(),(),(),(),(),()]
*IfRecur>
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe