是否有组合子可以以无点风格编写Haskell类型?
我有一个类型同义词,类似于:
type FooT m a = StateT State (ReaderT (Params m) m)
我希望能够以无点风格编写这篇文章的右手边,以便实例化一个类型类,该类需要一个monad transformer参数。例如,有一些类型类,如:
class (MonadTrans t, Bar (t Monad)) => Baz t where -- where Bar is some other typeclass
...
我想用我的变压器堆栈来实例化它。然而,我需要为它提供某种(* -> *) -> * -> *
,这意味着我需要编写一个类型级函数,以便将我的StateT State (ReaderT ...)
转换器作为参数传递给typeclass。
我尝试过使用类型族,但似乎它们需要完全应用。
您必须使用newtype
。类型同义词必须完全应用,因此它们实际上并不能为您提供重新排列类型表达式以适应特定类型的方法。
最简单的方法是将FooT
转换为一种新类型:
newtype FooT m a = FooT (StateT State (ReaderT (Params m) m) a)
开发组合子样式是可能的,但每个组合子都必须是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.