Haskell 哈斯克尔。需要将列表中的相同元素按顺序展平
如何删除与列表中的项目相邻的相同重复项目Haskell 哈斯克尔。需要将列表中的相同元素按顺序展平,haskell,Haskell,如何删除与列表中的项目相邻的相同重复项目 flattlst "aaaasssaaabbbssaaa" --"asabsa" 我试图通过Data.List中的“nub”函数来实现 import Data.List flattlst = nub --flattlst"aaaasssaaabbbssaaa" "asb" -- !!! It is wrong!! "asabsa" -- !!The answer should be like this. 但这不是我需要的。“Nub”将删除所有相
flattlst "aaaasssaaabbbssaaa"
--"asabsa"
我试图通过Data.List中的“nub”函数来实现
import Data.List
flattlst = nub
--flattlst"aaaasssaaabbbssaaa"
"asb" -- !!! It is wrong!!
"asabsa" -- !!The answer should be like this.
但这不是我需要的。“Nub”将删除所有相同的元素,但我只需要那些排成一行的元素。请帮助我解决此问题。
Nub
将只生成一个元素,如果它没有首先生成等效的元素。所以nub
确实会发出“asb”
,因为'a'
s、's'
s和'b'
s之后已经发出了
你能用的是。这将为每个相等元素的子序列生成一个非空列表。例如:
Prelude Data.List.NonEmpty> group "aaaasssaaabbbssaaa"
['a' :| "aaa",'s' :| "ss",'a' :| "aa",'b' :| "bb",'s' :| "s",'a' :| "aa"]
您仍然需要对此进行后期处理,以便对于每个元素,都返回第一个元素。我把它留作练习。提示:您可以使用模式匹配来实现这一点。这里有一个简单的方法,应该可以很好地工作。它使用from
数据。列表
:
flattlst = map head . group
大多数Haskell程序员,包括我在内,通常都会警告不要使用head
,因为如果在空列表中使用,会导致程序崩溃。但是,组
保证生成一个非空列表*,因此这应该是可以的
*至少如果输入为非空。我不确定在空列表上使用时,
组
会做什么-我怀疑这样或那样会爆炸,所以如果需要避免的话,请为空列表/字符串添加一个特殊情况 这看起来不像是“扁平化”。此外,nub
表示“全局”统一性。您需要的是group
并进行一些后处理。您可以使用head
像head group“aaaassaaabbbssaaa”
这样的“flattlst”函数应该可以处理任何列表,而不仅仅是那些列表。@Seliverstov:它可以,就像类型签名所说的,它适用于任何可折叠的元素a
所在的Eq a
上,也适用于Char
s列表、NonEmpty
s的Int
s、Tree
s的String
s、可能的树Char
s等。使用映射头。Data.List.NonEmpty.group
为了避免出现partialityCome,检查group
对空列表的作用有多困难?答案是,它会返回一个空列表。。。这显然是正确的做法。所以,不,这不会爆炸,只有头
使这个解决方案“不安全”,但实际上整个东西是一个完美的整体功能。抱歉@leftaroundabout,我本来会在GHCi登记的,但我在手机上,经常无法方便地加载我的笔记本电脑。我确实检查了文档,看不到明确的答案,但现在您指出了这一点,返回空列表确实看起来很明显。很明显,我甚至没有想到它!:-)