gpt4 book ai didi

haskell - 在 Haskell 中, `this@(Sentence string _) = do` 是什么意思?

转载 作者:行者123 更新时间:2023-12-04 18:20:57 25 4
gpt4 key购买 nike

这是我被分配调试的 Haskell 程序的一部分:

process :: Sentence -> IO ()
process this@(Sentence string _) = do
render string
render "==>"
render $ translate this

render = putStrLn

data Sentence = Sentence String Task

translate :: Sentence -> String ; Incomplete Definition
translate (Sentence string task)
| ...

| ...

| ...

| ...

这个程序中我唯一不理解或不认识的部分是行 process this@(Sentence string _) = do我以前从未见过 this@ 并且我也不太确定 (Sentence string _) 中的下划线是什么意思。

最佳答案

this@ 是“as-pattern”的示例,而 _ 是通配符模式的示例。当我们不关心模式中那个点的值是什么时使用通配符模式,因此模式中的 _ 将与任何内容匹配,并且它不绑定(bind)任何本地名称/变量。

另一方面,当我们想要绑定(bind)一个额外的本地名称/变量同时也匹配它时,我们使用 as 模式。你可以考虑一下

process this@(Sentence string _) = ...

大致相当于

process this = let (Sentence string _) = this
in ...

它将 @ 符号左侧给出的额外名称绑定(bind)到匹配的任何值。 at 模式本身匹配所有内容,但 @ 符号右侧的内部模式也与其匹配的任何内容匹配 - 并且该模式很可能不匹配所有内容,在这种情况下它匹配只有一个 Sentence 构造器。

因此,如果 let 绑定(bind)中的模式匹配失败,at 模式版本和带有 let 绑定(bind)的版本会有不同的行为,因此当我们为一个函数定义多个 case 时,通常首选 at 模式,如它允许内部模式也影响调用函数的情况。例如

safeHead xs = let (x:_) = xs in Just x
safeHead [] = Nothing

[]调用时会失败,因为第一个参数的xs模式匹配成功,所以函数的第一个case被调用,然后xs 无法与 (x:_) 匹配。但是,如果我们用 as 模式编写:

safeHead xs@(x:_) = Just x
safeHead [] = Nothing

调用 [] 会很好,因为在我们决定使用函数的第一个 case 之前也会检查内部模式,所以尽管 xs 匹配[](x:_) 也与 [] 匹配,但失败了,因此调用了第二种情况。我意识到这是一个非常愚蠢的例子,尤其是当我们第二次不使用 xs 时,但我希望它能说明区别。

关于haskell - 在 Haskell 中, `this@(Sentence string _) = do` 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15278980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com