Traversable
从某种意义上说,它的结构具有“路径”(可以对应于列表)的容器类,可以在不分解结构的情况下修改其上的元素。因此
zipTrav :: Traversable t => t a -> [b] -> Maybe (t (a,b))
zipTrav = evalStateT . traverse zp
where zp a = do
bs <- get
case bs of
[] -> lift Nothing
(b:bs') -> put bs' >> return (a,b)
但是,这种列表状态遍历似乎有点骇人听闻,并且可能不是最有效的方法。我想会有一个标准功能可以完成上述或更一般的任务,但我不知道它会是什么。