首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只有Scala语言才有重载的提取器?

只有Scala语言才有重载的提取器?
EN

Stack Overflow用户
提问于 2012-05-12 09:52:03
回答 4查看 452关注 0票数 5

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

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

有没有其他语言可以进行模式匹配并允许这样的解耦?

关于这种解耦的利弊,有没有写过什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-05-12 12:46:43

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

这就是你要找的地方吗?

票数 9
EN

Stack Overflow用户

发布于 2012-05-12 15:44:55

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

第二篇文章中的示例可以使用Partial Active Patterns实现

代码语言:javascript
复制
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方式编写它。它与模式匹配的结合为解构数据提供了一个方便的工具包。但是,模式匹配是无穷无尽的,所以您必须使用通配符(_)作为最后一个模式。

票数 5
EN

Stack Overflow用户

发布于 2012-05-14 21:56:49

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10560422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档