Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
{-# LANGUAGE RankNTypes #-}
both :: (Num a, Num b) => (forall c. Num c => c -> c) -> (a, b) -> (a, b)
both f (a, b) = (f a, f b)
> both inc (2, 3.0)
(3, 4.0)
class Bifunctor p where
-- | Map over both arguments at the same time.
bimap :: (a -> b) -> (c -> d) -> p a c -> p b d
bimap f g = first f . second g
-- | Map covariantly over the first argument.
first :: (a -> b) -> p a c -> p b c
first f = bimap f id
-- | Map covariantly over the second argument.
second :: (b -> c) -> p a b -> p a c
second = bimap id
instance Bifunctor (,) where
bimap f g ~(a, b) = (f a, g b)
наверняка требуют RankNTypes расширения. Включите его.
Самым простым, будет создать функцию
both, то мне придется придумать, как реализовать вызов видаboth inc [1, 2, 3, 4, 5]
То, что вы пытаетесь определить как Функтор2 почти наверняка является БиФунктором.
2) Подобные формулировки inc (x1, x2) = (inc x1, inc x2), наверняка требуют RankNTypes расширения. Включите его.
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverlappingInstances #-}
instance Incable Int where
inc = (1+)
newtype Tup a = Tup {unTup :: a}
instance (Incable t1, Incable t2) => Incable (Tup (t1, t2)) where
inc (Tup (x1, x2)) = Tup (inc x1, inc x2)
instance (Incable t1, Incable t2, Incable t3) => Incable (Tup (t1, t2, t3)) where
inc (Tup (x1, x2, x3)) = Tup (inc x1, inc x2, inc x3)
> unTup $ inc $ Tup (2, 3.0)
(3,4.0)
> unTup $ inc $ Tup (2, 3.0, 8.0)
(3,4.0,9.0)
В случае паранойи можно было бы предусмотреть расширение, которое отключающает проверку перекрытия экземпляров в некоторых случаях.
Да, именованные экземпляры были бы неплохим решением. Интересно, что мешает их реализовать?
Принято считать, что функтор — это всегда тип, у которого есть только один параметр.
Map a b:instance Functor (Map k) where
-- функция применяется к значениям, а ключи не затрагиваются
Cell Int Int a можно ожидать, что функция не затронет координаты ячейки, а коснется только содержимого. И это только вполне очевидные примеры.instance Functor ((,,) t1 t2) where
fmap f (x1, x2, x3) = (x1, x2, f x3)fmap (+1) (True, "string", 2) == (True + 1, "string" + 1, 2 + 1)
Проблемы, вызванные определением кортежей как функторов