6

我正在寻找一个看起来与此类似的函数:

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

4

2 回答 2

7

该部分(id &&&)执行您想要的操作:

> import Control.Arrow
> :t (id &&&)
(id &&&) :: (a -> c') -> a -> (a, c')
> (id &&&) succ 4
(4,5)
于 2015-03-29T17:30:33.233 回答
7

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

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

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

编辑

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

withSelf = ((,) <*>)

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

于 2015-03-29T17:45:55.987 回答