如何使用给定数字缩短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)
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"来实现这一点:
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"函数:
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)
这是我们的"最终答案".
| 归档时间: |
|
| 查看次数: |
1668 次 |
| 最近记录: |