我正在编写一些代码,这些代码根据元组列表中的值创建直方图。
列表如下:
[("her",4),("she",2),("friend",1)]
到目前为止,这是我的代码:
-- creates a histogram string of each tuple
makeHistogramRow :: (String, Int) -> String
makeHistogramRow (str, int) = replicate int '*' ++ " -> " ++ str ++ "\n"
-- creates a histogram for each tuple in the list
makeHistogram :: [(String, Int)] -> String
makeHistogram (str, int) = concat (map makeHistogramRow (str, int))
main = do
putStrLn $ show $ makeHistogram [("her",4),("she",2),("friend",1)]
我正在尝试将元组中的每个值映射到
makeHistogramRow
函数,但是它似乎没有用,我知道我缺少一个匿名函数或其他东西,但是我似乎无法弄清楚……
输出应如下所示:
**** -> her
** -> she
* -> friend
有人知道我缺少什么吗?谢谢
答案 0 :(得分:4)
如评论中所述,
makeHistogram :: [(String, Int)] -> String
makeHistogram (str, int) = concat (map makeHistogramRow (str, int))
不会进行检查,因为(str,int)
是(a,b)
类型而不是[(a,b)]
的模式。也就是说,它是一个元组,而不是元组列表。为了使您的代码正常工作,您可以说
makeHistogram :: [(String, Int)] -> String
makeHistogram ls = concat (map makeHistogramRow ls)
或者更好
makeHistogram :: [(String, Int)] -> String
makeHistogram ls = concatMap makeHistogramRow ls
甚至更好
makeHistogram :: [(String, Int)] -> String
makeHistogram = concatMap makeHistogramRow