【发布时间】:2010-10-26 23:39:28
【问题描述】:
如果我有一个矩阵作为行列表 [[1,2,3],[4,5,6]],我想返回第一列 [1,4]。我是 Haskell 的绝对初学者,我什至不知道如何处理嵌套列表。
【问题讨论】:
如果我有一个矩阵作为行列表 [[1,2,3],[4,5,6]],我想返回第一列 [1,4]。我是 Haskell 的绝对初学者,我什至不知道如何处理嵌套列表。
【问题讨论】:
以下代码将完成这项工作:
map head [[1,2,3],[4,5,6]]
map 是 haskell(和其他函数式编程语言)中最有用的函数之一。给定一个列表[a,b,c,d] 和一个函数f,map f [a,b,c,d] 将返回列表[f a, f b, f c, f d]。 head 函数提取列表的第一个元素。这就是为什么
map head [[1,2,3],[4,5,6]] ->
[head [1,2,3], head [4,5,6]] ->
[1,4]
【讨论】:
更笼统地说:
col :: Int -> [[a]] -> [a]
col n = map (head . drop n)
请记住,如果 n 大于或等于您提供的任何列表的长度,这将失败。
【讨论】:
col n = map (!! n),我认为它更清楚地表达了意图。 YMMV。
将行矩阵转换为列矩阵的库函数是Data.List.transpose。所以解决问题的一种方法是
import Data.List (transpose)
col = head . transpose
您还可以编写一个函数来从矩阵中获取任何列:
colN n matrix = transpose matrix !! n
免责声明:
请记住,如果您需要转置整个矩阵,则转置成本很高。对于第一列,它的成本应该与人们给出的其他解决方案的成本大致相同。
此外,转置在复杂代码中相对危险,因为它的结果与其参数的类型相同:[[a]] -> [[a]]。所以很容易输入错误数量的转置。 (我很难学到这一点。)
【讨论】:
以下代码将完成这项工作:
map head [[1,2,3],[4,5,6]]
扩展乔纳斯的回答; map 将函数应用于列表的每个元素。将一个函数“映射”到一个列表的结果是一个不同类型的新列表。
这里的输入列表是[[Int]] 类型,这意味着列表中的每个元素都是Ints 的列表。因此,您需要一个函数来获取每个子列表并返回其第一个元素;那是head。
总而言之,map 将采用函数 head,将其应用于每个子列表,这样您将获得一个类型为 [Int] 的新列表,其中仅包含每个列表的头部(第一个元素)。
【讨论】: