я пытаю следующее:F # - Как расширить тип с помощью get_Zero, чтобы я мог использовать существующий тип в целом?
let c x = System.Numerics.Complex(x, 0.0)
let sum = [c 1.0; c 2.0] |> List.sum
Но я получаю эту ошибку:
The type 'System.Numerics.Complex' does not support the operator 'get_Zero'
Я прочитал правила, касающиеся расширений типа, из https://msdn.microsoft.com/en-us/library/dd233211.aspx, и попытаться сделать следующее:
module ComplexExtension =
let c x = System.Numerics.Complex(x, 0.0)
type System.Numerics.Complex with
// I also tried a bunch of other ways of writing these
// as static or instance members, but nothing worked
static member Zero = c 0.0
static member One = c 1.0
open ComplexExtension
let sum = [c 1.0; c 2.0] |> List.sum
Я до сих пор получаю эту ошибку.
Можно ли расширить тип с помощью оператора get_Zero? Или мне нужно создать свой собственный тип-оболочку около System.Numerics.Complex
и переопределить все операторы, если я хочу, чтобы он делал другие вещи, которые делают сложные числа?
Да, возможно, создание обертки - это путь. См. Здесь: http://stackoverflow.com/questions/3223660/can-existing-types-be-extended-to-work-with-seq-sum-etc – Petr
Вещь, которую вы ищете, называется «более высокой полиморфизм ", и, к сожалению, F # не поддерживает его вообще. Вот голосовая просьба пользователя, пожалуйста, проголосуйте: http: //fslang.uservoice.ком/форумы/245727-е-язык/предложения/5664242-симулировать-выше-kinded-полиморфизм –