是否可以规范化Haskell中包含自由类型变量的类型?

是否可以规范化Haskell中包含自由类型变量的类型?,haskell,type-families,type-level-computation,Haskell,Type Families,Type Level Computation,我的目标类似于:我想规范化GHCi中的类型。但该类型包含自由类型变量。例如,类型 StM (ExceptT e m) a 应该正常化到 StM m (Either e a) 但是当我输入时!k StM(除了e m)a进入GHCi,它抱怨那些自由类型变量。在Haskell还有其他的方法吗 > import Control.Monad.Except > :set -XTypeFamilies -XUndecidableInstances > type family StM f

我的目标类似于:我想规范化GHCi中的类型。但该类型包含自由类型变量。例如,类型

StM (ExceptT e m) a 
应该正常化到

StM m (Either e a)
但是当我输入
时!k StM(除了e m)a
进入GHCi,它抱怨那些自由类型变量。在Haskell还有其他的方法吗

> import Control.Monad.Except
> :set -XTypeFamilies -XUndecidableInstances
> type family StM f a where StM (ExceptT e m) a = StM m (Either e a)
您可以使用分部类型
,不幸的是,它被打印为
GHC.types。任何

> :set -XPartialTypeSignatures -Wno-partial-type-signatures
> :kind! StM (ExceptT _ _) _
StM (ExceptT _ _) _ :: *
= StM Any (Either Any Any)
但如果你找到具体的类型,它也会起作用

> :kind! StM (ExceptT String []) Int
StM (ExceptT String []) Int :: *
= StM [] (Either [Char] Int)
或者你可以明确地量化

> :set -XRankNTypes
> :kind! forall m e a. StM (ExceptT e m) a
forall m e a. StM (ExceptT e m) a :: *
= StM m (Either e a)

我认为隐式量化
:kind
将是一个很好的特性,这样您就可以编写
:kind StM(除了em)a
,并为您插入孔。

您不能使用类型变量,但您可以定义自己的自定义具体类型
数据ma
数据e
数据a
,并使用它们。