-
Notifications
You must be signed in to change notification settings - Fork 372
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Cofoldable #53
Comments
There's an Unfoldable package that gives some guidance here: Regarding #7, it seems like Cofoldable makes sense over Unfoldable if the whole purpose is to provide some laws. Although in that case, my opinion is that we're being really specific about a natural transformation or isomorphism. Anyways, for unfold: Since this is fantasy land, I think we should use Array's instance could be: //+ unfold :: (b -> Option([a, b])) -> b -> [a]
Array.prototype.unfold = function(step, seed) {
var output = this;
return step(seed).cata({
Some: function(result) {
return output.concat(result[0]).unfold(step, result[1]);
},
None: function() {
return output;
}
});
}
var result = [].unfold(function(x){ return (x > 10) ? None : Some([x, x+1]); }, 0)
console.log(result); |
👍 on using |
Just an idea: Array.chainRec(function(next, done, x) {
return (x == 10) ? [done(x)] : [done(x), next(x+1)]
}, 0) // [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
// implementation of Array.chainRec
function stepNext(x) { return {value: x, done: false }; }
function stepDone(x) { return {value: x, done: true }; }
Array.chainRec = function _chainRec(f, i) {
var todo = [i];
var res = [];
var buffer, xs, idx;
while (todo.length > 0) {
xs = f(stepNext, stepDone, todo.shift());
buffer = [];
for (idx = 0; idx < xs.length; idx += 1) {
(xs[idx].done ? res : buffer).push(xs[idx].value);
}
Array.prototype.unshift.apply(todo, buffer);
}
return res;
}; |
As mentioned here I'd like to propose a
Cofoldable
. There's detailed information about it hereThe idea is that while
Foldable
andCofoldable
are lawless alone, together you can suggest some laws on them.It should have one of two methods:
fromArray :: [a] -> f a
unfold
I'm actually unsure on the definition of
unfold
Should it be(a -> b -> b) -> b -> b -> f a
as in the definition for `build in the link, or something else? In any case, one can be derived from the other.Please discuss.
The text was updated successfully, but these errors were encountered: