I have the following code and I don't know what should feed at ??
. Or cannot polymorphic patterns make complete?
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE ViewPatterns #-}
module Data.Tuple.Single.Class
( Single (..)
, pattern Single
) where
class Single t where
wrap :: a -> t a
unwrap :: t a -> a
pattern Single :: Single t => a -> t a
pattern Single a <- (unwrap -> a) where
Single a = wrap a
{-# COMPLETE Single :: ?? #-}
GHC document says that when all the conlikes are polymorphic you must type conlike.
When making ??
()
, the compilation is successful. But what does ()
mean? And GHC says still non-exhaustive on usage.
{-# LANGUAGE PatternSynonyms #-}
{-# OPTIONS_GHC -Wno-orphans #-}
module Data.Tuple.Single.Only
( Single (..)
, pattern Single
) where
import Data.Tuple.Only (Only (Only, fromOnly))
import Data.Tuple.Single.Class (Single (unwrap, wrap), pattern Single)
instance Single Only where
wrap = Only
unwrap = fromOnly
ghci> Single a = wrap 1 :: Only Int
<interactive>:2:1: warning: [-Wincomplete-uni-patterns]
Pattern match(es) are non-exhaustive
In a pattern binding: Patterns not matched: _
I am no expert on PatternSynonyms
, but from the looks of it, in case of polymorphic patterns we need to specify exact types that make them complete.
In the case of Only
this would be:
{-# COMPLETE Single :: Only #-}
For the sake of example let's add another instance to Single
:
instance Single Identity where
wrap = Identity
unwrap (Identity a) = a
pattern Single :: Single t => a -> t a
pattern Single a <- (unwrap -> a) where
Single a = wrap a
{-# COMPLETE Single :: Only #-}
{-# COMPLETE Single :: Identity #-}
Which makes GHC to stop complaining:
λ> Single a = wrap 1 :: Identity Int
λ> Single a = wrap 1 :: Only Int
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With