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

Is there a function in Prelude to pair a value with that value applied to a function?

我正在搜索一个类似于此的函数:

withSelf :: (a -> b) -> a -> (a, b) withSelf f x = (x, f x)

我用Hoogle搜索过这样的功能;我搜索 (a -> b) -> a -> (a, b) and a -> (a -> b) -> (a, b), neither of which were conclusive. The Hackage page on Data.Tuple 也没有我要找的东西。

我知道写起来很简单,但我想尽可能写出地道的Haskell,避免重复发明轮子。

(id &&&) 部分可满足您的要求:

> import Control.Arrow
> :t (id &&&)
(id &&&) :: (a -> c') -> a -> (a, c')
> (id &&&) succ 4
(4,5)

如果您不想使用 Control.Arrow,您可以随时使用 Applicative:

withSelf f = (,) <$> id <*> f

许多人可能会立即真正理解这一点,但对于如此简单的事情来说,它是相当愚蠢的。

编辑

正如中所指出的,这可以更简单地写成

withSelf = ((,) <*>)

起初这让我很吃惊,但实际上很简单:对于(->) rfmap = (.),所以<$> id完全是多余的!