Pytanie. Czy istnieje sposób, aby ten kod działał bez jawnego podpisu typu?Wnioskowanie o ocenę typu GHC
Kod. Najpierw mam w praktyce znacznie ładniejszą alternatywną klasę MonadTrans
, zainspirowaną przez Data.Newtype
. Wygląda na to,
{-# LANGUAGE FlexibleContexts, TypeFamilies #-}
module Alt.Control.Monad.Trans where
import Control.Monad
class (Monad , Monad (BaseMonad)) => MonadTrans (:: * -> *) where
type BaseMonad :: * -> *
lift :: (BaseMonad) α -> α
Następnie mam klasy A
metodą foo
, a jeśli niektóre monada baza M
jest A
, wtedy każda monada T M
przekształcona jest również A
. W kodzie,
class A where
foo :: String -> ()
instance (A (BaseMonad), MonadTrans) => A where
foo n = lift $ foo n
Jednak jeśli teraz chcesz utworzyć skrót do foo
z pierwszym argumentem podstawiona, to muszę mieć wyraźny typ podpisu lub przepełnienia stosu kontekst kompilator za.
minimize_call :: A => ()
minimize_call = foo "minimize"
Możliwa informacji, aby pomóc wnioskowanie. Załóżmy, że mamy powiązany typ: B :: * -> *
. Myślę, że chcę powiedzieć kompilatorowi: B
spełnia B t /= t
, B (B t) /= B t
, czyli np. B
jest w jakiś sposób "monotonny" - że gonienie powiązanych typów jest równoznaczne z usuwaniem owijki nowego typu, i powinno wiedzieć, że nie może na zawsze usunąć owijki nowego typu , dlatego konieczne jest dodanie do podpisu A
.
Przepraszam, powinienem był zadać sobie trud zapamiętania _why_ przerzuciłem się na alternatywny 'MonadTrans' ... na razie, powiedzmy, że produkuje czystszy kod, ale myślę, że był bardziej istotny powód. – gatoatigrado
Interesujące pytanie. Dlaczego nie chcesz jednak podpisu typu jawnego? Czy "minimize_call" nie musi być stałą wartością, a nie stałą polimorficzną (czy może można ją uznać za polimorficzną, nie jestem pewna)? Jeśli ma jakiś pojedynczy stały typ, wolałbym to dokumentować, a jeśli nie, wolałbym dokumentować ** to **. Zmuszenie czytelnika do wykonania w głowie analizy całego programu, aby dowiedzieć się, jaki typ 'minimize_call' wydaje się trochę nieproduktywny. – Ben
@Ben, To prawda, że w tym przypadku posiadanie podpisu typu dla 'minimize_call' jest dobrą praktyką.Jednak sugerowana propozycja typu sugeruje, że coś idzie źle (z projektem, kompilatorem lub komunikacją z kompilatorem) i prawdopodobnie spowoduje problemy, nie wspominając o niezrozumiałych komunikatach o błędach. – gatoatigrado