0

我有以下列表

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)
4

2 回答 2

3

为什么map (map read)有效。

内部(map read)签名是[String] -> [Int]. 所以它会将列表转换为String列表Int。现在要将其应用于列表列表String,您只需使用 提升它map,因此map(map read)可以工作。在此,您将函数(map read)应用于列表中的每个元素[String](或列表列表String,如果这样做更好的话)。
你不能有map read (map read),因为类型签名readString -> Int。您的外部read类型签名是,这不是工作方式。(mapread(map read))[String]->[Int]read

于 2012-12-31T09:01:39.697 回答
2

使用镜头库 (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
于 2013-01-02T23:58:12.730 回答