为什么自由类型同义词在这种情况下没有帮助?


{-# 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中是不可能的。

相关内容

  • 没有找到相关文章

最新更新