क्या स्कैला में एक वाक्यविन्यास है जो निकालने वालों को अनुकूलन तर्क लेने की अनुमति देता है? यह उदाहरण थोड़ा सा है। मान लीजिए कि मेरे पास पूर्णांक पर एक बाइनरी खोज पेड़ है, और यदि मैं कुछ कस्टम मान द्वारा इसका मूल्य विभाजित करता हूं तो मैं वर्तमान नोड पर मिलान करना चाहता हूं। ,तर्क के साथ स्कैला निकालने वाला
type Tree =
| Node of int * Tree * Tree
| Empty
let (|NodeDivisibleBy|_|) x t =
match t with
| Empty -> None
| Node(y, l, r) -> if y % x = 0 then Some((l, r)) else None
let doit = function
| NodeDivisibleBy(2)(l, r) -> printfn "Matched two: %A %A" l r
| NodeDivisibleBy(3)(l, r) -> printfn "Matched three: %A %A" l r
| _ -> printfn "Nada"
[<EntryPoint>]
let main args =
let t10 = Node(10, Node(1, Empty, Empty), Empty)
let t15 = Node(15, Node(1, Empty, Empty), Empty)
doit t10
doit t15
0
स्काला में मैं ऐसी ही कुछ कर सकते हैं, लेकिन नहीं मैं काफी क्या चाहते हैं:
एफ # सक्रिय पैटर्न का उपयोग करना, मैं निम्न कर सकते हैं
sealed trait Tree
case object Empty extends Tree
case class Node(v: Int, l: Tree, r: Tree) extends Tree
object NodeDivisibleBy {
def apply(x: Int) = new {
def unapply(t: Tree) = t match {
case Empty => None
case Node(y, l, r) => if (y % x == 0) Some((l, r)) else None
}
}
}
def doit(t: Tree) {
// I would prefer to not need these two lines.
val NodeDivisibleBy2 = NodeDivisibleBy(2)
val NodeDivisibleBy3 = NodeDivisibleBy(3)
t match {
case NodeDivisibleBy2(l, r) => println("Matched two: " + l + " " + r)
case NodeDivisibleBy3(l, r) => println("Matched three: " + l + " " + r)
case _ => println("Nada")
}
}
val t10 = Node(10, Node(1, Empty, Empty), Empty)
val t15 = Node(15, Node(1, Empty, Empty), Empty)
doit(t10)
doit(t15)
यह अगर बहुत अच्छा होगा मैं कर सकता:
case NodeDivisibleBy(2)(l, r) => println("Matched two: " + l + " " + r)
case NodeDivisibleBy(3)(l, r) => println("Matched three: " + l + " " + r)
लेकिन यह एक संकलन समय त्रुटि है:। '=>' की उम्मीद है, लेकिन '(' पाया
विचार?
यह स्काला 2.10 सही है? –