什么是传递?

时间:2010-06-04 21:37:37

标签: haskell syntax

在代码中:

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来自哪里?

4 个答案:

答案 0 :(得分:5)

lookup c simpleEscapes会返回Maybe String值,该值可以是NothingJust <a string>rJust中包含的字符串,由行:

定义
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数据构造函数的形式参数:它是查找返回值的实际值。