首页 > 解决方案 > 为什么 LiberalTypeSynonyms 在这种情况下没有帮助?

问题描述

{-# 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

这里的描述来看,它似乎应该首先扩展类型同义词,然后检查有效性,这对于两种类型应该是相同的。

标签: haskellghc

解决方案


Haskell 通常不允许部分应用类型同义词。因此,在您的示例中,(MyEither2 Int)可以作为类型参数传递,但MyEither2不能,即使参数需要 kind * -> *

造成这种情况的原因是深刻而多毛的,完整的解释可以在这里找到,以及为纠正这个问题所做的工作的细节。

LiberalTypeSynonyms取消了对类型同义词的一些限制,并允许将部分应用的类型同义词传递给另一个类型同义词。但是在您的示例中,部分应用的类型同义词被传递给正确的类型,这对于 GHC 来说(还)是不可能的。


推荐阅读