F #

2008-09-12 17 views
8

में हास्केल सूची अंतर ऑपरेटर F # में Haskell की सूची अंतर ऑपरेटर \\ के बराबर ऑपरेटर है?F #

उत्तर

4

बाउंस था, अभी तक मेरा मानना ​​है कि इसके लायक है यहां (/-/) (Haskell के \\ का एफ # संस्करण) के कार्यान्वयन को लिखने के लिए:

let flip f x y = f y x 

let rec delete x = function 
    | [] -> [] 
    | h :: t when x = h -> t 
    | h :: t -> h :: delete x t 

let inline (/-/) xs ys = List.fold (flip delete) xs ys 

यह हास्केल के \\ के रूप में काम करेगा, ताकि (xs @ ys) /-/ xs = ys। उदाहरण के लिए: (7 :: [1 .. 5] @ [5 .. 11]) /-/ [4 .. 7][1; 2; 3; 5; 7; 8; 9; 10; 11] में मूल्यांकन करता है।

4

नहीं ... बस इसे लिखें और इसे विशेष वर्णों के सेट का उपयोग करके एक इंफिक्स ऑपरेटर बनाएं। बैकस्लैश (\) नीचे दी गई सूची में नहीं है, इसलिए यह इंफिक्स ऑपरेटर के रूप में काम नहीं करेगा। देखें manual:

इन्फ़िक्स-op: =

or || & && <OP >OP $OP = |OP &OP ^OP :: -OP +OP *OP /OP %OP 

**OP 

उपसर्ग-op: =

!OP ?OP ~OP -OP +OP % %% & && 
+4

"// इंफिक्स ऑपरेटर के रूप में काम करेगा"। नहीं, यह नहीं होगा। यह एफ # में एक एकल पंक्ति टिप्पणी है। –

-3

मान लिया जाये कि क्या तुम सच में करने के बजाय पारंपरिक सेट अंतर चाहते अजीब आदेश दिया है, लेकिन हसनेल स्पष्ट रूप से प्रदान करता है कि हंसेल मल्टीसेट घटाव, अंतर्निहित set फ़ंक्शन का उपयोग करके सूचियों को केवल सेट में कनवर्ट करें और फिर अंतर्निहितका उपयोग करें

set xs - set ys 

उदाहरण के लिए:: वियोजक के सेट से

> set [1..5] - set [2..4];; 
val it : Set<int> = seq [1; 5] 
+3

यह डुप्लिकेट को सही तरीके से संभाल नहीं पाएगा। –

+0

संपादन अभी भी डुप्लिकेट को सही तरीके से संभाल नहीं करता है। \\ ऑपरेटर एक सेट-फ़र्क व्यवहार प्रदान नहीं करता है, यह एक बैग-अंतर व्यवहार प्रदान करता है। – ScottWest

+0

@ स्कॉट: धन्यवाद। ऐसा लगता है कि यह संभवतः एक वफादार अनुवाद करने लायक नहीं है। मुझे संदेह है कि कोई भी उस कार्यक्षमता को कभी भी चाहेगा ... –

1

फ़िल्टर आइटम: सेट अंतर की गणना करने केऑपरेटर

let (/-/) xs ys = 
    let ySet = set ys 
    let notInYSet x = not <| Set.contains x ySet 
    List.filter notInYSet xs 
0

मैं इस का उपयोग कर रहा:

let (/-/) l1 l2 = List.filter (fun i -> not <| List.exists ((=) i) l2) l1 

किसी को भी एक समस्या देखता है, मुझे पता है।

सूचियों के लिए है, इसलिए परिणाम में डुप्लिकेट हो सकते हैं। उदाहरण के लिए:

[1;1;2] /-/ [2;3] would be eq to [1;1] 
संबंधित मुद्दे