Niepełny podpis typu
Powiedzmy, że mamy funkcję f poniżej, która zwraca monadę. Jednak gdzie widziszInt
, udawaj, że to naprawdę skomplikowany typ.
f :: (Monad m) => m Int -- Pretend this isn't Int but something complicated
f = return 42
Teraz powiedzmy, że chcemy wprowadzić to w życieMaybe
monad. Nie musimy pisać pełnego typuf
aby to zrobić, możemy po prostu wykonać następujące czynności:
g :: Maybe a -> Maybe a
g = id
main = print $ (g f)
Funkcja fikcyjnag
siłyf
zostaćMaybe
.
Myślę, że powyższe jest dość niechlujne. To, co wolałbym napisać, to:
main = print $ (f :: Maybe a)
Ale nie powiedzie się z następującym błędem:
Couldn't match expected type `a' against inferred type `Int'
`a' is a rigid type variable bound by
the polymorphic type `forall a. Maybe a' at prog.hs:7:16
Expected type: Maybe a
Inferred type: Maybe Int
In the second argument of `($)', namely `(f :: Maybe a)'
In the expression: print $ (f :: Maybe a)
Czy istnieje sposób, aby zrobić cog
powyżej robi to w mniej brudny sposób, który nie wymaga tworzenia nowej funkcji? Nie chcę pisaćf :: Maybe Int
, ponieważ staje się to problemem konserwacyjnym, jeśli zmieni się typ powrotu. Rozszerzenia GHC są w porządku w odpowiedziach.