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)
我不是 的专家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)