Haskell-使用另一个函数映射元组列表的值

时间:2018-12-30 17:24:05

标签: haskell

我正在编写一些代码,这些代码根据元组列表中的值创建直方图。

列表如下:

[("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

有人知道我缺少什么吗?谢谢

1 个答案:

答案 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