{-# LANGUAGE KindSignatures, LiberalTypeSynonyms #-}
module Main where
data Optionally (f :: * -> *) (w :: *) = OMain w | OWrap (f w)
type MyEither1 = Either ()
type MyEither2 x = Either () x
type Works = Optionally MyEither1 Int
type Doesnt = Optionally MyEither2 Int
将产生与LiberalTypeSynonyms
不存在时相同的错误:
The type synonym ‘MyEither2’ should have 1 argument, but has been given none
从这里的描述来看,似乎应该首先扩展类型同义词,然后检查有效性,这两种类型应该是相同的。
Haskell通常不允许部分应用类型同义词。因此,在您的示例中,(MyEither2 Int)
可以作为类型参数传递,但MyEither2
不能,即使该参数需要一种* -> *
。
造成这种情况的原因是深刻而复杂的,可以在这里找到完整的解释,以及正在进行的纠正工作的细节。
LiberalTypeSynonyms
取消了对类型同义词的一些限制,并允许将部分应用的类型同义词传递给另一个类型同义词。但在您的示例中,一个部分应用的类型同义词被传递给一个正确的类型,这在GHC中是不可能的。