Как заявлено в документации , <$!>
- это строгая версия <$>
, но на удивление
<$!> :: Monad m => (a -> b) -> m a -> m b
f <$!> m = do
x <- m
let z = f x
z `seq` return z
вместо более естественной ( на мой взгляд; потому что он сохраняет более слабое ограничение и имитирует $!
)
<$!> :: Functor f => (a -> b) -> f a -> f b
f <$!> x = x `seq` (f <$> x)
Я предполагаю, что применение seq
после привязки отличается от «естественного» подхода, но я не знаю, как это другое. Мой вопрос: есть ли причина, по которой "естественный" подход становится бесполезным, и почему реализация ограничена Monad
?