我正在寻找一个看起来与此类似的函数:
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
完全是多余的!