「教科書で調べて」とか「フーグルして」と言うかもしれないハゲタカに、私はそうしました。
私は声明に出くわしました
recipe = (== "000001")
私にはある種のブール値のように見えますが、よくわかりません。GHCiでさまざまな方法でテストしてみましたが、機能するものが見つかりませんでした。誰かがそれが何を意味するのか説明できますか、そしてこの質問は次に誰かがグーグルハスケル(== "")をしたときの結果になります
それはセクションです。これrecipe = \x -> x == "000001"
は(と同じですrecipe x = x == "000001"
)と同等です。
これを理解するために使用できますGHCI
。
でGHCI
、入れlet recipe = (== "000001")
ます。これで、それがどのように機能するかを確認できます。:t recipe
タイプが何であるかを確認してみてください。これはを返すので、これはs(a )のrecipe :: [Char] -> Bool
リストを取り、。を返す関数のように見えます。Char
String
Bool
False
テストすると、を除くすべての入力に対して返されることがわかります"000001"
。
は演算子なので==
、一方の引数に部分的に適用でき、もう一方の引数を取り、結果を返す関数を返します。したがって、ここで== "000001"
は、の反対側を埋めるために1つの引数を取り==
、結果を返す関数を返します。
編集:定義があれば、recipe = ((==) "000001")
この説明は正しいでしょう。
これを理解するには、部分適用を調べる必要があります。==
関数の型はa -> a -> Bool
、同じ型の2つの引数を取り、を返す関数ですBool
。
ただし、これは型の関数でもあり、型のa -> (a -> Bool)
1つの引数を取りa
、署名付きの新しい関数を返しますa -> Bool
。それがここで起こっていることです。に1つの引数を指定した==
ので、タイプの新しい関数が返さa -> Bool
れました[Char] -> Bool
。この特定の場合は。
二項演算子@
の場合、式(@ x)
はを意味し(\y -> y @ x)
ます。
あなたの場合、それは(\y -> y == "000001")
すなわちになります。文字列を受け取り、それがに等しいかどうかを示す関数"000001"
。
(== arg)
または(arg ==)
演算子セクションです(他の演算子でも機能します-だけでなく==
)。これは、指定されたオペランドに演算子を部分的に適用することです。だから(== "foo")
と同じ\x -> x == "foo"
です。