Prelude 中是否有一个函数可以将值与应用于函数的值配对?
Is there a function in Prelude to pair a value with that value applied to a function?
我正在搜索一个类似于此的函数:
withSelf :: (a -> b) -> a -> (a, b)
withSelf f x = (x, f x)
我用Hoogle搜索过这样的功能;我搜索 (a -> b) -> a -> (a, b)
and a -> (a -> b) -> (a, b)
, neither of which were conclusive. The Hackage page on 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
完全是多余的!
我正在搜索一个类似于此的函数:
withSelf :: (a -> b) -> a -> (a, b)
withSelf f x = (x, f x)
我用Hoogle搜索过这样的功能;我搜索 (a -> b) -> a -> (a, b)
and a -> (a -> b) -> (a, b)
, neither of which were conclusive. The Hackage page on 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
完全是多余的!