RFC: Add HasCallStack constraint to partial Data.List functions.

Mario Blažević mblazevic at stilo.com
Fri Jun 18 14:29:29 UTC 2021

+1, and I apologize for not reading the full discussion before 
suggesting the same solution. Ignore my other message please.

On 2021-06-08 1:36 p.m., Richard Eisenberg wrote:
> I've been very much of two minds in this debate: On the one hand, 
> having these constraints is very practically useful. On the other, 
> what we're doing here is very un-Haskellish, in that we're letting 
> operational concerns leak into a declarative property (a function's 
> type). The reason we're doing this is another un-Haskellish thing -- 
> partiality -- but that ship has sailed.
> So, may I propose a slightly different way forward?
> Instead of adding a HasCallStack constraint on these functions, add an 
> IsPartial constraint. For example:
> > head :: IsPartial => [a] -> a
> This is slightly awkward, still, because IsPartial is a 
> class-constraint-like-thing, but it has no parameter. But it has a few 
> very nice properties:
> * IsPartial is declarative: it describes a property of the function 
> without worrying about its operation.
> * If we think about the way constraints propagate, IsPartial has the 
> right semantics: the caller of a partial function would itself become 
> partial.
> * We have some room in how we relate IsPartial to HasCallStack. We 
> could say that IsPartial is just a synonym for HasCallStack (e.g. with 
> type IsPartial = HasCallStack). But perhaps better would be to somehow 
> give users control over whether they want the HasCallStack mechanism 
> to be able to solve IsPartial constraints. Maybe some users would 
> prefer not to be able to satisfy IsPartial constraints immediately, 
> but instead to require an acknowledgement in their code that they're 
> doing something partial. For example:
> partialityIsOK :: String -> (IsPartial => r) -> r
> elements xs = map (partialityIsOK "lists returned by `group` are 
> always non-empty" head) (group xs)
> The partialityIsOK function has a more involved type than I would 
> like, but it's very usable in practice. Of course, such a thing only 
> makes sense if IsPartial cannot automatically be satisfied. Getting 
> this to work properly probably needs an extra language feature (maybe 
> make IsPartial magically built-in?), but it might provide a 
> declarative, yet operationally practical way forward here.
> Richard
>> On Jun 6, 2021, at 12:49 PM, Dominic Steinitz <dominic at steinitz.org 
>> <mailto:dominic at steinitz.org>> wrote:
>> -1 for the reasons Henrik has listed
>> Dominic Steinitz
>> dominic at steinitz.org <mailto:dominic at steinitz.org>
>> http://idontgetoutmuch.org <http://idontgetoutmuch.org>
>> Twitter: @idontgetoutmuch
>>> On 5 Jun 2021, at 11:10, libraries-request at haskell.org 
>>> <mailto:libraries-request at haskell.org> wrote:
>>> Re: RFC: Add HasCallStack constraint to partial Data.List
>>>      functions.
>> _______________________________________________
>> Libraries mailing list
>> Libraries at haskell.org <mailto:Libraries at haskell.org>
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
> _______________________________________________
> Libraries mailing list
> Libraries at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/libraries/attachments/20210618/57f66f8e/attachment.html>

More information about the Libraries mailing list