至少在一些ML系列语言中,您可以定义可以执行模式匹配的记录,例如http://learnyouahaskell.com/making-our-own-types-and-typeclasses -其基本思想是定义一个带有命名字段的记录类型,使用这些字段作为参数自动创建一个构造函数,以便您可以创建该类型的记录,并且使用这些字段作为参数自动创建一个提取器,以便您可以对该类型的记录进行模式匹配。
Scala更进一步,允许存储在记录中的字段、构造器参数和提取器参数彼此解耦,例如http://daily-scala.blogspot.com/2009/11/overloaded-unapply.html -在这方面它实现了支持面向对象和函数式编程的目标。(当然,面向对象的语言通常允许将存储字段和构造函数参数解耦,尽管它们通常没有提取器。)
有没有其他语言可以进行模式匹配并允许这样的解耦?
关于这种解耦的利弊,有没有写过什么?
发布于 2012-05-12 12:46:43
我承认我没有100%的背景知识来理解你的问题,但我可以说F#有一个叫做"Active Patterns“的功能,它似乎可以用来构建与你的daily-scala链接演示的功能相同的功能。
这就是你要找的地方吗?
发布于 2012-05-12 15:44:55
不,F#也提供了该功能。
第二篇文章中的示例可以使用Partial Active Patterns实现
let (|String|_|) = function "s" -> Some "yay" | _ -> None
let (|Int|_|) = function 1 -> Some "hmm" | _ -> None
let (|StringList|_|) = function "x" -> Some [1; 2; 3] | _ -> None
let (|IntList|_|) = function 1 -> Some ["one"; "two"] | _ -> None
match 1 with
| Int s -> printfn "%O" s
| _ -> printfn "Unmatched"
match "s" with
| String s -> printfn "%O" s
| _ -> printfn "Unmatched"
match "x" with
| StringList [x; y; z] -> printfn "%O" (x, y, z)
| _ -> printfn "Unmatched"
match 1 with
| IntList [x; y] -> printfn "%O" (x, y)
| _ -> printfn "Unmatched"Active Pattern是一种强大的技术,您甚至可以用recursive方式编写它。它与模式匹配的结合为解构数据提供了一个方便的工具包。但是,模式匹配是无穷无尽的,所以您必须使用通配符(_)作为最后一个模式。
发布于 2012-05-14 21:56:49
作为参考,Don Syme (F#的发明者)写了一篇关于F#的“活动模式”的论文:Extensible Pattern Matching Via a Lightweight Language Extension – Syme, et al.
https://stackoverflow.com/questions/10560422
复制相似问题