目前我正在完成20 个中级 Haskell 练习,这是一个非常有趣的练习。Functor它涉及实现类型类和Monad(以及将Functors 和s 作为参数的函数)的各种实例,Monad但使用可爱的名称,例如FurryandMisty来掩饰我们正在做的事情(产生一些有趣的代码)。
我一直在尝试以无点的方式来做这件事,我想知道是否有一个通用的方案可以将有点(?)定义变成无点定义。例如,这是 的类型类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)我能够通过合适的定义以无点风格实现appleTurnover. 但是对于其他三个函数,我不得不使用参数。
我的问题是:是否有将此类定义转换为无点定义的方法?