我有以下列表
Prelude> let a = [["1676","17348","10"],["1677","18831","10"],["1677","18896","10"]]
我想把它转换成这样的 Int 列表[[1676,17348,10],[1677,18831,10],[1677,18896,10]]
我尝试了以下代码,但它不起作用:
f :: [[String]] -> [[Int]]
f [x] = map read (map read x)
我有以下列表
Prelude> let a = [["1676","17348","10"],["1677","18831","10"],["1677","18896","10"]]
我想把它转换成这样的 Int 列表[[1676,17348,10],[1677,18831,10],[1677,18896,10]]
我尝试了以下代码,但它不起作用:
f :: [[String]] -> [[Int]]
f [x] = map read (map read x)
为什么map (map read)
有效。
内部(map read)
签名是[String] -> [Int]
. 所以它会将列表转换为String
列表Int
。现在要将其应用于列表列表String
,您只需使用 提升它map
,因此map(map read)
可以工作。在此,您将函数(map read)
应用于列表中的每个元素[String]
(或列表列表String
,如果这样做更好的话)。
你不能有map read (map read)
,因为类型签名read
是String -> Int
。您的外部read
类型签名是,这不是工作方式。(map
read
(map read))
[String]->[Int]
read
使用镜头库 (Control.Lens) 3.7.1.2的替代解决方案
import Control.Lens
f :: [[String]] -> [[Int]]
f = over (traverse.traverse) read
现在,如果我们有:
Prelude> let a = [("1676","17348"),("1677","18831"),("1677","18896")]
f :: [[String]] -> [(Int, Int)]
f = over (traverse.both) read
或者对于三个元组,我们需要通过从两者的定义扩展三次来创建一个新函数。
Prelude> let a = [("1676","17348","10"),("1677","18831","10"),("1677","18896","10")]
import Control.Lens
import Control.Applicative
thrice f ~(a, a', a'') = (,,) <$> f a, <*> f a' <*> f a''
f :: [[String]] -> [(Int, Int, Int)]
f = over (traverse.thrice) read