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 :: ?? #-}
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 :: ?? #-}
{-# 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
我不是 的专家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
| 归档时间: | 
 | 
| 查看次数: | 164 次 | 
| 最近记录: |