更改嵌套列表中元素的类型

时间:2017-09-09 20:17:59

标签: haskell

我有对象tableaux :: [[[Int]]],我想将其更改为[[[Int32]]]。我这样做:

int32ToInt :: Int32 -> Int
int32ToInt = fromIntegral

tableaux32 = map (\y -> map (\x -> map intToInt32 x) y) tableaux

有更好的方法吗?

2 个答案:

答案 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来执行上述示例。目的是强调镜头可以很好地概括这种修改嵌套结构的模式,并且一旦这些修改变得更复杂就应该首选。