print_line :: [Int] -> String
print_line numbers = case numbers of
[] -> []
n:ns -> '+' :replicate n '-' ++ print_line ns
我想要给Print_line函数一个Int列表,例如[8,2]它返回 &#34 + -------- + - +" 此刻的功能将返回" + -------- + - "我该如何解决这个问题?
答案 0 :(得分:5)
只需对+
案例使用[]
:
print_line :: [Int] -> String
print_line numbers = case numbers of
[] -> "+"
n:ns -> '+' :replicate n '-' ++ print_line ns
我没有测试过,自从我最后一次在Haskell编程以来已经有一段时间了。
答案 1 :(得分:3)
添加一个小助手函数,写出你得到的全部东西
import Data.List
printLine :: [Int] -> String
printLine = between '+' . intercalate "+" . map (`replicate` '-')
where between c str = c:(str ++[c])
如果我会经常使用这些,我甚至会更进一步做出像
这样的额外功能fillWith c = map (`replicate` c)
sepBy = intercalate
between c str = c:(str++[c])
所以我可以编写printLine = between '+' . sepBy '+' . fillWith '-'
,其中读取(Atto / Mega / Parsec-)解析器非常相似,我将编写解析这样的字符串,如果我的话,它还可以灵活地更改整个事物。最终结果字符串应该看起来像|----+-----------+-----|
或|=========|========|========|
。
答案 2 :(得分:2)
使用Data.List
import Data.List
print_line x=intercalate "+" . map (flip replicate '-') $ [0]++x++[0]