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