我正在寻找一个看起来与此类似的函数:
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,并避免重新发明轮子。
我正在寻找一个看起来与此类似的函数:
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)
如果您不想使用Control.Arrow,您可以随时使用Applicative:
withSelf f = (,) <$> id <*> f
很多人可能会立即理解这一点,但是对于如此简单的事情来说,这很愚蠢。
正如评论中所指出的,这可以更简单地写成
withSelf = ((,) <*>)
起初这让我很吃惊,但实际上非常简单:因为(->) r, fmap = (.), 所以<$> id完全是多余的!