如何找到列表中最长的字符串?哈斯克尔

Art*_*hur -3 string haskell list max

仅使用前奏函数,如何返回字符串列表中最长的字符串?

例如

["abc","ab","cb"]
Run Code Online (Sandbox Code Playgroud)

将返回

"abc"
Run Code Online (Sandbox Code Playgroud)

Ste*_*ans 5

如果您确实想限制自己只使用 Prelude 函数,这里有一个简单的解决方案:

longest :: [String] -> String
longest xss = snd $ maximum $ [(length xs, xs) | xs <- xss]
Run Code Online (Sandbox Code Playgroud)

也就是说,首先将列表中的每个元素与其长度配对,然后根据字典顺序取出最大的对,最后删除该对的长度部分,留下最长的字符串。


正如其他人也指出的那样,允许自己使用其他库,可以使编写此函数变得更加容易。例如,分别导入maximumBycomparingfromData.OrdData.List,使您可以将函数简单地编写为

longest = maximumBy (comparing length)
Run Code Online (Sandbox Code Playgroud)

交易comparingfrom onData.List你可以写成

longest = maximumBy (compare `on` length)
Run Code Online (Sandbox Code Playgroud)

最后两个版本的优点是它们具有更通用的类型,即[[a]] -> [a],然后是我上面给出的全 Prelude 函数,它Ord a => [[a]] -> [a]最多可以将其类型推广到。