Вопрос .Есть ли способ заставить этот код работать без явной подписи типа?
Код .Во-первых, у меня есть практический, более приятный альтернативный класс 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
с методом foo
, и если какая-то базовая монада M
является A
, то любая преобразованная монада T M
также 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
и т. Д. Т.е.знать, что он не может навсегда удалить оболочки нового типа, поэтому необходимо добавить контекст A
к подписи.