[GHC] #14547: Wrong warning by -Wincomplete-patterns
GHC
ghc-devs at haskell.org
Fri Apr 27 08:40:40 UTC 2018
#14547: Wrong warning by -Wincomplete-patterns
-------------------------------------+-------------------------------------
Reporter: YoshikuniJujo | Owner: (none)
Type: bug | Status: patch
Priority: low | Milestone:
Component: Compiler | Version: 8.2.1
Resolution: | Keywords: incomplete-
| patterns OverloadedLists,
| PatternMatchWarnings TypeFamilies
Operating System: Linux | Architecture: x86
Type of failure: Incorrect | Test Case:
error/warning at compile-time | deSugar/should_compile/T14547
Blocked By: | Blocking:
Related Tickets: | Differential Rev(s): Phab:D4624
Wiki Page: |
-------------------------------------+-------------------------------------
Comment (by sighingnow):
Replying to [comment:7 simonpj]:
Thanks for your explanation and analysis, Simon. I agree to add a note to
explain this condition. Now I have some other thought with the `ListPat`
case of `translatePat`.
> You are checking that the function actually has type [t1] -> [t2], where
normalise t1 = normalise t2.
I think in fact we don't need to do the check. For `ListPat x lpats
elem_ty (Just (pat_ty, _to_list))`, we know the `_to_list` have type:
{{{
toList :: l -> [Item l]
}}}
If we know the `pat_ty` (the `l` in toList's signature) is `[a]` (the List
type), then we can conclude that `Item l = a`, in other words,
`norm_elem_ty = norm_e_ty`. Because in `instance IsList [a]`, we have
`type (Item [a]) = a`. Although we can give an instance IsList [Int] (more
specific than the default IsList [a]), we can't overwrite the type family
instance.
The original comment says:
> {{{
> -- We have to ensure that the element types are exactly the same.
> -- Otherwise, one may give an instance IsList [Int] (more specific than
> -- the default IsList [a]) with a different implementation for `toList'
> }}}
However we can't achieve this goal without check the type of `_to_list`.
In practice, we almost never define more specific IsList instance like
`instance IsList [Int]`, we don't need to concern that case. So we can
simplify the code as
{{{#!hs
ListPat x lpats elem_ty (Just (pat_ty, _to_list))
| Just e_ty <- splitListTyConApp_maybe pat_ty
-> translatePat fam_insts (ListPat x lpats e_ty Nothing)
| otherwise
-> mkCanFailPmPat pat_ty
}}}
Or should be check whether the type of `_to_list` is `[a] -> [a]` (the
most general type) ? I don't think it's necessary for practical Haskell
code. **I'm not sure if I understand this correctly.**
Another silly question is that I still can't see why we need to concern
about the view pattern for exhaustiveness checking of overloaded list. I
think the `toList` and the `[a]` instance of `IsList` are different with
ordinary view functions in view pattern. I will mention this in the note.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14547#comment:9>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list