5

在至少一些 ML 家族语言中,您可以定义可以在其上执行模式匹配的记录,例如http://learnyouahaskell.com/making-our-own-types-and-typeclasses - 基本思想是您定义一个具有命名字段的记录类型,使用这些字段作为参数自动创建构造函数,以便您可以创建该类型的记录,并且使用这些字段作为参数自动创建提取器,以便您可以对该类型的记录进行模式匹配。

Scala 更进一步,允许存储在记录中的字段、构造函数参数和提取器参数彼此分离,例如http://daily-scala.blogspot.com/2009/11/overloaded-unapply.html -在这方面,它实现了支持面向对象和函数式编程的目标。(当然,面向对象的语言通常允许将存储的字段和构造函数参数解耦,尽管它们通常没有提取器。)

是否有其他语言具有模式匹配并允许这种解耦?

有没有关于这种脱钩的利弊的文章?

4

4 回答 4

9

我承认我没有 100% 的背景知识来理解您的问题,但我可以说 F# 有一个名为“ Active Patterns ”的功能,它似乎可用于构建与您的daily-scala链接演示相同的功能。

那是在你要找的附近吗?

于 2012-05-12T04:46:42.903 回答
5

不,F# 也提供了该功能。

第二篇文章中的示例可以使用部分活动模式来实现:

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 Patterns 是一种强大的技术,你甚至可以用递归的方式来编写它。它与模式匹配的结合为解构数据提供了一个方便的工具包。但是,模式匹配并不详尽,因此您必须使用通配符(_)作为最后一个模式。

于 2012-05-12T07:44:55.267 回答
4

作为参考,Don Syme(F# 的发明者)写了一篇关于 F# 的“活动模式”的论文:Extensible Pattern Matching Via a Lightweight Language Extension – Syme 等。

于 2012-05-14T13:56:48.590 回答
4

类型化函数式语言中的一流模式由来已久。

在 Haskell 领域,我们使用-XViewPatterns程序化模式的扩展。

第一个真正的视图模式可以追溯到 Phil Wadler 1987 年关于视图的论文

于 2012-05-14T18:27:00.040 回答