如何比较Haskell中同一列表中的多个字符串

Pus*_*yon 2 string recursion haskell functional-programming list

我正在尝试编写一个Haskell函数,它接受一个字符串列表,比较列表中的所有字符串,并输出一个长度最长的字符串列表.我想在没有任何预定义函数或导入的情况下执行此操作,我想尝试以递归方式计算出来.例如:

    longeststrings["meow","cats","dog","woof"] -> ["meow","cats","woof"]
Run Code Online (Sandbox Code Playgroud)

我知道这是一个愚蠢的例子,但我认为这证明了这一点.

我想做点什么

    longeststrings:: [string] -> [string]
    longeststrings []          = []
    longeststrings [x:xs]      = if (x > xs) x:longeststrings[xs]
Run Code Online (Sandbox Code Playgroud)

但我不知道如何只从列表中取出最大的字符串,或删除最小的字符串.我将不胜感激任何帮助.

Ada*_*ith 5

你可以轻而易举地跟踪最长的字符串和一个长度值的累加器.

longestStrings :: [String] -> [String]
longestStrings = go [] 0
  where
  go acc _ []       = acc  -- base case
  go acc n (x:xs)
    | length x > n  = go [x] (length x) xs
    -- if x is longer than the previously-seen longest string, then set
    -- accumulator to the list containing only x, set the longest length
    -- to length x, and keep looking
    | length x == n = go (x:acc) n xs
    -- if x is the same length as the previously-seen longest string, then
    -- add it to the accumulator and keep looking
    | otherwise     = go acc n xs
    -- otherwise, ignore it
Run Code Online (Sandbox Code Playgroud)

或者,正如Davislor在评论中正确提到的那样,这可以通过教导辅助函数来确定其最长的长度来实现.

longestStrings :: [String] -> [String]
longestStrings = foldr f []
  where
  f x []        = [x]
  f x yss@(y:_) =
    case compare (length x) (length y) of
      GT -> [x]
      EQ -> x : yss
      LT -> yss
Run Code Online (Sandbox Code Playgroud)

  • 哦不,`where`是完全不错的功能风格.我现在很想写另一个例子. (2认同)