使用 Elm 将列表缩减为列表中最长的字符串

Reduce List to longest String in the List with Elm

我正在尝试弄清楚如何创建一个接受字符串列表和 returns 只包含列表中最长字符串的新列表的函数。

我很难弄清楚这个问题的几个方面,包括如何跟踪最大值并在出现新的最长字符串时更改它。我需要使用效果/任务吗?

示例:采用 ["one"、"two"、"three"] 和 returns ["three"] 的函数,因为它是最长的字符串。

您可以折叠您的列表,沿途跟踪最长的字符串:

import String exposing (length)

findLongest = List.foldr (\x y -> if length x > length y then x else y) ""

List.sortBy 相比,这具有性能优势,因为 foldr 只需在列表中滑动一次,而排序必须对所有项目进行排序。

如果您只想要一个函数来给出列表中最长的字符串:

List.sortBy String.length >> List.reverse >> List.take 1

好消息:您不需要使用 Effect 或 Task。

一个最长的字符串函数可以定义如下:

import String exposing (length)

longerString : String -> String -> String
longerString s1 s2 = if length s2 > length s1 then s2 else s1

longestString : List String -> String
longestString = List.foldr longerString ""

然后你可以像这样使用它:

longestString ["one", "two", "three"] -- returns "three"

如果你希望结果是一个只有一个元素的列表,那也是可以的。

[ longestString [ "one", "two", "three" ] ] -- returns [ "three" ]