模式同义词无法统一类型级列表中的类型
Pattern synonym can't unify types within type-level list
尝试定义基于模式同义词时出现错误
在具有类型级列表的 GADT 上。
我设法将其归结为这个例子:
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE PatternSynonyms #-}
module Example where
data L (as :: [*]) where
L :: a -> L '[a]
pattern LUnit = L ()
给我:
Example.hs:11:17:
Couldn't match type ‘a’ with ‘()’
‘a’ is a rigid type variable bound by
the type signature for Example.$bLUnit :: (t ~ '[a]) => L t
at Example.hs:11:17
Expected type: L t
Actual type: L '[()]
In the expression: L ()
In an equation for ‘$bLUnit’: $bLUnit = L ()
Example.hs:11:19:
Could not deduce (a ~ ())
from the context (t ~ '[a])
bound by a pattern with constructor
L :: forall a. a -> L '[a],
in a pattern synonym declaration
at Example.hs:11:17-20
‘a’ is a rigid type variable bound by
a pattern with constructor
L :: forall a. a -> L '[a],
in a pattern synonym declaration
at Example.hs:11:17
In the pattern: ()
In the pattern: L ()
这是一个错误,还是我做错了什么?
感谢 and this ticket,我能够通过向模式定义添加类型签名来编译我的示例代码:
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE PatternSynonyms #-}
module Example where
data L (as :: [*]) where
L :: a -> L '[a]
pattern LUnit :: L '[()]
pattern LUnit = L ()
这也很好地概括为多态模式
data F (fs :: [* -> *]) a where
F :: f a -> F '[f] a
pattern FId :: a -> F '[Identity] a
pattern FId a = F (Identity a)
尝试定义基于模式同义词时出现错误 在具有类型级列表的 GADT 上。
我设法将其归结为这个例子:
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE PatternSynonyms #-}
module Example where
data L (as :: [*]) where
L :: a -> L '[a]
pattern LUnit = L ()
给我:
Example.hs:11:17:
Couldn't match type ‘a’ with ‘()’
‘a’ is a rigid type variable bound by
the type signature for Example.$bLUnit :: (t ~ '[a]) => L t
at Example.hs:11:17
Expected type: L t
Actual type: L '[()]
In the expression: L ()
In an equation for ‘$bLUnit’: $bLUnit = L ()
Example.hs:11:19:
Could not deduce (a ~ ())
from the context (t ~ '[a])
bound by a pattern with constructor
L :: forall a. a -> L '[a],
in a pattern synonym declaration
at Example.hs:11:17-20
‘a’ is a rigid type variable bound by
a pattern with constructor
L :: forall a. a -> L '[a],
in a pattern synonym declaration
at Example.hs:11:17
In the pattern: ()
In the pattern: L ()
这是一个错误,还是我做错了什么?
感谢
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE PatternSynonyms #-}
module Example where
data L (as :: [*]) where
L :: a -> L '[a]
pattern LUnit :: L '[()]
pattern LUnit = L ()
这也很好地概括为多态模式
data F (fs :: [* -> *]) a where
F :: f a -> F '[f] a
pattern FId :: a -> F '[Identity] a
pattern FId a = F (Identity a)