Что передается? - PullRequest
       10

Что передается?

5 голосов
/ 05 июня 2010

В коде:

oneChar :: Char -> Doc
oneChar c = case lookup c simpleEscapes of
              Just r -> text r
              Nothing | mustEscape c -> hexEscape c
                       | otherwise   -> char c
    where mustEscape c = c < ' ' || c == '\x7f' || c > '\xff'

simpleEscapes :: [(Char, String)]
simpleEscapes = zipWith ch "\b\n\f\r\t\\\"/" "bnfrt\\\"/"
    where ch a b = (a, ['\\',b])

r не передается oneChar. Откуда взялся г?

Ответы [ 4 ]

5 голосов
/ 05 июня 2010

lookup c simpleEscapes возвращает значение Maybe String, которое может быть либо Nothing, либо Just <a string>. r - строка, содержащаяся в Just, как определено строкой:

Just r -> text r
3 голосов
/ 05 июня 2010

Ключевое слово case вводит совпадение с шаблоном, которое имеет форму case EXPR of (PATTERN -> EXPR)+. Таким образом, Just r - это шаблон, который соответствует результату lookup c simpleEscapes of. В шаблоне переменные могут быть связаны. По сути это означает, что если lookup c simpleEscapes of возвращает Just, то r будет привязано к значению внутри этого Just, а результатом выражения будет text r.

2 голосов
/ 05 июня 2010

Если вы спрашиваете, где вводится идентификатор, он связан с сопоставлением с шаблоном в операторе case, так же, как идентификатор c связан с сопоставлением с шаблоном в функцииопределение.

Любое сопоставление с образцом может вводить новый идентификатор для связанного выражения:

(\(Just x) -> x) foo

let (Just x) = foo in x

f (Just x) = x

case foo of 
    Just x -> x

... все они вводят новый идентификатор с именем x.На самом деле, все они в значительной степени эквивалентны, потому что компилятор преобразует их все в case блоки под капотом.

1 голос
/ 05 июня 2010

Вы используете оператор case для значения, возвращаемого lookup c simpleEscapes, который имеет тип Maybe. Возможно, имеет два конструктора данных: Just и Nothing. Конструктор данных Just параметризован одним значением, конструктор данных Nothing не имеет параметров.

Таким образом, в этом случае r является формальным параметром конструктора данных Just: это фактическое значение в возвращенном значении из поиска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...