2016-03-20 5 views
2

Я пытаюсь выяснить, как создать функцию, которая принимает список строк, и возвращает новый список, содержащий только самую длинную строку в списке.Уменьшить список до самой длинной строки в списке с Elm

Мне сложно определить несколько аспектов этой проблемы, в том числе, как отслеживать максимум и изменять его, когда есть новая длинная строка. Нужно ли использовать эффект/задачу?

Пример: функция, которая принимает ["один", "два", "три"] и возвращает ["три"], поскольку это самая длинная строка.

ответ

3

Если вы хотите функцию, которая дает вам самую длинную строку в списке:

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

Спасибо, что это работает отлично! – d3ddd

2

Вы можете сложить свой список, отслеживание самой длинной строки по пути:

import String exposing (length) 

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

Это имеет преимущество в производительности над List.sortBy, поскольку foldr принимает один удар на список, в то время как сортировку должен сортировать все элементы.

+0

Если это абсолютно необходимо, потому что это вызывает заметную потерю производительности, вы никогда не должны торговать читаемым кодом для менее читаемого кода. –

0

Хорошие новости: Вам не нужно использовать эффект или задачи.

длинная строка функция может быть определена следующим образом:

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" ] 
Смежные вопросы