【问题标题】:Find the longest word of a column within a text table in Haskell在 Haskell 的文本表中查找列的最长单词
【发布时间】:2015-12-11 13:22:36
【问题描述】:

我有一个定义为字符串列表的文本表:

type Field = String
type Row   = [Field]
type Table = [Row]

我想创建一个可以找到每列最长单词宽度的函数,如下所示:

columnWidths :: Table -> [Int]

所以如果有人输入这样的文本表:

["asd", "ffdd"," 12345"]
["dd ss aa","123", "1dssd"]

它应该返回宽度: [8,4,5]

我尝试了一些东西,包括地图、最大长度和转置,但我似乎无法让它工作。

【问题讨论】:

    标签: string list haskell max


    【解决方案1】:

    所以我这样做了:

    1. map length查找表格中每个文本项的长度,但我将其映射到整个表格,所以map (map length)
    2. 我将其转置,以便在每列中找到最大值
    3. 将其映射到整个表格:

    Prelude> import Data.List
    Prelude Data.List> let table = [["asd","ffdd","12345"],["dd ss aa","123","1dssd"]]
    Prelude Data.List> let lengths = map (map length) table
    Prelude Data.List> map maximum $ transpose lengths
    [8,4,5]
    

    【讨论】:

      【解决方案2】:

      作为 Arnon 答案的变体,我们也可以先转置后映射:

      > map maximum . map (map length) . transpose $ table
      [8,4,5]
      

      我们可以通过利用map 的函子定律来进一步简化上面的代码,它指出map f . map g = map (f . g)

      > map (maximum . map length) . transpose $ table
      [8,4,5]
      

      【讨论】:

      • 谢谢@chi。我试图保持简单以显示合乎逻辑的步骤。
      猜你喜欢
      • 1970-01-01
      • 2013-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多