为何Data.Vector.Fixed中间值会使函数需额外类型约束?
关于Data.Vector.Fixed中V.map约束的疑问
import qualified Data.Vector.Fixed as V foo :: (V.Vector v (Maybe a), V.Vector v [Maybe a], V.Vector v (Maybe [Maybe a])) => v (Maybe a) -> v (Maybe [Maybe a]) foo v = V.map Just (V.map (\x -> [x,x]) v)
为何上述foo需要V.Vector v [Maybe a]这一约束?
我知道该约束对应V.map (\x -> [x,x]) v的返回类型,而该返回值会传入V.map Just,但这难道不是函数的实现细节吗?毕竟将代码改写为如下形式后:
foo :: (V.Vector v (Maybe a), V.Vector v (Maybe [Maybe a])) => v (Maybe a) -> v (Maybe [Maybe a]) foo v = V.map (Just . \x -> [x,x]) v
该约束就不再必要了。
那么V.Vector、V.map或是整个Data.Vector.Fixed模块有何特殊之处,导致函数签名必须为“中间”实体的类型显式提供约束?
我最初的困惑(目前仍存在)部分源于:上述两个版本foo所需约束的差异,意味着以下两个表达式并不一定等价:
fff = V.map Just . V.map (\x -> [x,x]) ggg = V.map (Just . \x -> [x,x])
前者会施加更多约束。
我之前将V.map视为Functor的fmap,因此期望它满足组合律,还针对这一点提出了另一个相关问题。
内容的提问来源于stack exchange,提问作者Enlico
相关产品推荐
相关产品推荐

