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

rwa*_*ace 5 f# programming-languages functional-programming scala pattern-matching

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

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

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

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

sbl*_*lom 9

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

那是在你正在寻找的附近吗?


pad*_*pad 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"
Run Code Online (Sandbox Code Playgroud)

Active Patterns是一种强大的技术,你甚至可以以递归的方式编写它.它与模式匹配的结合为解构数据提供了方便的工具包.但是,模式匹配是无穷无尽的,因此您必须使用wildcard(_)作为最后一个模式.