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(,)
更短:)