我正在寻找一个类似于此的函数:
withSelf :: (a -> b) -> a -> (a, b)
withSelf f x = (x, f x)
我和Hoogle一起搜索过这样的功能;我搜索了(a -> b) -> a -> (a, b)
和a -> (a -> b) -> (a, b)
,但两者都没有定论。 Hackage page on Data.Tuple
并没有我想要的东西。
我知道写作很简单,但我想在可能的情况下编写惯用的Haskell,并避免重新发明轮子。
答案 0 :(得分:7)
(id &&&)
部分符合您的要求:
> import Control.Arrow
> :t (id &&&)
(id &&&) :: (a -> c') -> a -> (a, c')
> (id &&&) succ 4
(4,5)
答案 1 :(得分:7)
如果您不想使用Control.Arrow
,可以随时使用Applicative
:
withSelf f = (,) <$> id <*> f
许多人可能会立即明白这一点,但对于这么简单的事情,它很愚蠢。
正如在comment中指出的那样,这可以简单地写成
withSelf = ((,) <*>)
一开始我很惊讶,但实际上非常简单:对于(->) r
,fmap = (.)
,所以<$> id
完全是多余的!