Я работаю через 20 Intermediate Haskell Exercises на данный момент, что довольно весело. Он включает в себя реализацию различных экземпляров типов Functor
и Monad
(и функции, которые принимают Functor
s и Monad
s в качестве аргументов), но с такими милыми именами, как Furry
и Misty
, чтобы скрыть то, что мы делаем (делает для какого-то интересного кода).Какова общая схема написания функции в стиле без ограничений?
Я пытался сделать что-то из этого в бесшумном стиле, и я подумал, есть ли общая схема для превращения точечного (?) Определения в беспроблемное определение. Например, вот это класс типов для Misty
:
class Misty m where
unicorn :: a -> m a
banana :: (a -> m b) -> m a -> m b
(функции unicorn
и banana
являются return
и >>=
, в случае, если это не очевидно), а вот моя реализация apple
(эквивалент flip ap
):
apple :: (Misty m) => m a -> m (a -> b) -> m b
apple x f = banana (\g -> banana (unicorn . g) x) f
Более поздние части упражнения вы реализуете версии liftM
, liftM2
и т.д. Вот мои решения:
appleTurnover :: (Misty m) => m (a -> b) -> m a -> m b
appleTurnover = flip apple
banana1 :: (Misty m) => (a -> b) -> m a -> m b
banana1 = appleTurnover . unicorn
banana2 :: (Misty m) => (a -> b -> c) -> m a -> m b -> m c
banana2 f = appleTurnover . banana1 f
banana3 :: (Misty m) => (a -> b -> c -> d) -> m a -> m b -> m c -> m d
banana3 f x = appleTurnover . banana2 f x
banana4 :: (Misty m) => (a -> b -> c -> d -> e) -> m a -> m b -> m c -> m d -> m e
banana4 f x y = appleTurnover . banana3 f x y
Теперь banana1
(эквивалент liftM
или fmap
) я был в состоянии реализовать в стиле pointfree, подходящим определением appleTurnover
. Но с другими тремя функциями мне пришлось использовать параметры.
Мой вопрос: Есть ли рецепт для превращения определений, подобных этим, в точечные определения?
Это связано с устранением абстракции, что вы делаете превратить выражения лямбда-исчисления в комбинаторы. Вы также можете проверить автономный инструмент [pointfree] (http://hackage.haskell.org/package/pointfree) (также доступный как '@ pl' в [lambdabot] (http://www.haskell.org)./haskellwiki/Lambdabot)). – ehird
[Связанная дискуссия, которую я имел с другом на днях] (https://gist.github.com/1507246). Вам это может показаться интересным. – missingfaktor