【问题标题】:How can I find the longest string within a list? Haskell [duplicate]如何在列表中找到最长的字符串?哈斯克尔[重复]
【发布时间】:2014-12-17 15:13:17
【问题描述】:

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

例如

["abc","ab","cb"]

会回来

"abc"

【问题讨论】:

  • 你可以用 fold 和 lambda 来做到这一点。
  • 该问题的答案使用导入的模块。我试图只使用前奏
  • @Arthur 呃,说真的,Data.List 导入有问题吗?
  • @Arthur 然后看第二个答案。
  • @Snps 你说得对,我会举报

标签: string list haskell max


【解决方案1】:

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

longest :: [String] -> String
longest xss = snd $ maximum $ [(length xs, xs) | xs <- xss]

也就是说,您首先将列表中的每个元素与其长度配对,然后根据字典顺序取最大的对,最后丢弃这对的长度分量,留下最长的字符串。


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

longest = maximumBy (comparing length)

comparingData.List换成on,可以写成

longest = maximumBy (compare `on` length)

最后两个版本的优点是它们有一个更通用的类型,即[[a]] -&gt; [a],然后是我上面给出的 all-Prelude 函数,它的类型最多可以泛化为Ord a =&gt; [[a]] -&gt; [a]

【讨论】:

    【解决方案2】:
    > import Data.List
    > import Data.Ord
    > maximumBy (comparing length) ["abc","ab","cb"]
    "abc"
    

    【讨论】:

    • 他只想要前奏
    【解决方案3】:

    一个简单的fold 应该这样做:

    λ> foldl1' (\acc x -> if length acc > length x then acc else x) ["aaa","c","ffff"]
    "ffff"
    

    在每次迭代中,比较acc是否大于迭代的当前元素并返回最大元素。但请注意,foldl1' 会在您提供空输入列表时崩溃。

    【讨论】:

    • foldl (\x y -&gt; if x &gt; y then x else y) "" [] 这样的东西可以解决空列表问题。
    • @matsjoyce 是的,我想把它作为练习留给 OP:P
    • 作为haskell的新手,你能解释一下foldl末尾的1'。另外, acc 是如何分配的?我正在尝试在脚本中实现这一点
    • @Arthur foldl1'foldl 函数的变体。大家可以看一下fold的定义来加深理解。这个chapter很好地解释了foldl。
    猜你喜欢
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    • 2012-06-20
    相关资源
    最近更新 更多