我有一个列表:["1", "111", "11111", "1111111"]
我希望用下划线填充每个元素,长度为11,原始元素位于中间,即["_____1_____","____111____","___11111___","__1111111__"]
我正在使用:
pad' x = s ++ x ++ s
where
s = replicate ((11 - length x) `div` 2 ) '_'
有更简洁/更有效的方法吗?
NB所需宽度始终为奇数
答案 0 :(得分:2)
顶级声明应始终具有显式类型。
我知道您说填充下划线的总数将始终是均匀的,但在代码中构建这种假设绝不是一个好主意。相反,如果可能,您应该在所有输入下使您的功能正确。这样,当某些内容发生变化并且您的假设不再正确时,您就不会隐藏错误。
出于同样的原因,您还应该将填充宽度设置为参数。您也可以随时创建专门版本。
将这些内容放在一起,改进后的版本将是:
pad' :: Int -> String -> String
pad' n x = replicate s1 '_' ++ x ++ replicate s2 '_'
where
len = length x
s1 = (n - len) `div` 2
s2 = n - s1 - len
pad11 :: String -> String
pad11 = pad' 11