अस्वीकरण: मेरे पास वर्तमान F # स्थापित मशीन नहीं है, इसलिए मैं अपने कोड का परीक्षण नहीं कर सकता। असल में, हालांकि, अगर आप हास्केल से sequence
चोरी, आप अपने कार्यक्रम के रूप में
let cartesian = sequence >> List.map product
लिखने और
cartesian [[1..99]; [1..99]]
यहाँ sequence
लिखने का तरीका बताया गया के रूप में यह चला सकते हैं। यह आपके द्वारा लिखे अनुक्रम अभिव्यक्ति का एक सामान्य संस्करण है। यह सिर्फ असीमित संख्या में सूचियों को संभालता है: { for x in xs do for y in ys do for z in zs ... yield [x;y;z;...] }
।
let rec sequence = function
| [] -> Seq.singleton []
| (l::ls) -> seq { for x in l do for xs in sequence ls do yield (x::xs) }
// also you'll need product to do the multiplication
let product = Seq.fold_left1 (*)
तो फिर आप अपने प्रोग्राम लिख सकते हैं के रूप में
let cartesian xs ys = [xs; ys] |> sequence |> List.map product
// ... or one-argument, point-free style:
let cartesian' = sequence >> Seq.map product
आप List
रों करने के लिए कुछ Seq
रों बदलने के लिए हो सकता है।
हालांकि, आपकी गैर-सामान्य सूची समझ का अर्थ अनुमान लगाने वाले लोगों की संख्या शायद sequence
नाम पहचानने से कहीं अधिक है, इसलिए आप सूची समझ के साथ शायद बेहतर हो सकते हैं। sequence
किसी भी समय आप गणना गणनाओं की एक पूरी सूची चलाने के लिए काम में आता है, हालांकि।
स्रोत
2009-06-01 21:32:41
संबंधित प्रश्न यहां: http://stackoverflow.com/questions/482866/f-cross-product-of-two-lists – Benjol