应用函数并在Haskell中包含元组

per*_*i4n 3 haskell

我正在寻找一种方法来编写一个函数,该函数应用提供的函数并将参数和函数结果包装在元组中.如:

applyZip :: (a -> b) -> a -> (a,b)
applyZip f x = (x, f x)
Run Code Online (Sandbox Code Playgroud)

是否有更惯用的方法在Haskell中编写它,最好是使用库代码?

编辑:我真的对其他解决方法感兴趣.如果您发现自己遇到同样的问题,那么使用描述性名称自行实现该功能可能更为可取.

Wil*_*sem 7

您可以使用:

import Control.Monad(ap)

applyZip :: (a -> b) -> a -> (a,b)
applyZip = ap (,)
Run Code Online (Sandbox Code Playgroud)

在这里我们使用该ap :: Monad m => m (a -> b) -> m a -> m b功能.

  • 在实际代码中,我认为这是故意的混淆.:-P(+1) (5认同)
  • 读者monad中的@ peri4n`ap`是S组合子,如果有帮助的话.[这种类型的签名也可能有所帮助:](https://hackage.haskell.org/package/data-aviary-0.4.0/docs/src/Data-Aviary-Functional.html#line-147)`ap ::(r - > a - > b) - >(r - > a) - >(r - > b)`(你应该能够自己实现这种类型而不需要太多考虑"匹配类型") . (2认同)
  • 没有进口的等价物(在GHC 8中):`applyZip =((,)<*>)` (2认同)