8

「教科書で調べて」とか「フーグルして」と言うかもしれないハゲタカに、私はそうしました。

私は声明に出くわしました

recipe = (== "000001")

私にはある種のブール値のように見えますが、よくわかりません。GHCiでさまざまな方法でテストしてみましたが、機能するものが見つかりませんでした。誰かがそれが何を意味するのか説明できますか、そしてこの質問は次に誰かがグーグルハスケル(== "")をしたときの結果になります

4

4 に答える 4

28

それはセクションです。これrecipe = \x -> x == "000001"は(と同じですrecipe x = x == "000001")と同等です。

于 2013-02-13T23:55:16.013 に答える
12

これを理解するために使用できますGHCI

GHCI、入れlet recipe = (== "000001")ます。これで、それがどのように機能するかを確認できます。:t recipeタイプが何であるかを確認してみてください。これはを返すので、これはs(a )のrecipe :: [Char] -> Boolリストを取り、。を返す関数のように見えます。CharStringBool

Falseテストすると、を除くすべての入力に対して返されることがわかります"000001"

は演算子なので==、一方の引数に部分的に適用でき、もう一方の引数を取り、結果を返す関数を返します。したがって、ここで== "000001"は、の反対側を埋めるために1つの引数を取り==、結果を返す関数を返します。


編集:定義があれば、recipe = ((==) "000001")この説明は正しいでしょう。

これを理解するには、部分適用を調べる必要があります。==関数の型はa -> a -> Bool、同じ型の2つの引数を取り、を返す関数ですBool

ただし、これは型の関数でもあり、型のa -> (a -> Bool)1つの引数を取りa、署名付きの新しい関数を返しますa -> Bool。それがここで起こっていることです。に1つの引数を指定した==ので、タイプの新しい関数が返さa -> Boolれました[Char] -> Bool。この特定の場合は。

于 2013-02-13T23:55:16.060 に答える
7

二項演算子@の場合、式(@ x)はを意味し(\y -> y @ x)ます。

あなたの場合、それは(\y -> y == "000001")すなわちになります。文字列を受け取り、それがに等しいかどうかを示す関数"000001"

于 2013-02-13T23:55:03.617 に答える
5

(== arg)または(arg ==)演算子セクションです(他の演算子でも機能します-だけでなく==)。これは、指定されたオペランドに演算子を部分的に適用することです。だから(== "foo")と同じ\x -> x == "foo"です。

于 2013-02-13T23:55:11.800 に答える