用于结结的辅助功能中的非详尽模式

时间:2015-09-15 09:32:08

标签: haskell tying-the-knot

我正在尝试在Haskell中编写一个函数,该函数根据该列中字符串的最大大小来获取表并填充每列的单元格。我这样做的方法是使用技术 - 打结。这是我写的函数:

type Row = [String]
type Table = [Row]
type Width = [Int]

aux :: (Width,Width) -> Table -> (Width,Table)
aux (x,m) [[]] = (m,[[]])
aux (x,m) (z:zs) = (y,t)
    where
        (xz,zs') = aux (x,m) zs
        y = zipWith max (map length z) xz
        z' = adjust x z
        t = z':zs'

pipedTable :: Table -> Table
pipedTable t = t'
    where
        (m,t') = aux (m,zeroWidth) t
            where
                zeroWidth = take (length $ head t) $ repeat 0

adjust :: Width -> Row -> Row
adjust [] [] = []
adjust (w:ws) (r:rs) = (r ++ s):(adjust ws rs)
    where
        s = take (w-(length r)) $ repeat ' '

当我加载此模块并尝试将某些输入提供给函数pipedTable时 例如

*Main> pipedTable [["I","am"],["You","look"],["Fine","I"]]

它给出了,

[*** Exception: pipedTable.hs:(6,1)-(12,26): Non-exhaustive patterns in function aux.

我不明白问题出在哪里。

1 个答案:

答案 0 :(得分:2)

这种情况应该是aux

aux (x,m) [[]] = (m,[[]])

真的是:

aux (x,m) [] = (m,[[]])

否则,第二个参数是空列表时不存在任何情况。