在代码中:
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来自哪里?
答案 0 :(得分:5)
lookup c simpleEscapes
会返回Maybe String
值,该值可以是Nothing
或Just <a string>
。 r
是Just
中包含的字符串,由行:
Just r -> text r
答案 1 :(得分:3)
case关键字引入了模式匹配,其格式为case EXPR of (PATTERN -> EXPR)+
。因此Just r
是一种模式,与lookup c simpleEscapes of
的结果相匹配。在模式中,变量可以绑定。基本上这意味着,如果lookup c simpleEscapes of
返回Just
,则r
将绑定到Just
内的值,并且表达式的结果将为text r
。
答案 2 :(得分: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 :(得分:1)
您在lookup c simpleEscapes返回的值上使用了case语句,类型为Maybe。也许有两个数据构造函数:Just和Nothing。 Just数据构造函数由一个值参数化,Nothing数据构造函数没有参数。
所以在这种情况下,r是Just数据构造函数的形式参数:它是查找返回值的实际值。