У меня есть следующий код, и я не знаю, что должно передаваться в ??
. Или полиморфные паттерны не могут сделать полноценными?
{-# 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 говорится, что когда все совпадения полиморфны вы должны ввести conlike.
При выполнении ??
()
компиляция проходит успешно. Но что означает ()
? И GHC говорит, что все еще не исчерпывающий по использованию.
{-# 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: _
- GHC 8.6.5
{-# COMPLETE Single :: () #-}
— вы пробовали это? - person Jon Purdy   schedule 30.06.2019