编写 haskell 类型 pointfree (或其他编写类型级函数的方法)?

trp*_*pnd 0 haskell ghc

是否有组合器可以以 pointfree 风格编写 Haskell 类型?

我有一个类似的类型同义词:

type FooT m a = StateT State (ReaderT (Params m) m)
Run Code Online (Sandbox Code Playgroud)

我希望能够以 pointfree 风格编写它的右侧,以便实例化一个需要参数为 monad 转换器的类型类。即,有一些类型类,例如:

class (MonadTrans t, Bar (t Monad)) => Baz t where -- where Bar is some other typeclass
 ...
Run Code Online (Sandbox Code Playgroud)

我想用我的变压器堆栈实例化它。但是,我需要向它提供某种类型的东西(* -> *) -> * -> *,这意味着我需要编写一个类型级函数,以便将我的StateT State (ReaderT ...)转换器作为参数传递给类型类。

我尝试使用类型系列,但似乎它们需要完全应用。

Li-*_*Xia 5

您必须使用newtype. 类型同义词必须被完全应用,因此它们实际上并没有为您提供重新排列类型表达式以适应某些类型的方法。

最简单的就是变成FooT一个新类型:

newtype FooT m a = FooT (StateT State (ReaderT (Params m) m) a)
Run Code Online (Sandbox Code Playgroud)

开发一种组合器风格是可能的,但每个组合器都必须是一个,newtype所以打开包装有点痛苦。

{-# LANGUAGE PolyKinds, TypeOperators #-}
newtype (:.:) f g a = (:.:) (f (g a))
newtype Join f a = Join (f a a)

type FooT = StateT State :.: Join (ReaderT :.: Params)
-- Good luck untangling that.
Run Code Online (Sandbox Code Playgroud)