2015-10-13 18 views
7

私は次の関数を定義したいと思います:Elm Arrayから "Nothing"値を除外する方法は?

compactAndConvertToList : Array (Maybe String) -> List String 

この関数は、指定された配列内のすべてのNothing外観を削除し、Listに変換する必要があります。

私は下の解決策を考え出しましたが、少し汚れています。

これを達成するより良い方法はありますか?

import Graphics.Element exposing (..) 
import Array 

model : Array.Array (Maybe String) 
model = Array.fromList [ Just "Hello", Just "Stack", Nothing, Just "Overflow" ] 


compactAndConvertToList : Array.Array (Maybe String) -> List String 
compactAndConvertToList maybeStrings = 
    maybeStrings 
    |> Array.filter (\x -> x /= Nothing) 
    |> Array.map (Maybe.withDefault "") 
    |> Array.toList 


main = 
    model 
    |> compactAndConvertToList 
    |> show 

答えて

13

最終的な結果がリストの場合は、配列をリストに変換して操作するほうがよいでしょう。

​​

あなたは高階関数に慣れていないなら、あなたはこのようにそれを書くことができます:

compactAndConvertToList arr = List.filterMap identity (Array.toList arr) 

我々は、我々の配列を取る、それにToListメソッドを適用し、それをfilterMap適用されます。フィルタマップは、多分を生成する関数を取り、リスト内のすべての要素に適用し、Nothingの場合を破棄します。すでに存在しているNothingの値を破棄するID関数を適用するだけです。

一般的に、配列は高速ランダムアクセスには適していますが、コレクション全体を複数回トラバースしている場合、リストは高速になる傾向があります。しかし、常に明確なやり方で始め、必要に応じて最適化してください。

+0

どうもありがとう!私は '>'で最初のバージョンが好きです。 'Array'と' List'との関連性の低い質問:(例えば、[this game](http://fgcos.com/puzzle/barley-break)の)2次元配列を表すモデルを構築するには、それは良いですか? 'Array'sの' Array'を使うのですか? 'List'の特定のインデックスでアイテムを取得する方法が見つかりませんでした。 –

+0

ええ、あなたは間違いなくそのリストを望んでいない、特定の要素を見て非常に遅いです。配列の配列はあなたの最善の策です。 – jmite

+0

クール。ご協力いただきありがとうございます! –

0

多分、これは2018年のように良い答えです。elm-community/maybe-extraパッケージを使用してください。

例:

Maybe.Extra.values [Just 1, Nothing, Just 3] 

戻り値:

[1,3] 
関連する問題