Общий конструктор F # и ошибка FS0670 - PullRequest
0 голосов
/ 06 ноября 2018

Я обнаружил некоторые проблемы с ошибкой FS0670 ​​(This code is not sufficiently generic. ...) внутри StackOverflow, но ни одно из предложенных решений не работает нормально с моей проблемой (я новичок, возможно, мне не хватает некоторых концепций F #).

У меня есть следующая общая структура, которую я хотел бы работать только с примитивными типами (т. Е. Int16 / 32/64 и single / float / decimal).

[<Struct>]
type Vector2D<'T when 'T : struct and 'T:(static member get_One: unit -> 'T) and 'T:(static member get_Zero: unit -> 'T) > = 

    val x : 'T
    val y : 'T

    new( xp: 'T, yp: 'T ) = { x = xp; y = yp }

Но с новым конструктором я получаю упомянутую ошибку FS0670.

Кто-нибудь знает возможное решение? Большое спасибо заранее.

1 Ответ

0 голосов
/ 06 ноября 2018

Нельзя иметь статически разрешенных параметров типа для структур.

Они действительны только для встроенных функций. То, что вы пытаетесь сделать (ограничить параметр типа требованием определенных методов), в этом случае невозможно.

Самое близкое, что вы можете получить, это удалить ограничения членов из структуры и создать встроенные функции, которые обрабатывают структуру для вас:

[<Struct>]
type Vector2D<'T when 'T : struct> =
    val x : 'T
    val y : 'T

    new( xp: 'T, yp: 'T ) = { x = xp; y = yp }

let inline create< ^T when ^T : struct and ^T:(static member get_One: unit -> ^T) and ^T:(static member get_Zero: unit -> ^T)> (x : ^T) (y : ^T) =
    Vector2D< ^T> (x, y)


create 2.0 3.0 |> ignore
create 4   5   |> ignore
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...