使用 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" ]
我正在尝试弄清楚如何创建一个接受字符串列表和 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" ]