> (define h #hash((a . 11) (b . 0)))
> (define (f h key)
(match h
[(hash-table (key value)) value]
[_ 'do-something-else]))
> (f h 'a)
'do-something-else ;; expect 11如何修改match模式,以便上面的函数返回与(hash-ref h key 'do-something-else)相同的
一个问题似乎是match是自动引用key,因此它实际上与'key匹配,而不是key局部变量的值。第二个问题是,match hash-table似乎希望匹配整个哈希表,而不是仅仅匹配一个键值对。
发布于 2018-09-10 11:49:09
如何复制hash-ref的行为
要复制hash-ref的行为,您需要做两件事:
(1)使用key模式,该模式只匹配与参数key值相等的内容。您可以使用 pattern来完成这一任务。
(hash-table ((== key) value))(2)如果有key以外的其他条目,则匹配哈希表。您可以通过添加_ ...来匹配其他条目来做到这一点。
(hash-table ((== key) value) _ ...)在以下方面:
(define (f h key)
(match h
[(hash-table ((== key) value) _ ...) value]
[_ 'do-something-else]))使(f h key)的行为像(hash-ref h key 'do-something-else)一样。
为什么你的第一次尝试没有成功
你的模式:
(hash-table (key value))不自动引用key,使其字面上与'key匹配。相反,它匹配只有一个条目的任何哈希表:
> (match (hash 'anything-goes 11)
[(hash-table (key value)) value]
[_ 'do-something-else])
11这是因为key被解释为模式,标识符被解释为模式匹配任何东西。如果您将它命名为其他东西并在身体中使用它,您可以更清楚地看到这一点:
> (define (f h key-arg)
(match h
[(hash-table (key-pat value))
(printf "key-arg = ~v\n" key-arg)
(printf "key-pat = ~v\n" key-pat)
value]))
> (f (hash 'anything-goes 11) 'a)
key-arg = 'a
key-pat = 'anything-goes
11当您编写“碰巧”具有与局部变量相同名称的标识符模式时,它会对其进行阴影,就像下面的示例所示:
> (let ([x "local variable"])
(match (list 1 2 3)
[(list 1 2 x)
x]))
3模式中的x匹配任何东西,因此它与3匹配。模式隐藏了x,因此当主体使用x时,它引用的是3,而不是局部变量。由于这种阴影,局部变量从未实际使用过。
https://stackoverflow.com/questions/52250601
复制相似问题