问题。有没有办法让这段代码在没有显式类型签名的情况下工作?
代码。首先,我有一个实践中更好的替代MonadTrans
课程,灵感来自Data.Newtype
. 看起来像这样,
{-# LANGUAGE FlexibleContexts, TypeFamilies #-}
module Alt.Control.Monad.Trans where
import Control.Monad
class (Monad , Monad (BaseMonad )) => MonadTrans ( :: * -> *) where
type BaseMonad :: * -> *
lift :: (BaseMonad ) α -> α
然后,我有一个A
带有 method的类foo
,如果某个基本 monadM
是 an A
,那么任何转换后的 monadT M
也是 an A
。在代码中,
class A where
foo :: String -> ()
instance (A (BaseMonad ), MonadTrans ) => A where
foo n = lift $ foo n
但是,如果我现在想创建一个foo
替换它的第一个参数的快捷方式,那么我需要一个显式类型签名,否则编译器的上下文堆栈会溢出。
minimize_call :: A => ()
minimize_call = foo "minimize"
有助于推断的可能信息。假设我们有一个关联的类型B :: * -> *
。我在想我想告诉编译器B
满足B t /= t
,B (B t) /= B t
等,即B
在某种程度上是“单调的”——追逐关联类型相当于删除 newtype 包装器,它应该知道它不能永远删除 newtype 包装器,因此添加签名的上下文A
是必要的。