Prelude中是否有一个函数将值与应用于函数的值配对?

时间:2015-03-29 17:15:05

标签: haskell haskell-prelude

我正在寻找一个类似于此的函数:

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,并避免重新发明轮子。

2 个答案:

答案 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 = ((,) <*>)

一开始我很惊讶,但实际上非常简单:对于(->) rfmap = (.),所以<$> id完全是多余的!