Простое обобщение типового класса применимого (функтора); Шаблон, сопоставив на конструкторов

Я пытался «узнать мне хэшкелл» через онлайн-книгу 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, новичок в пути мимо его снабжения ...)

6
задан Aky 10 September 2011 в 05:11
поделиться