Sanctuary: reinstate S.meld

Created on 7 Dec 2016  Â·  12Comments  Â·  Source: sanctuary-js/sanctuary

@ackerdev, @MikaAK, and @JAForbes recently mentioned on Gitter that they find meld useful. The function was removed in #280 after failing to receive support in #278.

At least a handful of people find this function useful, so I'm happy to keep it around. We haven't published since #280 was merged, so it would appear that the function was never removed. ;)

Please respond with :thumbsup: if you'd like to see meld reinstated.

Most helpful comment

I'm on the fence here. There's more enthusiasm for this function than I realized initially, but there are also people who believe it does not belong in the library.

Would you consider a pull request to add meld to Ramda, @CrossEye? It's a better fit for Ramda than it is for Sanctuary.

All 12 comments

Should we :-1: if we don't like it or is just critical mass with :+1:s?

I missed the gitter conversation, I'm afraid. Do you have a link handy?

EDIT: Look here

The conversation was fairly short. Someone said the function is useful and will be missed, and a couple of people quickly replied in agreement.

The function was removed because its type cannot be expressed in Hindley–Milner, and because I was under the impression that it simply isn't a useful function. If people do in fact find it useful, I'm happy to keep it around.

Fair enough. I suppose it's a fairly natural function for JS developers writing functionally

personally, i think codeNameOneOf1 is better than codeNameOneOf2
```js
const codeNameOneOf1 = R.curry((as, x) => R.contains(x.codeName, as))
const codeNameOneOf2 = R.flip(S.meld([R.prop('codeName'), R.contains]))

codeNameOneOf([‘test’, ’test2])({codeName: ‘test’})
R.filter(codeNameOneOf([’test2’, ’test3’), […items])
```
we even didn't had description which clearly expressed what the meld was doing, one could not even take a look at tests to understand because it's way to mysterious

also using curryN in it's implementation we are limited to only passing 10 arguments, so if you have 4 functions taking 4, 4, 3 and 3 arguments we will get error as curryN only accepts max 10 as it's input.

I do agree with @safareli. I understand the frustration with constructing more complicated pipelines of functions and the desire to do so pointfree, but I don't much like meld. I am also in general pro fewer functions in Sanctuary, so if something can be removed while keeping Sanctuary usable, I'd like to. I understand opinions may differ here though

That we needed a diagram to describe what this function did makes me think were possibly going overboard by including it.

I feel like meld is actually quite useful and there's more than one time where I could of used it in the past and ended up having to have something that instead looks like const fn = curry((a, b, c) => lastFn(otherFn(someFn(a))(b))(c)) vs const fn = meld([someFn, otherFn, lastFn])

So, I somewhat frequently find myself wanting to create a function like (x, y) => f(g(x), y), and being able to create a pointfree version of this would be nice. I find myself doing this somewhat frequently, though perhaps it's a symptom of using functional JS constructs in imperative code.

Before sanctuary, I was using R.useWith(f, [g, identity]) which does work but doesn't read so well and is a little wonky to understand.

S.meld([f, g]) was definitely a little more difficult to grok at first, but created a nicer result that was easier to read after meld was grokked.

I'm not attached specifically to meld, and while I like it I'd also settle for having a good suggestion of an alternative to these if one existed.

I think you mean S.meld([g, f]) rather than S.meld([f, g]), @ackerdev.

Have those of you with meld experience run into problems with higher-order functions? Consider this example:

> S.meld([S.add, R.map]).length
3

> S.meld([x => y => S.add(x, y), R.map]).length
2

> S.meld([x => y => S.add(x, y), R.map])(10, [1, 2, 3])
[11, 12, 13]

Having to manually curry S.add in this case is a bit of a nuisance, especially since it works correctly when applied to its arguments one at a time. The problem is that S.add and R.map are both binary according to their length properties, and meld has no way to know that we'd like to treat S.add as a unary function while treating R.map as a binary function.

As soon as I found myself manually currying functions to achieve the desired results, meld lost much of its lustre.

@davidchambers Yep, you're right. Wasn't paying full attention.

I haven't used meld enough to run into that case yet, but I can see why that would be confusing and inconvenient (and cases like this are why I'm not too attached to meld in particular). useWith works better there, like R.useWith(R.map, [S.add]).

I'd be pretty ecstatic to have a clearer representation of that, obsoleting both of my primary usages for meld and useWith. Unfortunately I'm still dipping my toes in functional and don't really know if any constructs exist for this outside of the JS FP ecosystem yet.

I'm on the fence here. There's more enthusiasm for this function than I realized initially, but there are also people who believe it does not belong in the library.

Would you consider a pull request to add meld to Ramda, @CrossEye? It's a better fit for Ramda than it is for Sanctuary.

We've decided that this function does not fit with Sanctuary's philosophy (which we should write about and publish on the website). If you're a fan of this function you could express your support for it in ramda/ramda#2076.

Was this page helpful?
0 / 5 - 0 ratings

Related issues

svozza picture svozza  Â·  7Comments

arsaniwilliam picture arsaniwilliam  Â·  9Comments

zfoxdev picture zfoxdev  Â·  8Comments

davidchambers picture davidchambers  Â·  8Comments

davidchambers picture davidchambers  Â·  8Comments