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

使用Elm将列表减少为列表中最长的字符串,elm,Elm,我试图弄清楚如何创建一个函数,该函数接受一个字符串列表并返回一个只包含列表中最长字符串的新列表 我很难弄清楚这个问题的几个方面,包括如何跟踪最大值并在出现新的最长字符串时更改它。我需要使用效果/任务吗 示例:一个函数,它接受[“一”、“二”、“三”]并返回[“三”],因为它是最长的字符串。您可以折叠列表,同时跟踪最长的字符串: 导入字符串(长度) findLongest=List.foldr(\x y->if length x>length y然后x else y)” 这比列表具有性能优势。s

我试图弄清楚如何创建一个函数,该函数接受一个字符串列表并返回一个只包含列表中最长字符串的新列表

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


示例:一个函数,它接受[“一”、“二”、“三”]并返回[“三”],因为它是最长的字符串。

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

导入字符串(长度)
findLongest=List.foldr(\x y->if length x>length y然后x else y)”

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

如果您只需要一个函数,它可以为您提供列表中最长的字符串:

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

好消息:您不需要使用效果或任务

最长字符串函数的定义如下:

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" ]

除非是绝对必要的,因为这会导致明显的性能损失,否则永远不要用可读性较差的代码来交换可读性较差的代码。