Я в настоящее время чтения «Real World Haskell» и смущает одна функция реализована там:Область видимости анонимных функций
parseP5_take2 :: L.ByteString -> Maybe (Greymap, L.ByteString)
parseP5_take2 s =
matchHeader (L8.pack "P5") s >>?
\s -> skipSpace ((), s) >>?
(getNat . snd) >>?
skipSpace >>?
\(width, s) -> getNat s >>?
skipSpace >>?
\(height, s) -> getNat s >>?
\(maxGrey, s) -> getBytes 1 s >>?
(getBytes (width * height) . snd) >>?
\(bitmap, s) -> Just (Greymap width height maxGrey bitmap, s)
То, что я не могу получить то, как width
, height
и другие просочилась из анонимной функции и стал доступен в последнем выражении.
Точное место в RWH: http://book.realworldhaskell.org/read/code-case-study-parsing-a-binary-data-format.html#id624895
Упрощенный собственный кусок кода не удается, как я ожидал:
Prelude> (\x -> x) 5 + (\y -> x) 6
<interactive>:4:22: Not in scope: `x'
Так почему же он работает в коде?
Но не ''? 'Левый ассоциативный? Они даже объясняют это как «Другими словами,« a >>? B >>? C' будет оцениваться слева направо, так как «(a >>? B) >>? C')« – zerkms
'>>? 'лево-ассоциативный, но' '' '' жадный и будет потреблять столько, сколько может; он не остановится, когда приблизится к другому '>>?'. – icktoofay