Я пытался «узнать мне хэшкелл» через онлайн-книгу Lyah .
Автор описывает поведение функторов примесительного типа как своего рода возможность извлечения функции из одного функтора и отображения его на втором функторе; Это через функцию , объявленной для класса применения типа Applicative:
class (Functor f) => Applicative f where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
в качестве простого примера, то, возможно, тип, возможно, является экземпляром применения по следующей реализации:
instance Applicative Maybe where
pure = Just
Nothing <*> _ = Nothing
(Just f) <*> something = fmap f something
Пример поведения, упомянутого ранее:
ghci> Just (*2) <*> Just 10 -- evaluates to Just 20
Таким образом, оператор извлекает «экстракты» функции (* 2) с первого операнда и отображает его на втором операнда.
Теперь в примечающих типах обе операнды имеют один и тот же тип, поэтому я думал, что в качестве упражнения, почему бы не пытаться реализовать обобщению такого поведения, где два операнда являются функторами разных типов, поэтому я мог бы оценить Что-то вроде этого:
Just (2*) <*:*> [1,2,3,4] -- should evaluate to [2,4,6,8]
Так что это то, что я придумал:
import Control.Applicative
class (Applicative f, Functor g) => DApplicative f g where
pure1 :: a -> f a
pure1 = pure
(<*:*>) :: f ( a -> b ) -> g a -> g b -- referred below as (1)
instance DApplicative Maybe [] where -- an "instance pair" of this class
(Just func) <*:*> g = fmap func g
main = do putStrLn(show x)
where x = Just (2*) <*:*> [1,2,3,4] -- it works, x equals [2,4,6,8]
Теперь, хотя вышеуказанные работы, мне интересно, если мы можем сделать лучше; Можно ли дать реализацию по умолчанию для , которые могут быть применены к различным парам F & G, в декларации для самого сомнительного F G? И это приводит меня к следующему вопросу: есть ли способ шаблона совпадения на конструкторах по разным типам данных?
Я надеюсь, что мои вопросы имеют некоторое смысл, и я не просто извергаю ерунду (если я, пожалуйста, не будь слишком резким; я просто FP, новичок в пути мимо его снабжения ...)