4 ms·
Well when methods by definition associate a type instance to a function the name spacing is obvious...
by thumbuddy 3y ago
Well when methods by definition associate a type instance to a function the name spacing is obvious...
- sodapopcan 3y agoThis is why I generally dislike imports. It's common practice in Elixir (and I believe some other functional languages) to generally fully qualify function calls. " hello world " |> String.trim() |> String.split() |> Enum.map(fn char -> String.uppercase(char) end) |> Enum.join() #=> "HELLO WORLD" I'm sure some will think that is too verbose but I love it. Otherwise pipes are far more flexible than method chaining just because you aren't constrained to one "type". You don't always want to do this, but as per the example above, it's pretty handy. You also don't have to rely on a method you don't own returning an instance of itself.
- em-bee 3y agowell, it depends on how import works. in python you can't use a module unless you import it, (though you can import it in a way that the full path to the function is still needed) but for example in pike import is only useful as a shortcut, and not needed if you use fully qualified function calls. and like you i never saw the point of import. using the fully qualified function calls makes the code more readable because i can quickly recognize library functions from custom code.
- sodapopcan 3y agoTrue enough about Python but I was responding more about pipes in general which Python doesn't have. I'm more confused about the original assertion that pipes give you lower confidence as to what is happening. But then I looked up how they work in Julia and saw there are two different ways they are implemented so I agree that that is maybe a little bit unfortunate, though I can't really say for sure as I've never written a line of Julia.
- em-bee 3y agoi saw pipes and import as two unrelated topics, and i was just responding to import topic. with pipes i have no experience at all. but they certainly look useful. a()|>b()|>c() looks better than c(b(a())) but i can see the confusion because there are now two ways to pass an argument. but even then a(i,j)|>b(x,y)|>c(z) is still more readable than c(b(a(i,j),x,y),z). now i want this feature in all my favorite languages
- thumbuddy 3y agoNot sure why I got down oted so hard but I personally like, x.a().b().c(). Because the functions are bound to the type. When they aren't sure pipes, but that's rare when a type is well defined. Super zen for me
- em-bee 3y agoif course x.a().b().c() is just fine, but it only works in object oriented languages where these functions return the right object for the next step. the pipe method works with any other function as long as the output type matches the type of the first argument of the next function.
- thumbuddy 3y agoML languages aren't really OOP similarly neither is Rust really. There's a beautiful middle ground between piles of functions and types with purpose that doesn't suffer from the swamp nor the over abstracted mess that a lot of paradigms offer. Okay I'll get off my high horse but I recommend trying one of these paradigms someday if you haven't already. Traits are wonderful.
- sodapopcan 3y agoI can't explain the downvotes other than that in OO method chaining does not bind you to a specific type. I don't really know Python but in Ruby, for example, you can do `"string".split.map { |s| s.upcase }`. IE, a method doesn't have to return a reference to `self`, so I'm not really seeing your argument other than choosing to use the style of only chaining when the object types match, which you can still do with pipes if you want. The only ML language I have any experience with is OCaml which is statically typed and has pipes. EDIT: re-reading your last comment it looks like I totally ignored the first part of what you said, but I guess I'm confused. This thread is also probably nested enough, lol.