如何制作(反向。(:))有效吗?

时间:2014-04-27 10:47:39

标签: haskell

我想说:

liftM2 (reverse . (:)) ma mb

maMonad IntegermbMonad [Integer]的位置。显然上面不起作用。有没有办法使它比:

更漂亮
a <- ma  
liftM (reverse . (a:)) mb

3 个答案:

答案 0 :(得分:8)

我不喜欢(。)切片,它让我的大脑流血。

reverse <$> ((:) <$> ma <*> mb)

或者更清楚

reverse <$> liftA2 (:) ma mb

或者更详细,但有明确的分数

(\x xs -> reverse (x:xs)) <$> ma <*> mb

答案 1 :(得分:6)

以下是撰写reverse(:)的方式:

(reverse .) . (:)

您可以手动推断其类型以确定其工作原理。

所以这应该有用

liftM2 ((reverse .) . (:))

示例:

> liftM2 ((reverse .) . (:)) (return 1) (return [2,3])
[3,2,1]

如何轻松找到它?

使用工具,例如pointfree

$ pointfree '(\h rs -> reverse $ h:rs)'
(reverse .) . (:)

答案 2 :(得分:0)

reverse . (:)没有进行类型检查。

尝试:

g ma mas = reverse <$> ((:) <$> ma <*> mas)