[Haskell-cafe] More death to partial functions: Should -fwarn-incomplete-uni-patterns be enabled with -Wall?
Patrick Redmond
plredmond at gmail.com
Sun Nov 8 01:29:00 UTC 2015
Clinton:
> when the programmer knows that "myDictionary" doesn't contain any empty strings (perhaps because of checking that's already occurred).
I think if the non-empty string invariant is only required for the
implementation of one function, it might be safe write a lambda which
assumes the invariant, but in general such assumptions are better
expressed through the type system (eg, a newtype with only a smart
constructor exposed, which checks that the string is nonempty).
William:
> It's very possible that someone re-factors their code so the type has multiple constructors, but forgets that they wrote some of these lambda expressions. -Wall should warn them about this.
Yikes. This is a very good argument for these warnings to be enabled.
I'll probably modify the `stack new` project template to include
-fwarn-incomplete-uni-patterns in the cabal file for the time being.
On Sat, Nov 7, 2015 at 5:21 PM, Apostolis Xekoukoulotakis
<apostolis.xekoukoulotakis at gmail.com> wrote:
> Just learning Haskell here but I also agree. Rust gives a compile error by
> default for non-exhaustive patterns.
> I expect Haskell to be more secure than Rust.
>
> https://doc.rust-lang.org/book/match.html
>
> On Sun, Nov 8, 2015 at 3:16 AM, William Yager <will.yager at gmail.com> wrote:
>>
>> Absolutely agreed. The only time it is generally safe to write pattern
>> matching lambdas is if the type only has a single constructor. It's very
>> possible that someone re-factors their code so the type has multiple
>> constructors, but forgets that they wrote some of these lambda expressions.
>> -Wall should warn them about this.
>>
>> --Will
>>
>> On Sat, Nov 7, 2015 at 6:10 PM, Niklas Hambüchen <mail at nh2.me> wrote:
>>>
>>> Hello everyone,
>>>
>>> to my dismay, a -Wall compiled program I deployed today crashed with
>>>
>>> Exception: Non-exhaustive patterns in lambda
>>>
>>> and I learned from http://dev.stephendiehl.com/hask/ that
>>>
>>> A more subtle case is when implicitly pattern matching with a single
>>> "uni-pattern" in a lambda expression. The following will fail when
>>> given a Nothing.
>>>
>>> boom = \(Just a) -> something
>>>
>>> GHC can warn about these cases with the
>>> -fwarn-incomplete-uni-patterns flag.
>>>
>>> And in fact:
>>>
>>> ghci -Wall
>>> > map (\Nothing -> "ok") [Just 'a']
>>> ["*** Exception: <interactive>:2:6-21: Non-exhaustive patterns in
>>> lambda
>>> > :set -fwarn-incomplete-uni-patterns
>>> > map (\Nothing -> "ok") [Just 'a']
>>> <interactive>:4:6: Warning:
>>> Pattern match(es) are non-exhaustive
>>>
>>> It really surprised me that -fwarn-incomplete-uni-patterns is not
>>> included in -Wall; I've felt really safe with my -Wall so far,
>>> especially about totality and similar things that will almost certainly
>>> lead to crashes.
>>>
>>> In an older mail from 2010
>>>
>>> (https://mail.haskell.org/pipermail/glasgow-haskell-users/2010-September/019237.html)
>>> I saw Simon mention that it wasn't planned to warn about inexhaustive
>>> patterns like this.
>>>
>>> I feel like there has been a strong push towards more totality in the
>>> last years, and I would like to ask if enabling
>>> -fwarn-incomplete-uni-patterns in -Wall may be reconsidered for a coming
>>> next GHC version, or if there are still opponents to that.
>>>
>>> Niklas
>>> _______________________________________________
>>> Haskell-Cafe mailing list
>>> Haskell-Cafe at haskell.org
>>> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
>>
>>
>>
>> _______________________________________________
>> Haskell-Cafe mailing list
>> Haskell-Cafe at haskell.org
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
>>
>
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
>
More information about the Haskell-Cafe
mailing list