Haskell 前奏曲中是否有函数将值与应用于函数的值配对?

Haskell 前奏曲中是否有函数将值与应用于函数的值配对?,haskell,haskell-prelude,Haskell,Haskell Prelude,我正在搜索一个类似以下内容的函数: withSelf::(a->b)->a->(a,b) 带自f x=(x,f x) 我一直在胡说八道地寻找这样一个功能;我寻找了一个答案,但没有一个是决定性的。我要找的东西也没有 我知道写起来很琐碎,但我希望尽可能地编写惯用的Haskell,并避免重复发明轮子。部分(id&&&&&)满足您的要求: > import Control.Arrow > :t (id &&&) (id &&&) :: (a

我正在搜索一个类似以下内容的函数:

withSelf::(a->b)->a->(a,b)
带自f x=(x,f x)

我一直在胡说八道地寻找这样一个功能;我寻找了一个答案,但没有一个是决定性的。我要找的东西也没有

我知道写起来很琐碎,但我希望尽可能地编写惯用的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
使用self f=(,)id f
很多人可能会立即明白这一点,但对于如此简单的事情来说,这是相当愚蠢的

编辑 正如a中所指出的,这可以写得更简短

withSelf = ((,) <*>)
withSelf=(,))

这让我一开始很惊讶,但实际上很简单:对于
(>)r
fmap=()
,所以
id
是完全冗余的

Hayoo会发现一些:但我怀疑这些函数是否比重新定义它更惯用(如果你必须为此获取那些lib的话)。在Haskell这样的语言中,像这样的多态函数的一个好处是,定义类型为
(a->b)->a->(a,b)
的函数基本上只有一种方法。所以在某种意义上,你不必担心像这样重新发明轮子;类型系统强制您的轮子与其他人的一样好!;)当我读到这个问题时,我知道答案将在
Control.Arrow
中,但我永远也记不起其中的不同函数是做什么的。我喜欢这个答案——尽管我希望我永远不会在真正的代码中看到类似的东西;)(对于外行(noob)来说(像我一样)
\fa->(a,fa)
更容易阅读)@dfeuer我想你是对的-大问题是:这是件好事吗?-但我想这不是进行此类讨论的合适场所,你也已经得到了我的支持——祝你愉快day@CarstenK事实上,我认为我更可能在实际代码中使用普通版本。从“无点”到“无点”的步骤可能非常短。多亏了,我对Haskell及其控制结构还比较陌生,所以我现在来看看
control.Arrow
。与明显的定义相比,这简直是太复杂了。:)它只是
withSelf=(,)
ap(,)
更短:)