【发布时间】:2011-12-30 16:19:03
【问题描述】:
我目前正在处理20 Intermediate Haskell Exercises,这是一个非常有趣的练习。它涉及实现类型类Functor 和Monad 的各种实例(以及以Functors 和Monads 作为参数的函数),但使用Furry 和Misty 之类的可爱名称来伪装我们是什么做(产生一些有趣的代码)。
我一直在尝试以无点的方式来做一些这样的事情,我想知道是否有一个通用的方案可以将有点 (?) 定义转换为无点定义。例如,这是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 的适当定义以无点样式实现。但是对于其他三个函数,我不得不使用参数。
我的问题是:有没有办法将这些定义变成无点定义?
【问题讨论】:
标签: haskell higher-order-functions combinators pointfree