我有一个文本表定义为字符串列表的列表:
type Field = String
type Row = [Field]
type Table = [Row]
我想创建一个可以找到每列最长单词宽度的函数,如下所示:
columnWidths :: Table -> [Int]
所以如果有人输入这样的文本表:
["asd", "ffdd"," 12345"]
["dd ss aa","123", "1dssd"]
应该给出宽度:
[8,4,5]
我尝试了一些东西,包括地图,最大长度和转置,但我似乎无法使它工作。
答案 0 :(得分:2)
所以我这样做了:
map length
查找表格中每个文字项目的长度,但我将其映射到整个表格,因此map (map length)
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]