-
Notifications
You must be signed in to change notification settings - Fork 139
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
explore adding support / design implications of "totality at all costs" api #254
Comments
feature request from @kindaro |
example being: "safeHead" perhaps (though i think there maybe more compelling examples .. head isn't really something you should do for nontrivial vector codes i think) |
For |
First you @cartazio delete my issue and write something else instead (only partially transferring what I had to say), then you @Shimuuar close it saying «awfully vague». It is hard for me to say something constructive in this situation. I have withdrawn from the open source community because of situations like this. I think everyone will benefit if we all try to be a little bit more constructive and work together. I understand that maintenance of a package is work that is not always rewarding. But what do you gain by dismissing your users? You only transfer your frustration to others. There were certain issues I experienced working with this library. Likely other people also experience the same issues — not everyone will take time to open an issue. If you try to pretend these issues are not here, you will have less happy users and even fewer open issues. Is this what you want to achieve? |
So far as I can remember, my offer was in the essence the following:
This is a well justified and reasonable offer. It was 4 years ago and it is still. I do interpret your brushing it off like you did as disrespect. But I am going to make an effort to calm down right now and ask you again very politely: please entertain the thought of meeting this offer for a moment and let me know what you think. Who am I to ask this?
If you do not value me as a representative of your user base, then who is your user base? |
Sorry, but after single round of broken telephone issue did become quite vague. So problem is two possible definition of Request is to make sure that all functions are total. That simply won't happen. When it comes to working with indexes directly invariants become too complicated to be expressed in haskell's type system. Returning Better documentation on which functions may throw exception and when will be quite useful |
Yes, some parametrically polymorphous partial functions cannot be extended to total functions, So, partial functions can be made total by completing the target type by wrapping it in Whether to use the total interface or the partial interface is a non-trivial choice specific to a particular use case. Sometimes it is clear enough that a partial function will never receive an input for which it is undefined. Other times I want this function to return So, what are possible ways forward?
Something that can be done in either case is to make sure all partial functions have a total counterpart and their documentation refers to it. If I remember PVP right, this can be done with merely a minor version bump. Let me explain the motivation. What matters here is not whether some specific case can be made to work or not. As you say, |
@kindaro have you tried
Are there downsides to fleshing out such module in a separate package? This would provide even better UX for a "tired software engineer" - if you depend on, say,
|
I think that adding variants of functions that report error as But adding several module of reexports puts too much burden on maintainers with marginal benefits |
Open source projects do not have official management, but this does not mean that all issues can be solved technically. This issue is not about a single case of a function with a certain type signature and behaviour (
Anyway. Let us look at the specifics of this issue again. @Bodigrim Would you say adding Here is one example of a statement from a maintainer that is simply arbitrary. No research, no justification.
@Shimuuar, how do you know what the benefit will be for the users of the library? Have you researched? I have brought evidence: A maintainer of an open source library is at once an engineer and a manager. Reducing problems to technical challenges is a worthy skill, but one cannot solve all problems by reduction to a technical challenge. Here are some problems that are not solved and that make
I have seen some improvements to core libraries. For example,
This was 4 years ago. Persuading the core libraries committee to add Technical expertise is important. But also management effort is important. Why not write a clear vision, priorities and guidelines, why not stay curious and respectful? Then, issues like this one will not be needed. Why not solve the problem at the root? |
Carter has not been maintainer of
I've personally contributed to
I have no idea. I tried to find the issue you are speaking about, but I can't find any record of that. Take it up with @cartazio He's been removed from being
Please, by all means. PRs are welcome. No-one will stop you from contributing to
This is a good idea. I'd totally support that. However, personally I am in a situation right now where I can't dedicate too much time to open source work, since I currently have very tight deadlines at work. |
@kindaro please, telling people what should they do and doing so with sense of absolute certainty is quite impolite. You also seem to forget that in open source people do what they want to do. There's no contractual obligations, no manager to tell them what to do.
Because I felt like implementing it. Why there's no "Talk is cheap. Show me the code" |
Hello Alexey @lehins!
But Aleksey @Shimuuar does not listen to me either. I said (and brought evidence) that API made out of total functions is important, but to him «adding several module of reexports puts too much burden on maintainers with marginal benefits». His latest comment shows that he misunderstood me big way, and I do not see any effort of constructive communication from him. This is evidence that «maintainer no listen» is still a correct summary. Anyway — this is not how trust works. GitHub does not show me the list of maintainers, so I cannot tell who is or is not a maintainer at any given time. Instead, there is collective responsibility. For example, I know that Mikolaj Konarski is respectful and I should always work with him. Last time I checked he was a maintainer of Cabal, and this is good for me. But I also know other people who were maintainers of Cabal at some point (or were behaving as such de facto — I cannot know) and who were not respectful. I cannot take the risk. I shall think three times before even looking at their issue tracker. Likewise with If a maintainer breaks the code and disappears, other maintainers are accountable. You do not get to say «it was not me». Likewise, if trust is broken, maintainers are accountable. You are not line workers — you are the top management. You are ultimately accountable for the success of the library — not me and not someone who was a maintainer 3 years ago. By the way, let us not put responsibility specifically on Carter @cartazio. Someone with moderator level access removed my issue 4 years ago. We have not found out who or why. I remain a friend and supporter of anyone who contributes to Haskell. What matters now is repairing the trust that was damaged and picking up the responsibility that was dropped.
What matters is not what people believe in itself. You would not believe what some people I met believe if I told you. Belief can be manipulated — what matters is solving the customers' problems and sustainability of business.
The big problem right now is that objections like «nightmare to maintain», «you and I are not the only customers» and «in open source people do what they want to do» crowd out deep and constructive thinking. This is why management matters. Someone needs to think deeply and constructively about stuff more abstract than code.
You are simplifying to the point that truth is compromised.
I understand you and be sure I deeply appreciate the work you put in Hello Aleksey @Shimuuar!
Would you say the essence or the topic of any of my messages above is telling people what they should do with the sense of absolute certainty? I accept that this is a possible reading, but I cannot see specifically how you managed it. Understanding one another on the Internet is also a kind of work — it is not always easy. I make an effort to write clear and respectful messages, but I accept that I may have failed at some point. What I intended to deliver is that there is evidence to certain problems that make the experience of working with
You are the manager, Aleksey. You are the top management. There is no such thing as «no manager». Choosing to do nothing is also a choice. Choosing to do whatever you feel like is also management. Moreover, as a spokesperson and maintainer of a core library, you are privileged to be a top manager of Haskell. With great power comes great responsibility.
Your wish is my command. -- | /O(1)/ Just the first element — or nothing when there are none.
vectorToMaybe :: Vector v a => v a -> Maybe a
{-# INLINE_FUSED vectorToMaybe #-}
vectorToMaybe v = v !? 0 See, you're the boss. |
It is theoretically possible (though implausible) that your issue was removed by one of organisation admins. However, what I can tell you very certainly is that none of the current team (me + Alexey + Aleksey) is responsible for it simply because we did not have access rights at the time. Unfortunately, we did not know about the (now deleted) history of the issue and Aleksey did not mean to insult or impinge you when he closed the issue two days ago. I feel that we got off on the wrong foot here, shall we try and start anew? |
The only specific consequence of that event is that I generally trust the moderators less. I am not here to pin blame on someone. If you can promise that issues will not be disappearing on your watch, then good. If you allow for the possibility that this issue disappears tomorrow, then I should take extraordinary measures, such as saving some screen shots. This is not technically difficult — the trouble for me is that I do not know what to expect, what the policy is. Likewise, I cannot tell what kind of patches will be merged and which will be declined. Is So far my main contribution is the summary of the 4 different ways to resolve this issue:
In the ideal, I want to have such clear understanding of values shared by the maintainers of For example, If I understand that Haskell's core libraries will be full of partial functions forever, at least I could put a big cross on them and stop worrying. But sometimes you make small steps to improvement. Where are you going? Where will Haskell be next year or 5 years in the future? The simplest way to build common knowledge about shared values is to enforce them from the position of authority. For example, if you say «our value is eternal backwards compatibility, anyone who disagrees should fork», everything will become clear. Or you can say «our value is best practices», «our value is minimal interface», «our value is high performance». But you cannot say «our value is doing whatever we feel like» — this does not allow your customer to make any decision because it does not describe the product. Are there other ways to build common knowledge about shared values? There are, but I cannot offer anything specific. This is why I say that maintainers are top managers — you are in the best position to build this common knowledge. And without this common knowledge it is very hard to achieve open source collaboration.
Whatever you say I shall do. If you can give me clear instructions I shall follow these instructions. |
The general policy is not to delete issues, unless their content is inappropriate (hate language, profane language, etc.). We are not in position to give any hard promises - after all we are at mercy of organisation admins and even well intentioned people can fat finger by mistake, but a removal of an issue is an exceptional, almost unheard of event. I'm really sorry for your experience here 4 years ago, I don't know what happened (and I'm not implying that it was your fault). |
@kindaro I recommend reading our discussion in this ticket #361 in full. You will see that we not only already considered this exact approach, but this has actually been done in the past in vector-0.9 and has been reverted since. We, as maintainers decided that even splitting Unsafe functions into their own modules is not worth of pursuing, therefore we are certainly not going to induce a whole lot of breakage on downstream users with shifting around safe and partial functions. Therefore, I suggest going the safest and the most lenient route possible: "Building a whole standalone package vector-safe." That package can re-export all of the Stability of core packages is very important, often more important than API improvements. We appreciate your interest in Haskell ecosystem, and I hope you can respect our decision as maintainers to not pursue these changes. That being said, if you still feel very strongly about making these improvements directly in the That is my, hopefully clear instruction on how to go forward about this issue. As far as |
None. Although I want to add that additions of total counterparts of partial function and documentation improvements are welcome |
Just a quick follow up. Addition of total counterparts to all partial functions from the current API that don't currently exist deserve is definitely issue worthwhile on pursuing. Although a separate issue and a proper discussion is necessary. At least that would have a much narrower scope that this ticket. For example, I'd rather have a name @kindaro So, a separate suggestion I have is creating an issue that lists all of total functions that are missing from current API. And collectively we could work on something like that. |
😄 This is too funny, we said the same thing at the same time. I literally pressed the button at the same time as your comment appeared |
The fundamental answer is that core libraries are understaffed (and, well, unpaid). We simply do not have resources to maintain a consistent service level for all requests. Sometimes a maintainer has more spare time than usual and gets nerd snipped into doing something, sometimes it indeed takes months even for myself to make things happen. It's also a sign of maturing ecosystem, and I do not see "a month long debate" too high of threshold to change core libraries, affecting thousands of users. We do routinely have much longer discussions at https://github.com/haskell/core-libraries-committee. @lehins let's carry on here for a little bit longer before closing. |
Speaking of values, I do prefer total functions to partial ones. However, as I learned in course of haskell/core-libraries-committee#87, this is not a value shared by all Haskell community. I'm not sure that separating total functions into their own module makes sense:
I'm happy to merge total counterparts for |
Unbelievable to see such great headway after going out for a short walk! Speaking of naming, let me add a small note. In Mathematics, there is this concept called «mathematical red herring principle». In this case:
I think reframing the conversation about supposed functions in this context will help clarify the grand scheme into which things should eventually fit. There is already a disastrous article on the Internet that conflates functions and procedures, as if functional programming did not exist. We can do better. on disappearing issues
Also cosmic rays can flip bits and GitHub can be razed by ransomware. So can you write this general policy down? And who are the organization admins, by the way? Is there a reason not to put the list of people with moderator level access to the documentation? Sorrow for the past does not matter — positive changes for the sake of better future are what matters. on long discussions
So, how about we instead have a long discussion once that sets the vision for the core libraries with a timeline of 1 year, 5 years and eternity, and then summarize this discussion into a vision document? Seems like this could save some time for the understaffed maintainers. Has this been tried? on shared values
No value will ever be shared by all. It is a situation best described by a probabilistic model. What matters is that all changes add up to a great product that solves a specific problem in a way that is sustainable. Right now I see that at least three of us agree that in the eternity functions should be sundered from more general relations, and all the more so from things that are not even relations. It will take me some time to read that conversation. I see you have great fun over there. on adding total functionsSo, say we have total counterparts to partial functions. How can they be marked? How would the user tell which supposed function is a function and which is merely a partial function? If functions are marked as such in a uniform way, then it is easy to write a safe package generator, a linting tool or any other kind of tool. In the ideal also partial functions should point to their total counterparts. Is there a clear way of how this can be done? A feature that users do not get to know about is not complete. I am on the way to raising a separate issue to discuss naming. |
@kindaro you are asking great questions, but unfortunately way above our pay grade. Yes, it would be nice to have a clear governance (see haskell/meta#1) and it would be nice if someone has time to design a grand vision of Haskell future for 5 years ahead. |
Please stop @ ing me. I edited your comments at the time because I have and had clinical anxiety / generalized panic issues, and I wanted to focus on the technical parts of your ideas And a person in my family was in the hospital at the time on life support so I didn’t have the time [omitted - Bodigrim]. |
Carter, I'm sorry for your mental health issues, but let's maintain respectful attitude and avoid personal insults. I edited your message above. I think it's really time we continue the discussion of total functions elsewhere, in a separate thread. |
Hey Carter. I know from the inside what anxiety and panic attacks feel like. I love you as a brother, stay strong! |
its pretty tricky to actually have a humane api for "total array programming" for dynamically sized arrays (even in something like ATS/Idris/Agda, with static sized arrays, having a good UX for this can be tricky)
I think it turns into a related subproblem: what are total combinators that have nice definitions in terms of the
Stream
andBundle
datatypes used within the vector fusion frameworkThe text was updated successfully, but these errors were encountered: