2016-04-14 14 views
5

私はhttp://elm-lang.org/examples/zipzipの例を見ていますが、正確には_がエルムの意味するところについての質問がありました。エルムではどういう意味ですか?

zip : List a -> List b -> List (a,b) 
zip xs ys = 
    case (xs, ys) of 
    (x :: xs', y :: ys') -> 
     (x,y) :: zip xs' ys' 

    (_, _) -> 
     [] 

私の勘では、それが「他のすべて」を意味するが、それは任意の有効な値を意味するということでしょうか?価値がない場合はどうなりますか?

+1

Dennis Reimannがこの記事で説明したように。 "_を使用すると、無視されるかスキップされる値のプレースホルダを定義できます。"#:。 –

答えて

8

_は、値を気にしない場所にマッチするために使用されるため、「その他すべて」の場合によく使用されます。

例のコード(_, _)には、のいずれかのタプルと2つの値が一致します。あなたはどちらの値にも気をつけないので、_に置き換えることもできます。より多くの例は、それはちょうどあなたがタプルから一つの値を気にどこであってもよいが、他のない、例えばfstin the core package

fst : (a,b) -> a 
fst (a,_) = 
    a 

の実装では、我々は、タプルの2番目の値を気にしない、そうでしょうその位置の_と一致します。

はエルムにはnullまたはundefinedありませんので、あなたは「無価値」でない程度が心配する必要はありません(何かが値を持たないならば、Maybeタイプが使用されています)。

+0

説明をありがとう! zipの例では、List aとList bの長さが異なるため、aまたはbの長さが異なるシナリオも(_、_)ケースで処理されますか?もしそうなら、 "_"値の1つも存在しないでしょうか? – wmock

+0

はい、リストの1つまたは両方が、最初のケースと一致しない場合は空リスト( '[]')になります(非存在ではなく、ただ空です:P)。 '_'は空のリストを含むものと一致します。 – robertjlooby

+0

これを正しく理解していれば、 '(zip [] [])'が起きたとき、空の配列を破壊することができないので、最初のケースに入りません。 '_'は任意のリストを受け入れ、空のリストを返します。それは正確ですか?そして確認するために、2つのケースのORDERが切り替わると、この関数は常に最初のケースに入るので間違っていますか? – wmock

関連する問題