8

我有以下代码,我不知道应该在??. 还是多态模式不能完成?

{-# 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 文件说,当所有的 conlikes 都是多态的时,你必须输入 conlike。

make 时?? (),编译成功。但这是什么()意思?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
4

1 回答 1

5

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

在这种情况下Only将是:

{-# COMPLETE Single :: Only #-}

为了举例,让我们添加另一个实例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 #-}

这让 GHC 不再抱怨:

λ> Single a = wrap 1 :: Identity Int
λ> Single a = wrap 1 :: Only Int
于 2019-07-01T12:32:30.687 回答