为多态模式同义词编写COMPLETE编译指示吗?

kak*_*n61 7 haskell ghc pattern-synonyms

我有以下代码,但我不知道应该输入什么??。还是多态模式无法完成?

{-# 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 :: ?? #-}
Run Code Online (Sandbox Code Playgroud)

GHC文件说,当所有conlikes是多态的时,您必须键入conlike。

进行时?? (),编译成功。但是什么()意思呢?GHC表示使用仍然不尽全力。

{-# 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 :: ?? #-}
Run Code Online (Sandbox Code Playgroud)
{-# 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
Run Code Online (Sandbox Code Playgroud)
  • GHC 8.6.5

leh*_*ins 5

我不是 的专家PatternSynonyms,但从它的外观来看,在多态模式的情况下,我们需要指定使它们完整的确切类型。

在这种情况下Only将是:

{-# COMPLETE Single :: Only #-}
Run Code Online (Sandbox Code Playgroud)

为了举例,让我们添加另一个实例到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 #-}
Run Code Online (Sandbox Code Playgroud)

这让 GHC 停止抱怨:

?> Single a = wrap 1 :: Identity Int
?> Single a = wrap 1 :: Only Int
Run Code Online (Sandbox Code Playgroud)