为什么诸多编程语言都将模式匹配作为重要构成

如题所述

简单来说, 模式匹配提供一个方便的解构(Destructuring)数据结构的方式, 而且构造跟解构的语法是类似(甚至相同)的可以加强语言的一致性.

以语法和传统的C比较相近的Rust为例

struct Point {
x: i32,
y: i32,
}

let origin = Point { x: 0, y: 0 };
//^^^^^^^^构造^^^^^^^^^

match origin {
Point { x: x, y: y } => println!("({},{})", x, y),
//^^^^^^^^解构^^^^^^^^^
}

via Patterns

但是解构数据结构都用模式匹配也有不方便的地方, 当数据结构比较"浅"的时候, 模式匹配还是比较好用, 就像上面的例子一样, 但是当数据结构比较"深"的时候, *只有*模式匹配的语言做get/set操作就略麻烦

data Person = P { name :: String
, addr :: Address
}
data Address = A { street :: String
, city :: String
, postcode :: String
}

setPostcode :: String -> Person -> Person
setPostcode pc p = p { addr = addr p { postcode = pc }}

via https://notepad.mmakowski.com/Tech/Haskell%20Exchange%202013
因为postcode这个成员藏得比较深, 想一次过set postcode, 做的解构次数会很多, 实际中肯定会存在这种情况, 想一下各种一层嵌一层的JSON. 其中一个解决方法就是用一个中间变量先把address拿出来, 再拿postcode. 这就失去了 @肖剑 在评论提到的可以减少中间变量的便利.

如果能像OO用"."来访问: person.address.postcode = newPostcode , 不是更加方便?

深入下去偏离题目讨论的内容, 关于"."的话可以看Erik Merijer的 The essence of data access in cω: The power is in the dot.

Haskell对这个问题的解决办法是lens: Lenses, Folds and Traversals这个库, 这是个简单的介绍 https://gist.github.com/patrickt/d43031e3b69f1a4ff8c9 , 记住, 千万不要看实现, 千万不要!
温馨提示:答案为网友推荐,仅供参考
相似回答