缩短String Haskell

Ahs*_*san 2 haskell

如何使用给定数字缩短Haskell中的字符串.

说:

comp :: String -> String
short :: String -> String

chomp (x:xs) = (x : takeWhile (==x) xs)
Run Code Online (Sandbox Code Playgroud)

使用comp我想从字符串的开头选择一系列重复的字符,运行最多包含9个字符.

例如:

short "aaaavvvdd" 输出"aaaa"short "dddddddddd" 输出"ddddddddd".

我知道我需要take但不知道如何将其纳入代码中.

我有这么远,但它不起作用

short x:xs | length(short x:xs) >9 = take(9)
           | otherwise = comp
Run Code Online (Sandbox Code Playgroud)

Ezr*_*zra 9

快速回答

import Data.List
short [] = []
short x = (take 9 . head . group) x  
Run Code Online (Sandbox Code Playgroud)

这将为您提供与您所需输出相匹配的输出.

那是,

*> short "aaaavvvdd"
"aaaa"
*> short "dddddddddd"
"ddddddddd"
Run Code Online (Sandbox Code Playgroud)

一步一步的发展

使用"组"分隔项目

此解决方案取决于Data.List库中的"group"函数.我们从定义开始:

short x = group x
Run Code Online (Sandbox Code Playgroud)

这给了我们:

*> short "aaaavvvddd"
["aaaa","vvv","ddd"]
Run Code Online (Sandbox Code Playgroud)

使用"head"仅返回第一个元素

一旦我们在列表中有元素,我们只需要列表的第一项.我们使用"head"来实现这一点:

short x = (head . group) x
Run Code Online (Sandbox Code Playgroud)

"" 是函数组合的Haskell函数.它与以下相同:

short x = head (group x)
Run Code Online (Sandbox Code Playgroud)

要么

short x = head $ group x
Run Code Online (Sandbox Code Playgroud)

这将给我们:

*> short "aaaavvvdd"
"aaaa"
*> short "dddddddddddddd"
"dddddddddddddd"
Run Code Online (Sandbox Code Playgroud)

使用"take"获取前九个字符

我们只通过这个结果的前九个字符完成程序,最后得到我们的最终功能.为此,我们使用前奏中的"take"函数:

short x = (take 9 . head . group) x
Run Code Online (Sandbox Code Playgroud)

我们现在得到了我们想要的结果,但有一个小问题.

添加另一个案例以消除错误

请注意,在空列表中使用我们当前的定义会导致错误,

*> short "aaaavvvddd"
"aaaa"
*> short ""
"*** Exception: Prelude.head: empty list
Run Code Online (Sandbox Code Playgroud)

因为在空列表中未定义"head",我们需要处理另一种情况:空列表.现在我们有:

short [] = []
short x = (take 9 . head . group) x  
Run Code Online (Sandbox Code Playgroud)

这是我们的"最终答案".