我有对象tableaux :: [[[Int]]]
,我想将其更改为[[[Int32]]]
。我这样做:
int32ToInt :: Int32 -> Int
int32ToInt = fromIntegral
tableaux32 = map (\y -> map (\x -> map intToInt32 x) y) tableaux
有更好的方法吗?
答案 0 :(得分:6)
请注意(\x -> map f x)
只是map f
。你在函数中看到这种模式多少次了?我看了两次。
答案 1 :(得分:0)
虽然在这个例子中你可以使用一个简单的map
链来逃避,只要你有深层嵌套的结构,你应该到达镜头。在Haskell中有多个包,其中最强大的是Edward Kmett的lens。
使用镜头,您可以使用traverse
来聚焦Traversable
容器的每个元素:
convert :: (a -> b) -> [[[a]]] -> [[[b]]]
convert = over (traverse . traverse . traverse)
lens的强大之处在于,您也可以使用[Vector [Maybe a]]
,并且在推广类型签名后仍然可以使用相同的函数convert
。
正如Daniel Wagner在评论中指出的那样,您仍然可以仅使用fmap
来执行上述示例。目的是强调镜头可以很好地概括这种修改嵌套结构的模式,并且一旦这些修改变得更复杂就应该首选。