【问题标题】:Is there a function in Prelude to pair a value with that value applied to a function?Prelude 中是否有一个函数可以将值与应用于函数的值配对?
【发布时间】:2015-03-29 17:15:04
【问题描述】:

我正在寻找一个类似这样的函数:

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

我已经用 Hoogle 搜索过这样的功能;我搜索了(a -> b) -> a -> (a, b)a -> (a -> b) -> (a, b),这两个都不是结论性的。 Hackage page on Data.Tuple 也没有我要找的东西。

我知道写起来很简单,但我想尽可能地编写惯用的 Haskell,并避免重新发明轮子。

【问题讨论】:

  • Hayoo 会找到一些:hayoo.fh-wedel.de/?query=%28a+-%3E+b%29+-%3E+a+-%3E+%28a%2Cb%29 但我怀疑这些比重新定义它更符合地道(如果您必须为此获取这些库)而不是快速轻松地重新定义它
  • 在像 Haskell 这样的语言中,像这样的多态函数的一个好处是,基本上只有一种方法可以定义类型为 (a -> b) -> a -> (a, b) 的函数。所以从某种意义上说,你不必担心像这样重新发明轮子;类型系统强制你的轮子和其他人的一样好! ;)

标签: haskell haskell-prelude


【解决方案1】:

(id &&&) 部分做你想做的事:

> import Control.Arrow
> :t (id &&&)
(id &&&) :: (a -> c') -> a -> (a, c')
> (id &&&) succ 4
(4,5)

【讨论】:

  • 我在阅读问题时就知道答案将在 Control.Arrow 中,但我永远记不得其中的不同功能有什么作用。
  • 我喜欢这个答案 - 尽管我希望我永远不会在 real 代码中看到这样的东西 ;) (对于初学者(菜鸟)eye (和我的一样)\f a -> (a, f a) 更容易阅读)
  • @dfeuer 好吧,我想你是对的 - 最大的问题是:这是一件好事吗? - 但我想这不是进行此类讨论的合适场所,而且你也已经得到了我的支持 - 祝你有美好的一天
  • @CarstenKönig 确实,我认为我更有可能在实际代码中使用纯版本。从无点到无点的步骤可能很短。
  • 谢谢,我对 Haskell 及其控制结构还比较陌生,所以我现在来看看 Control.Arrow
【解决方案2】:

如果你不想使用Control.Arrow,你可以随时使用Applicative

withSelf f = (,) <$> id <*> f

很多人可能马上就会明白这一点,但是对于这么简单的事情来说,这很愚蠢。

编辑

正如comment 中指出的那样,这可以更简单地写成

withSelf = ((,) <*>)

起初这让我很吃惊,但其实很简单:对于(-&gt;) rfmap = (.),所以&lt;$&gt; id 完全是多余的!

【讨论】:

  • 与显而易见的定义相比,这是非常复杂的。 :)
  • 就是withSelf = ((,) &lt;*&gt;)
  • ap (,) 更短:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-26
  • 1970-01-01
  • 1970-01-01
  • 2021-05-10
  • 2018-02-05
  • 1970-01-01
相关资源
最近更新 更多