হালনাগাদ
আমি ($)সদস্যের পরিবর্তে অপারেটর ব্যবহার করে একটি সহজ সংস্করণ পেয়েছি । Https://stackoverflow.com/a/7224269/4550898 দ্বারা অনুপ্রাণিত :
type SumOperations = SumOperations
let inline getSum b = SumOperations $ b // <-- puting this here avoids defaulting to int
type SumOperations with
static member inline ($) (SumOperations, x : int ) = x
static member inline ($) (SumOperations, xl : _ list) = xl |> List.sumBy getSum
বাকি ব্যাখ্যাগুলি এখনও প্রয়োগ হয় এবং এটি দরকারী ...
আমি এটি সম্ভব করার একটি উপায় খুঁজে পেয়েছি:
let inline getSum0< ^t, ^a when (^t or ^a) : (static member Sum : ^a -> int)> a : int =
((^t or ^a) : (static member Sum : ^a -> int) a)
type SumOperations =
static member inline Sum( x : float ) = int x
static member inline Sum( x : int ) = x
static member inline Sum(lx : _ list) = lx |> List.sumBy getSum0<SumOperations, _>
let inline getSum x = getSum0<SumOperations, _> x
2 |> getSum |> printfn "%d" // = 2
[ 2 ; 1 ] |> getSum |> printfn "%d" // = 3
[[2; 3] ; [4; 5] ] |> getSum |> printfn "%d" // = 14
আপনার উদাহরণ চলছে:
let list v = List.replicate 6 v
1
|> list |> list |> list |> list |> list
|> list |> list |> list |> list |> list
|> getSum |> printfn "%d" // = 60466176
এটি সদস্য সীমাবদ্ধতার সাথে এসআরটিপি ব্যবহারের উপর ভিত্তি করে:, static member Sumসীমাবদ্ধতার জন্য কোনও সদস্যকে টাইপ করা দরকার যা তাকে Sum
রিটার্ন দেয় int। এসআরটিপি ব্যবহার করার সময় জেনেরিক ফাংশনগুলি হওয়া দরকার inline।
এটা কঠিন অংশ নয়। শক্ত অংশটি Sumএকটি বিদ্যমান ধরণের মতো সদস্যকে "যুক্ত" করছে intএবং Listযা অনুমোদিত নয়। কিন্তু, আমরা এটা একটি নতুন ধরনের যোগ করতে পারেন SumOperationsএবং বাধ্যতা অন্তর্ভুক্ত (^t or ^a)
যেখানে ^tসবসময় হতে যাচ্ছে SumOperations।
getSum0Sumসদস্য সীমাবদ্ধতা ঘোষণা করে এবং অনুরোধ করে।
getSumSumOperationsপ্রথম ধরণের প্যারামিটার হিসাবে পাস করেgetSum0
static member inline Sum(x : float ) = int xসংযোগকারীকে জেনেরিক ডায়নামিক ফাংশন কলটি ব্যবহার করতে রাজি করা এবং কল করার static member inline Sum(x : int )সময় কেবল ডিফল্ট নয় TheList.sumBy
আপনি দেখতে পাচ্ছেন যে কিছুটা সংশ্লেষিত, সিনট্যাক্সটি জটিল এবং সংকলকটিতে কয়েকটি quirks চারপাশে কাজ করা প্রয়োজন ছিল তবে শেষ পর্যন্ত এটি সম্ভব হয়েছিল।
এই পদ্ধতিটি অ্যারে, টিপলস, বিকল্পগুলি ইত্যাদির সাথে বা আরও সংজ্ঞা যুক্ত করে তাদের কোনও সংমিশ্রণের সাথে কাজ করার জন্য বাড়ানো যেতে পারে SumOperations:
type SumOperations with
static member inline ($) (SumOperations, lx : _ [] ) = lx |> Array.sumBy getSum
static member inline ($) (SumOperations, a : ^a * ^b ) = match a with a, b -> getSum a + getSum b
static member inline ($) (SumOperations, ox : _ option) = ox |> Option.map getSum |> Option.defaultValue 0
(Some 3, [| 2 ; 1 |]) |> getSum |> printfn "%d" // = 6
https://dotnetfiddle.net/03rVWT
getSum (dictList (dictList (..... (dictList dictInt)))) nestedListযেখানে সংখ্যার সাথেdictListমিলিত[]হয় টাইপের সংখ্যার সাথেnestedList।