我正在通过20 个中级 Haskell 练习目前,这是一个非常有趣的练习。它涉及实现类型类的各种实例Functor
and Monad
(以及需要的函数Functor
s and Monad
s 作为参数)但是有可爱的名字,比如Furry
and Misty
掩饰我们正在做的事情(产生一些有趣的代码)。
我一直在尝试以无点风格来做其中的一些事情,我想知道是否有一个通用方案可以将有点(?)定义转变为无点定义。例如,这里是类型类Misty
:
class Misty m where
unicorn :: a -> m a
banana :: (a -> m b) -> m a -> m b
(功能unicorn
and banana
are return
and >>=
,以防不明显)这是我的实现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
Now, banana1
(相当于liftM
or fmap
)我能够通过一个合适的定义以 pointfree 风格实现appleTurnover
。但对于其他三个函数,我必须使用参数。
我的问题是:有没有办法将这样的定义转变为无点定义?