Haskell 实例声明中部分应用的类型构造函数

Haskell 实例声明中部分应用的类型构造函数,haskell,typeclass,Haskell,Typeclass,我有一个类型构造函数 type SimpleFcn α m = m α -> m α 我想在一个类中使用它,稍后将进一步参数化它。即 instance A (SimpleFcn α) 在我的情况下,类A中的任何函数在参数m中都是参数化的 class A β where f :: Monad m => β m instance A (SimpleFcn α) where f x = x 对于这种情况,什么是合适的解决方法?不可能部分应用类型同义词,因为它们只是缩短代码的一种方法,

我有一个类型构造函数

type SimpleFcn α m = m α -> m α
我想在一个类中使用它,稍后将进一步参数化它。即

instance A (SimpleFcn α)
在我的情况下,类
A
中的任何函数在参数
m
中都是参数化的

class A β where f :: Monad m => β m
instance A (SimpleFcn α) where f x = x

对于这种情况,什么是合适的解决方法?

不可能部分应用类型同义词,因为它们只是缩短代码的一种方法,而不是真正的类型级别lambda。您可以尝试使用
newtype

您似乎忘记问实际问题,或者我只是看不到。让我们明确一点,这样的类型声明创建的是类型同义词,而不是类型构造函数。类型构造函数,如data、newtype、data family所声明的,具有种类,并且作为第一类类型级别的东西存在。类型同义词没有种类:它们不是一流的东西。当应用于他们给定的事物种类时,他们制造事物。请注意,您可以定义任何类型的类型同义词,例如type Foo=Map Int。您可以在实例(例如Functor Foo)中使用Foo,因为它应用于给定的类型同义词参数,即使Foo确实可以应用于类型。@pigworker:您应该将其作为答案。@7s定义错误:
type T x=(x,x Int)
。错误使用
类型T=Int;x::T Bool
。类型同义词有一个种类,但也有一个arity(定义中参数的数量)。它必须始终至少与定义中的参数一起使用。例如
类型l1x=[x];类型L2=[]
类似,但是
L1
总是需要一个参数,所以
实例Monad L1
是错误的,而
实例Monad L2
是可以的。@pigworker:有了GHC的自由类型同义词扩展,就更难证明这个观点了——它们仍然不是第一类实体,也不能像问题中那样使用,但是你可以部分地应用它们来做一些事情,比如仅仅用类型同义词来写教堂数字算术。如果没有别的,似乎它们一定有某种合理的种类。