NOTE: use Perl; is on undef hiatus. You can read content, but you can't post it. More info will be forthcoming forthcomingly.
All the Perl that's Practical to Extract and Report
Stories, comments, journals, and other submissions on use Perl; are Copyright 1998-2006, their respective owners.
unfoldr (Score:1)
unfoldr { $_ ? ($_, $_ - 1) : () } 10;10,9,8,7,6,5,4,3,2,1which allows to pass arbitrary values to the callback .
Re:unfoldr (Score:1)
Read my post; I addressed that concern. To reiterate: because the empty list is a valid return value. I want to be able to make compute state transitions on the input value without them having to contribute to the resulting list.
It’s not hard to convert a read-only value to modifiable copy.
You can. You just have to capture them with a closure. Admittedly that’s cumbersome.
So yeah, it’s not syntactically very nice in certain edge cases. But all versions have tradeoffs of various forms. This one is the most minimally restrictive while maximally idiomatic rendition of
unfoldthat I have seen so far. And yet since writing this entry I have grown too dissatisfied with it to use it.The problem, ultimately, is you need to return two lists: one for the parameters to the next iteration, one for the result values produced during the current iteration. Unfortunately there’s just no nice way to do this.
Reply to This
Parent
Re: (Score:1)
The unfoldr function is a `dual' to foldr: while foldr reduces a list to a summary value, unfoldr builds a list from a seed value. The function takes the element and returns empty list if it is done producing the list or returns (@a,$b), in which case, @a is a appended to the list and $b is used as the next element in a recursive call.
Re: (Score:1)
But then you need to drag it along through all of your return values. That is cumbersome.
Using
$_for the purpose is more idiomatic. The problem is in reusing$_to signal the last iteration – that prevents you from unfoldingundef, should you want to, and it bloats the code by your having to be careful not to return thatundefwhen you meant to stop iterating.However I can’t think of any good way to signal termination out of band.