【问题标题】:String letter percentages in HaskellHaskell中的字符串字母百分比
【发布时间】:2013-10-11 17:28:19
【问题描述】:

我正在尝试编写一个 Haskell 函数,该函数将使用字符串说“PLATYPUS”并返回该单词中字符的相对百分比,即 characterPercentages “PLATYPUS”将返回:[(P,25),(A, 13),(L,13),(S,13),(T,13),(U,13),(Y,13)]。我知道我可以使用元组,但在那之后我有点难过?

【问题讨论】:

  • 尝试更多地解决这个问题。如何将这些元组从字符串中取出?您希望遇到哪些功能?进来的是什么?什么出来了?
  • 看看Data.Map,我想对你有很大帮助
  • 也许你应该先试试绝对频率,比如[(P,2),(A,1),(L,1),(S,1),(T,1),(U,1),(Y,1)]。假设您可以为某个字符串计算它。然后弄清楚如何在你的答案中只添加一个字母。一切就绪后,将值转换为百分比。
  • 如何查看 Data.Map?
  • 在 ghci 中,您可以尝试 :m Data.Map:browse Data.Map,您可以在 Google 上搜索“Data.Map haskell”以获取文档

标签: string haskell tuples


【解决方案1】:

首先,您需要了解您将获得什么。

据我了解,您希望拥有

type String = [Char] --already in Prelude

String -> [(Char,Int)]
"PLATYPUS" -=> [('P',2),('A',1),('L',1),('S',1),('T',1),('U',1),('Y',1)]

您可以将来自Data-Listgroup 分组列表与使用length 函数的映射结合起来

String   -> [[Char]]
[[Char]] -> [(Char,Int)]

更新

如果我们谈论第一部分 - 计算字母,我们可以做下一步:

> :m Data.List
> map (\c -> (head c, length c)) $ group $ sort "PLATYPUSAAA"
[('A',4),('L',1),('P',2),('S',1),('T',1),('U',1),('Y',1)]

所以,让我们找到相对数字,我们将length c 更改为100*(length c) 'div' ls

> let frqLetters s = let ls = length s in 
     map (\c -> (head c, 100 * (length c) `div` ls)) $ group $ sort s
> frqLetters "PLATYPUSAAA"
[('A',36),('L',9),('P',18),('S',9),('T',9),('U',9),('Y',9)]

【讨论】:

  • 我知道 group 函数将列表拆分为列表列表,但是 length 函数会给出整个列表列表的长度吗?或者它可以给出每个单独的子列表的长度吗?
  • @Eddie,是的,子列表,使用mapmap (\c -> (head c, length c))
  • 有没有办法使用 zip 和/或 unzip 来实现这个功能?
  • @Eddie 我更新了我的答案。现在你需要使用另一个map,但是将元组的第二部分划分为字符串的length
  • 有没有一种排序方式,所以它不是按字母顺序排列,而是按降序排列频率最高的字母?也就是说,P 在 L 之前?
猜你喜欢
  • 2016-06-06
  • 2023-03-22
  • 2014-03-11
  • 1970-01-01
  • 2011-04-11
  • 2012-02-29
  • 1970-01-01
  • 2019-03-09
  • 2021-02-05
相关资源
最近更新 更多