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