haskell - 函数中的“上下文”是什么
问题描述
我正在尝试更熟悉 Haskell(Functor,Monad)。所以我试图理解下面的例子中发生了什么
sequence:: [f a] -> f [a]
let list = [(+2), (*6)]
let y = sequence list
(+2) 中的“f”和 y 的“值”是什么?
解决方案
的类型sequenceA
是:
sequenceA :: (Traversable t, Applicative f) => t (f a) -> f (t a)
(我使用sequenceA
它是因为它是更通用的版本——sequence
有一个更严格Monad
的约束而不是那个Applicative
——但就这个答案而言,它并不重要。)
假设您list
有类型[Integer -> Integer]
(为了清楚起见,我专门针对数字)。然后专门从事sequenceA
:sequenceA list
[Integer -> Integer] -> (Integer -> [Integer])
如果我们以前缀样式编写有趣的(对我们而言)类型构造函数,则对应关系更容易看出:
-- t ( f a) -> f ( t a)
[] ((->) Integer Integer) -> ((->) Integer ([] Integer))
列表函子[]
是可遍历函子(t
在 的签名中sequenceA
),而来自函子(->) Integer
的函数Integer
是相关的应用函子(f
签名中的应用上下文。例如,在结果类型中,你有一个来自s 的函数来生成这样的列表Integer -> [Integer]
,而不是简单的整数列表。Integer
推荐阅读
- javascript - 谷歌可视化气泡图根据值更改图例颜色
- xml - Xpath/XSLT:如何选择没有名称的子元素的属性...?
- .net - 解决 IIS 中托管 netcore 2.1 web api 时的 404 错误
- javascript - 有没有办法在组件 A 的方法中添加事件侦听器,并将目标放在单独的组件中
- python - 使用来自 H2O 的超参数在 Sklearn 中重新构建 XGBoost 在 Python 中提供了不同的性能
- android - Xamarin Forms and Prism to native view - 从 prism 项目中的视图导航到共享项目中的视图
- javascript - 输入值始终等于 0
- python - 这个错误是因为Python版本不同吗?
- django - 可空外键字段 Django Rest 框架的反序列化问题
- xamarin.forms - Xamarin 表单自定义 GridView Tap 和 Long Tap 不能一起工作