【发布时间】:2016-04-01 08:14:54
【问题描述】:
traverse :: Applicative f => (a -> f b) -> t a -> f (t b)
嗨,
有很多我无法理解签名的功能。当然我知道 traverse 有两个参数,第一个是函数。然而,(a -> f b) 是什么意思?我能理解(a -> b).
同理,t a,f (t b)
你能解释一下吗?
【问题讨论】:
-
f代表类型构造函数(想想f = Maybe),t也是如此(想想t = [])——你能理解(a -> Maybe b) -> [a] -> Maybe [b]吗? -
如果你想感受一下这个案例,你可以用
traverse (\ a -> if even a then Just (a `div` 2) else Nothing) [2,4,6]玩一下(尝试改变输入列表);) -
谢谢。请告诉我:t a 总是意味着 [a] ?
-
另外,为什么我们使用 traverse 而不是 map ?
-
对第一个问题:不!
t a = [a]只是一个示例(这就是为什么您首先希望拥有 parametrict的原因)