2017-06-22 7 views
0

私はhaskellを初めて使っています。誰かが私はHaskellでのコード行を解釈する方法を説明することができます:haskellコードを理解する

filter (\(_, (varible1, _)) -> variable1 `notElem` [something1, something2]) 
+4

あなたが問題を抱えているどの部分? – Carcigenicate

+0

実際には 'filter(\(_、(varible1、_))'とコード内のフローを理解できません –

+2

括弧を詳しく調べる必要があると思います。 '(\(_、(varible1、_) )) - > variable1 \ 'notElem \' [something1、something2]) 'は単一のラムダ式です –

答えて

7
-- Filter a list... 
filter 

-- ...of nested tuples where the first element of the second element of the tuple... 
(\(_, (variable1, _)) -> 

-- ...is not an element of [something1, something2] 
variable1 `notElem` [something1, something2]) 

(_, (varible1, _))は、ネストされたタプル、および名前の要素のうちの1つを解体します。何が起こっているのかを理解するために分解を見てください。

+0

これは返されますか? "タプル? –

+0

はい、' [(1、(2、3)]、(9、(8,7))] 'のようなもののリストを受け取り、同じタイプのリストを返します正に、ネストされたタプルはここでは乱雑になります。ネストされたタプルを後で使用する必要がないかぎり、リストを最初にペーストしてネストを削除します。 – Carcigenicate

+0

あなたの説明のためにありがとうたくさん:D –

5

始めから始めましょう。

\p -> e 

pパターンとepに表示される変数を使用することができる式であるラムダ抽象(匿名関数)です。

(_, (variable1, _)) 

は、対を構成するコンストラクタ(,)から構築されたパターンである。いくつかのペアがあります:

(1, 2) 
("Hello", "world!") 
(1, (2, 3)) 

ここには、ラムダ抽象化で使用されるいくつかのパターンがあります。

\(x, y) -> x 
\(x,(y,z)) -> y 

第2のパターンが(1, (2, 3))ようなペアと一致し、第二の要素の最初の要素を与えます。この場合、2となります。その形はあなたの質問のパターンと似ていますが、あなたのパターンでは_はどうですか?

_は有効な変数名です(変数は下線または小文字で始まります)。これは、「使用しない変数」を意味するために使用されます。パターン(_, (y, _))は、パターンが(x, (y, z))に似ていますが、名前がyの唯一の変数です。通常、パターン内で変数名を再利用することはできません。例えば(x,x)は無効なパターンです。あなたは_を再利用することが許されていますが、ハスケルはあなたがその価値を捨てようとしていることを知っているからです。

今、私たちは、表現

\(_, (variable1, _)) -> variable1 

それは第二の要素自体はペアでペアを取り、第二の要素の最初の要素を与えるタイプ(a, (b, c)) -> bの関数であると理解することができます。

今、私たちはこの表現を理解するために

variable1 `notElem` [something1, something2] 

を理解する必要があり、我々はバッククォートは何をすべきか知っている必要があります。バッククォート内の識別子を囲むことで、それは中文オペレータになります。中置演算子は通常、x + yxs ++ ysのような記号で綴られています。バックチックでは、notElemのような通常の識別子を埋め込み演算子に変換できます。これは、上記の式は、項目と同じタイプのアイテムのリストを受け取り、True与える関数は、商品がない場合、リストとFalseに表示されていない

notElem variable1 [something1, something2] 

notElemと同じであることを意味しますさもないと。メンバーシップのテストでは、elemの反対です。

最後に、filterfilter p xsは、述語p(すなわち、Boolを返す関数)を受け取り、リストxsをフィルタリングするために使用する関数です。 filterは、p xがtrueの場合に要素(xと呼ぶ)が含まれる新しいリストを提供します。これはxsのリストをフィルタリングし、述語が真である要素を持つ新しいリストを与える。例えば、

> filter even [1,2,3,4] 
[2,4] 

だから、私たちは、これが第二の要素のペアでペアのリストを受け取り、その第二の要素であるペアのリストにそれをフィルタリングする機能を提供します

filter     -- filter a list 
    (\(_, (variable1, _)) -- by matching on the first element 
         -- of the second element of a pair 
         -- and calling it 'variable1' 
    -> variable1 `notElem` [something1, something2]) 
         -- and giving `True` if the element 
         -- is neither 'something1' nor 'something2' 

持っています最初の要素がsomething1でもsomething2でもないペア。

我々はf以下、それを呼び出し、それを適用することができます

f = filter (\(_, (varible1, _)) -> variable1 `notElem` [something1, something2]) 

> f [(1,(something1,2)), (1,(something3,3))] 
[(1,(something3,3))] 
+0

詳しい説明をありがとう:D –