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

Tom*_*vin 6 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页面上Data.Tuple没有什么我找的那么多.

我知道编写它是微不足道的,但我想在可能的情况下编写惯用的Haskell,并避免重新发明轮子.

chi*_*chi 7

该部分(id &&&)做你想要的:

> import Control.Arrow
> :t (id &&&)
(id &&&) :: (a -> c') -> a -> (a, c')
> (id &&&) succ 4
(4,5)
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个答案 - 虽然我希望我永远不会在*真正的*代码中看到这样的东西;)(对于不熟悉的(noob)*眼睛*(就像我的)`\ fa - >(a,fa)`更容易阅读) (4认同)
  • 当我读到问题时,我知道答案将出现在"Control.Arrow"中,但我永远不会记得那里的不同功能. (2认同)

dfe*_*uer 7

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

withSelf f = (,) <$> id <*> f
Run Code Online (Sandbox Code Playgroud)

许多人可能会立即理解这一点,但对于这么简单的事情,这很愚蠢.

编辑

正如评论中指出的那样,这可以写得更简单

withSelf = ((,) <*>)
Run Code Online (Sandbox Code Playgroud)

起初这让我很惊讶,但实际上非常简单:因为(->) r,fmap = (.)<$> id完全是多余的!

  • 与明显的定义相比,这是非常复杂的.:) (3认同)