2010-06-04 43 views
5

在代码:传递什么?

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。 r从哪里来?

回答

5

lookup c simpleEscapes返回Maybe String值,该值可以是NothingJust <a string>r是包含在Just字符串,如线定义:

Just r -> text r 
1

您使用通过查找çsimpleEscapes返回的值,它的类型的也许case语句。也许有两个数据构造函数:Just和Nothing。 Just数据构造函数由一个值参数化,Nothing数据构造函数没有参数。

所以在这种情况下,r是Just数据构造函数的形式参数:它是查找返回值中的实际值。

2

如果你问的是引入的标识符,其中,它是由在case声明模式匹配约束,以同样的方式标识c是由函数定义的模式匹配的约束。

任何图案匹配可以引入用于相关表达的新标识符:

(\(Just x) -> x) foo 

let (Just x) = foo in x 

f (Just x) = x 

case foo of 
    Just x -> x 

...所有这些引入名为x新的标识符。实际上,它们几乎都是等价的,因为编译器会将它们全部转换为底层的case块。

3

case关键字引入了模式匹配,格式为case EXPR of (PATTERN -> EXPR)+。因此Just r是一种模式,它与lookup c simpleEscapes of的结果相匹配。在一个模式中,变量可以被绑定。基本上这意味着如果lookup c simpleEscapes of返回Just那么r将被绑定到该Just中的值,并且该表达式的结果将是text r

相关问题