我想说:
liftM2 (reverse . (:)) ma mb
ma
为Monad Integer
且mb
为Monad [Integer]
的位置。显然上面不起作用。有没有办法使它比:更漂亮
a <- ma
liftM (reverse . (a:)) mb
答案 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)