2016-03-20 8 views
2

文字列のリストを取得し、リスト内の最も長い文字列のみを含む新しいリストを返す関数を作成する方法を理解しようとしています。リストをElmでリスト内の最も長い文字列に減らす

私はこの問題のいくつかの側面を把握するのに苦労しています。これは、最大のものを追跡し、新しい最長の文字列があるときに変更する方法です。エフェクト/タスクを使用する必要がありますか?

例:["one"、 "two"、 "three"]をとり、最も長い文字列であるため["three"]を返す関数。

答えて

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

仕分けがしている間foldrは、リストに単一スワイプを取っているので、これは、List.sortBy以上のパフォーマンス上の利点を持っていますすべてのアイテムを並べ替えます。

+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" ] 
関連する問題