Может ли кто-нибудь объяснить мне, какова цель класса Traversable
?
Определение типа:
class (Functor t, Foldable t) => Traversable (t :: * -> *) where
Итак, Traversable
- это Functor t
и Foldable t
.
Функция traverse
является членом Traversable
и имеет следующую подпись:
traverse :: Applicative f => (a -> f b) -> t a -> f (t b)
Почему результат должен быть завернут в аппликативный? В чем смысл этого?
У меня есть следующий пример:
module ExercisesTraversable where
import Test.QuickCheck (Arbitrary, arbitrary)
import Test.QuickCheck.Checkers (quickBatch, eq, (=-=), EqProp)
import Test.QuickCheck.Classes (traversable)
type TI = []
newtype IdentityT a = IdentityT a
deriving (Eq, Ord, Show)
instance Functor IdentityT where
fmap f (IdentityT a) = IdentityT (f a)
instance Foldable IdentityT where
foldMap f (IdentityT a) = f a
instance Traversable IdentityT where
traverse f (IdentityT a) = IdentityT <$> f a
instance Arbitrary a => Arbitrary (IdentityT a) where
arbitrary = do
a <- arbitrary
return (IdentityT a)
instance Eq a => EqProp (IdentityT a) where (=-=) = eq
main = do
let trigger = undefined :: TI (Int, Int, [Int])
quickBatch (traversable trigger)
Посмотрим на реализацию traverse
:
traverse f (IdentityT a) = IdentityT <$> f a
Тип результата приложения f a
должен быть аппликативным, почему? Достаточно ли функтора?