【问题标题】:First column of a matrix given as a list of rows in Haskell矩阵的第一列作为 Haskell 中的行列表给出
【发布时间】:2010-10-26 23:39:28
【问题描述】:

如果我有一个矩阵作为行列表 [[1,2,3],[4,5,6]],我想返回第一列 [1,4]。我是 Haskell 的绝对初学者,我什至不知道如何处理嵌套列表。

【问题讨论】:

    标签: haskell matrix


    【解决方案1】:

    以下代码将完成这项工作:

    map head [[1,2,3],[4,5,6]]
    

    map 是 haskell(和其他函数式编程语言)中最有用的函数之一。给定一个列表[a,b,c,d] 和一个函数fmap 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]
    

    【讨论】:

    【解决方案2】:

    更笼统地说:

    col :: Int -> [[a]] -> [a]
    col n = map (head . drop n)
    

    请记住,如果 n 大于或等于您提供的任何列表的长度,这将失败。

    【讨论】:

    • 等价于col n = map (!! n),我认为它更清楚地表达了意图。 YMMV。
    【解决方案3】:

    将行矩阵转换为列矩阵的库函数是Data.List.transpose。所以解决问题的一种方法是

    import Data.List (transpose)
    col = head . transpose
    

    您还可以编写一个函数来从矩阵中获取任何列:

    colN n matrix = transpose matrix !! n
    

    免责声明:

    请记住,如果您需要转置整个矩阵,则转置成本很高。对于第一列,它的成本应该与人们给出的其他解决方案的成本大致相同。

    此外,转置在复杂代码中相对危险,因为它的结果与其参数的类型相同:[[a]] -> [[a]]。所以很容易输入错误数量的转置。 (我很难学到这一点。)

    【讨论】:

      【解决方案4】:

      以下代码将完成这项工作:

      map head [[1,2,3],[4,5,6]]
      

      扩展乔纳斯的回答; map 将函数应用于列表的每个元素。将一个函数“映射”到一个列表的结果是一个不同类型的新列表。

      这里的输入列表是[[Int]] 类型,这意味着列表中的每个元素都是Ints 的列表。因此,您需要一个函数来获取每个子列表并返回其第一个元素;那是head

      总而言之,map 将采用函数 head,将其应用于每个子列表,这样您将获得一个类型为 [Int] 的新列表,其中仅包含每个列表的头部(第一个元素)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-04
        • 1970-01-01
        • 2018-05-17
        • 2014-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-20
        相关资源
        最近更新 更多