Какова общая схема написания функции в бесточечном стиле?

В настоящий момент я работаю над 20 промежуточными упражнениями на Haskell , что является довольно забавным упражнением. Оно включает реализацию различных экземпляры классов типов Functor и Monad (и функции, которые принимают Functor s и Monad s в качестве аргументов), но с красивыми именами, такими как Фурри и Мисти , чтобы замаскировать то, что мы делаем (создает интересный код).

Я пытался сделать кое-что из этого в бессмысленном стиле, и Мне было интересно, есть ли общая схема для превращения определения с точками (?) В определение без точек. Например, вот класс типов для Misty :

class Misty m where
  unicorn :: a -> m a
  banana :: (a -> m b) -> m a -> m b

(функции unicorn и банан - это 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 ) я смог реализовать в безточечном стиле с помощью подходящего определение оборота яблок .Но с тремя другими функциями мне пришлось использовать параметры.

Мой вопрос: есть ли рецепт для превращения таких определений в определения без точек ?

8
задан Will Ness 11 August 2013 в 17:23
поделиться