| ▲ | munchler 7 hours ago |
| Well, I totally disagree with this. One of the main benefits of currying is the ability to chain function calls together. For example, in F# this is typically done with the |> operator: let result =
input
|> foobinade a b
|> barbalyze c d
Or, if we really want to name our partial function before applying it, we can use the >> operator instead: let f = foobinade a b >> barbalyze c d
let result = f input
Requiring an explicit "hole" for this defeats the purpose: let f = barbalyze(c, d, foobinade(a, b, $))
let result = f(input)
Or, just as bad, you could give up on partial function application entirely and go with: let result = barbalyze(c, d, foobinade(a, b, input))
Either way, I hope that gives everyone the same "ick" it gives me. |
|
| ▲ | emih 7 hours ago | parent | next [-] |
| You can still do this though: let result = (barbalyze(c, d, $) . foobinade(a, b, $)) input
Or if you prefer left-to-right: let result = input
|> foobinade(a, b, $)
|> barbalyze(c, d, $)
Maybe what isn't clear is that this hole operator would bind to the innermost function call, not the whole statement. |
| |
| ▲ | twic 6 hours ago | parent | next [-] | | Even better, this method lets you pipeline into a parameter which isn't the last one: let result = input
|> add_prefix_and_suffix("They said '", $, "'!")
| | |
| ▲ | raincole 6 hours ago | parent [-] | | Yeah, especially in F#, a language that means to interpolate with .Net libraries (most not written with "data input at last" mindset.) now I'm quite surprised that F# doesn't have this feature. |
| |
| ▲ | Smaug123 4 hours ago | parent | prev | next [-] | | This is essentially how Mathematica does it: the sugar `Foo[x,#,z]&` is semantically the same as `Function[{y}, Foo[x,y,z]]`. The `&` syntax essentially controls what hole belongs where. | |
| ▲ | raincole 6 hours ago | parent | prev [-] | | Wow, this convinced me. It's so obviously the right approach when you put it this way. |
|
|
| ▲ | skybrian 6 hours ago | parent | prev | next [-] |
| For pipelines in any language, putting one function call per line often works well. Naming the variables can help readability. It also makes using a debugger easier: let foos = foobinate(a, b, input)
let bars = barbakize(c, d, foos)
Other languages have method call syntax, which allows some chaining in a way that works well with autocomplete. |
| |
| ▲ | RHSeeger 3 hours ago | parent [-] | | > Naming the variables can help readability It can, or it can't; depending on the situation. Sometimes it just adds weight to the mental model (because now there's another variable in scope). |
|
|
| ▲ | 7 hours ago | parent | prev [-] |
| [deleted] |