在Haskell中查找文本表中列的最长单词

时间:2015-09-15 10:16:36

标签: string list haskell max

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

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

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

columnWidths :: Table -> [Int]

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

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

应该给出宽度: [8,4,5]

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

2 个答案:

答案 0 :(得分:2)

所以我这样做了:

  1. 使用map length查找表格中每个文字项目的长度,但我将其映射到整个表格,因此map (map length)
  2. 我将其换位,以便在每列中找到最大值
  3. 在整个桌子上映射:
  4. 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]
    

答案 1 :(得分:0)

作为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]