Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
缩短字符串Haskell_Haskell - Fatal编程技术网

缩短字符串Haskell

缩短字符串Haskell,haskell,Haskell,如何在Haskell中用给定的数字缩短字符串 说: 使用comp我想从字符串的开头选择一段重复的字符,使用 最多包含九个字符的运行 例如: 简短的“aaaavvdd” 将输出“aaaa” 和短“dddddd” 输出“ddddd” 我知道我需要接受,但不确定如何将其放入代码中 我已经走了这么远,但没用 short x:xs | length(short x:xs) >9 = take(9) | otherwise = comp 这里有一个定义: import Data

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

说:

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

例如:

简短的“aaaavvdd”
将输出“aaaa” 和
短“dddddd”
输出
“ddddd”

我知道我需要
接受
,但不确定如何将其放入代码中

我已经走了这么远,但没用

short x:xs | length(short x:xs) >9 = take(9)
           | otherwise = comp
这里有一个定义:

import Data.List (group)
short = take 9 . head . group
short = head . group . take 9
short x = group x
有趣的是,由于我们返回的字符串是原始字符串的前缀,并且长度限制为最多9个字符,所以我们是否先缩减到该限制并不重要。所以我们也可以使用这个定义:

import Data.List (group)
short = take 9 . head . group
short = head . group . take 9
short x = group x
这两种语言都是以“无点”的风格编写的,没有标点符号,而是缺少不必要的变量。我们也可以把定义写成

short s = take 9 (head (group s))
或者,使用
$
去掉括号:

short s = take 9 $ head $ group s
唯一的另一个步骤是只提取匹配字符的第一块,这就是
头。组执行(相当于您的
chomp
功能)

发件人:

group
函数获取一个列表并返回一个列表列表,以使结果的串联等于参数。此外,结果中的每个子列表只包含相等的元素。比如说,

group "Mississippi" = ["M","i","ss","i","ss","i","pp","i"]
这是
groupBy
的一个特例,它允许程序员提供自己的平等性测试

快速回答 这将为您提供与所需输出匹配的输出

就是

*> short "aaaavvvdd"
"aaaa"
*> short "dddddddddd"
"ddddddddd"

逐步发展 使用“组”分隔项目 此解决方案取决于Data.List库中的“group”函数。我们从定义开始:

import Data.List (group)
short = take 9 . head . group
short = head . group . take 9
short x = group x
这给了我们:

*> short "aaaavvvddd"
["aaaa","vvv","ddd"]
使用“head”仅返回第一个元素 一旦我们拥有了列表中的元素,我们只需要列表的第一项。我们使用“头”实现这一点:

“.”是用于函数合成的Haskell函数。这与:

short x = head (group x)

这将使我们:

*> short "aaaavvvdd"
"aaaa"
*> short "dddddddddddddd"
"dddddddddddddd"
使用“take”获取前九个字符 我们只取这个结果的前九个字符来完成程序,最后得到我们的最终函数。为此,我们使用前奏曲中的“take”功能:

short x = (take 9 . head . group) x
我们现在得到了我们想要的结果,但有一个小问题

添加另一个案例以消除错误 请注意,在空列表上使用当前定义会导致错误

*> short "aaaavvvddd"
"aaaa"
*> short ""
"*** Exception: Prelude.head: empty list
因为“head”在空列表上没有定义,所以我们需要处理另一种情况:空列表。现在我们有:

short [] = []
short x = (take 9 . head . group) x  

这是我们的“最终答案”。

这里是另一个版本:

short xs = take 9 $ takeWhile (== head xs) xs
因此,只要内容等于列表的头(即字符串的第一个字符),我们就从列表中获取。然后在必要时使用
take
缩短结果


请注意,对于空字符串,我们不需要额外的case,这是Haskell懒散的结果:如果
takeWhile
看到list参数为空,它就不需要计算condition参数,因此
head xs
不会抛出错误。

这是家庭作业吗?如果是这样的话,请加上家庭作业标签。不,我只是觉得无聊,决定自学。到目前为止,你的定义还不错,你只是在努力学习语法。以下是我认为您试图编写的内容:
short-xs | length(chomp-xs)>9=take-9xs;否则=chomp-xs
。这不是世界上最有效的事情,但它会让你开始。