Haskell 字符串中字符的有序出现

Haskell 字符串中字符的有序出现,haskell,Haskell,我想获取字符串中出现的所有字符。 例如,如果我有字符串“nundddr”,我想得到“nnudddrr” 这是代码的样子,应该实现这一点: usort :: String -> String l :: String l = "" usort (x:xs) | xs == [] = l ++ [x] | otherwise = l ++ [n | n <- (x:xs), n = x] ++ usort (xs) usort::String->String l::

我想获取字符串中出现的所有字符。 例如,如果我有字符串“nundddr”,我想得到“nnudddrr”

这是代码的样子,应该实现这一点:

usort :: String -> String

l :: String
l = ""

usort (x:xs)
    | xs == []  = l ++ [x]
    | otherwise = l ++ [n | n <- (x:xs), n = x] ++ usort (xs)
usort::String->String
l::字符串
l=“”
usort(x:xs)
|xs==[]=l++[x]

|否则=l++[n | n您已经正确地观察到,对
usort
的递归调用没有删除已经使用过的字符,因此您需要修改函数,使其能够执行此操作。您可以使用
filter
仅选择列表中符合某些条件的元素,以便我们可以删除已经使用过的字符像这样的人:

filter (\=x) xs
我们可以使用相同的方式选择与
x
匹配的所有字符

filter (==x) xs
您可以使用以下两种方法创建
usort
函数:

usort (x:xs) = x : (filter (==x) xs) ++ usort (filter (/=x) xs)

但是,当您试图对空列表进行排序时,您没有考虑该情况,因此您还需要添加:

usort [] = []
把这些放在一起,你会得到

usort::(Eq a)=>[a]->[a]
usort [] = []
usort (x:xs) = x : filter (==x) xs ++ usort (filter (/=x) xs)

谢谢!我怎样才能用一个字符串列表作为输出来实现同样的功能。就像每个“块”ogf字符都有一个字符串一样?我不太清楚你在问什么。你能给我一个例子说明你的意思吗?[“nn”、“u”、“ddd”、“rr”]按照我上面的例子。问题是我应该在某些属性之后对它们进行排序(长度,字母表中的顺序)我想这将更容易用列表管理。好的,我现在明白了。修改当前版本来做到这一点是相当容易的。到目前为止,您有没有尝试过什么?提示:考虑一下如何生成[“nn”]首先,然后在你能做到这一点后尝试获取完整的列表。好的,我知道了。只是在“x:filter(=x)xs”表达式上做了括号。我喜欢一行中的符号。到目前为止,我像以前一样在多行中做了所有事情。你应该更喜欢模式匹配而不是等效的保护。在这种情况下,
[x]
x:[]
|xs==[]