尝试确定如何计算char
的出现次数为string
。我将它存储在列表[char,count]
中。
countChars :: String -> [(Char, Int)]
我是新手并且学习Haskell所以任何帮助都非常感谢。
答案 0 :(得分:3)
给你一个品味
> (map (head &&& length) . group . sort) "asdfasdfaeadf"
[('a',4),('d',3),('e',1),('f',3),('s',2)]
一堆或进口之后。
您可以轻松定义您的头部&&&长度,如果语法不熟悉。
> head_and_length x = (head x, length x)
组可以递归写入
group [] = []
group (x:xs) = (x:ys) : group zs
where (ys,zs) = (takeWhile (==x) xs, dropWhile (==x) xs)
尽可能多地使用匹配元素,并递归地应用其余元素,直到什么都没有留下。请注意,此定义要求相同的元素是连续的,这就是为什么需要排序的原因。
编写一个复杂的函数是不推荐的,不过可以单独实现小功能(也许可以使用现有的功能),这些功能可以独立测试并创建这些功能的组合作为最终解决方案。 / p>
答案 1 :(得分:1)
这不会有所帮助,但它会很快。诀窍是使用OnFocusChangedListrner
,一个非常有效的IntMap
键映射表示,来存储每个角色的数量。我们正在使用字符作为密钥,因此我们首先创建一个Int
类型,结束CharMap
并编写一些包含其IntMap
的函数等同物。
IntMap
这有点烦人,但相当机械。这是主要事件。我们将字符投入import Data.Foldable (Foldable, foldl')
import Control.Applicative ((<|>))
import qualified Data.IntMap.Strict as IM
import Data.IntMap (IntMap)
-- Strict version of Data.Bifunctor.first
first :: (a -> a') -> (a, b) -> (a', b)
first f (a, b) = (f a, b)
newtype CharMap a = CharMap (IntMap a)
emptyCM :: CharMap a
emptyCM = CharMap (IM.empty)
toAssocAsc :: CharMap a -> [(Char, a)]
toAssocAsc (CharMap m) = map (first toEnum) (IM.toAscList m)
alter :: (Maybe a -> Maybe a) -> Char -> CharMap a -> CharMap a
alter f c (CharMap m) = CharMap $ IM.alter f (fromEnum c) m
,将它们映射到它们的计数,然后在我们完成时将地图转换为关联列表。
CharMap