使用更高的类型变量导出

Swi*_*ake 5 haskell ghc type-kinds

假设我有一个多态类型,其中一个参数是一个更高级的类型(* -> *).

data Tricky m = Tricky { numbers :: m Int, genesis :: m String }
Run Code Online (Sandbox Code Playgroud)

是否有一种在不使用奥术和不安全语言扩展的情况下为这些类型派生实例的一般方法?

我尝试启用,StandaloneDeriving以便我可以指定上下文:

deriving instance Show (m Int) => Show (Tricky m)
Run Code Online (Sandbox Code Playgroud)

但GHC然后抱怨约束不小于实例头,并指出我的方向UndecidableInstances.

总结一下:

1.我应该简单地与这一建议一起去,或者是有没有更好的办法?

2.有没有提议让这个过程更容易?

3.是它在某种程度上执迷不悟想获得"高kinded"实例?为一些具体类型派生实例会更好(例如Vector,[].Set)

Cir*_*dec 8

1.没什么不安全的UndecidableInstances.

还有另一种定义方式Show (Tricky m),即要求m满足forall a. Show a => Show (m a).这是由类似类型捕获的

class Show1 f where
    showsPrec1 :: Show a => Int -> f a -> ShowS
Run Code Online (Sandbox Code Playgroud)

基础4.9中添加了一个更加聪明的版本Show1.它更通用,因为它可用于显示m a何时a没有Show a实例.

2.你已经找到了这样做的正确的点点滴滴.

3.不,这是正确的,为首的抽象过度甚至更高,kinded结构,如Vector,[]Set.Monad变换器具有种类(* -> *) -> (* -> *)和抽象类型(* -> *),与仿函数相同,可以生成与仿函数相同的类型.它Tricky具有类型(* -> *) -> *,它需要与仿函数相同的东西并产生普通的数据类型.我称之为"模型"的数据类型,因为它们产生了一个数据类型,它抽象了它是如何组合在一起的.