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,并避免重新发明轮子.
该部分(id &&&)做你想要的:
> import Control.Arrow
> :t (id &&&)
(id &&&) :: (a -> c') -> a -> (a, c')
> (id &&&) succ 4
(4,5)
Run Code Online (Sandbox Code Playgroud)
如果您不想使用Control.Arrow,您可以随时使用Applicative:
withSelf f = (,) <$> id <*> f
Run Code Online (Sandbox Code Playgroud)
许多人可能会立即理解这一点,但对于这么简单的事情,这很愚蠢.
正如评论中指出的那样,这可以写得更简单
withSelf = ((,) <*>)
Run Code Online (Sandbox Code Playgroud)
起初这让我很惊讶,但实际上非常简单:因为(->) r,fmap = (.)这<$> id完全是多余的!
| 归档时间: |
|
| 查看次数: |
108 次 |
| 最近记录: |