haskell - 应用程序:<$> vs. pure 和 <*>
问题描述
在尝试了一段时间的示例之后,对我来说,在处理 Control.Applicative 类型类时,它看起来myFunction <$>
和等价。pure myFunction <*>
例子:
(++) <$> Just "foo" <*> Just "bar"
pure (++) <*> Just "foo" <*> Just "bar"
两者都产生Just "foobar"
。
这些确实是等效的还是我忽略了一个边缘情况?我应该更喜欢哪个变体/更常见?虽然pure
方法更长,但对我来说,它对 Control.Applicative 类型类看起来更通用和真实。
解决方案
这需要是等价的。事实上,在Applicative
typeclass的文档中,我们读到:
作为这些定律的结果,
Functor
例子 forf
将满足fmap f x = pure f <*> x
由于(<$>) :: Functor f => (a -> b) -> f a -> f b
是:
的中缀同义词
fmap
。
因此,它认为:
f <$> x = pure f <*> x
因此,两者可用于实现相同的目的。然而,由于f <$> x
它更短,并且可能更快(因为(<*>)
需要处理所有f a
s),因此可能建议使用(<$>)
)。此外,正如@chepner 所说,默认实现liftA2
是liftA2 f x = (<*>) (fmap f x)
,所以它也使用fmap
(so <$>
)。
推荐阅读
- python-3.x - Jupyter Notebook 中缺少模块导入时出错
- c++ - 如何创建 setup.exe (windows) 或 package (linux)
- javascript - 无法读取 null 的属性“hasRole”
- android - 单击后未删除Android过滤列表项
- swift - 如何在新控制器的tableView中打开数据,来自FIrebase的数据
- c - 在 Linux 机器上运行 C 代码时出现分段错误(核心转储)
- python - 如何让 python 中的全局变量在列表中工作?
- sql - 选择 TableData,其中 ColumnData 以字符串列表开头
- php - 如何使用 Laravel Blade 模板渲染以下类型的表格?
- wordpress - 如何检查 WooCommerce 感谢页面