Подтвердить что ты не робот

Как создать метод расширения (F #)?

Как создать метод расширения в F #, например, как это расширение С#:

    public static string Right(this string host, int index)
    {
        return host.Substring(host.Length - index);
    }
4b9b3361

Ответ 1

Для расширения F #, которое можно вызвать из F #:

type System.String with
  member x.Right(index) = x.Substring(x.Length - index)

Обратите внимание, что с Beta 1 это не приводит к методу С# -compatible extension.

Для создания методов расширения, видимых с С# (но не используемых в качестве методов расширения в F #), см. ссылку в редакторе Брайана в исходное сообщение.

Ответ 2

Я знаю, что это не отвечает на ваш вопрос, но стоит отметить. В F # и других функциональных языках вы часто видите модули со статическими методами (например, модуль Seq), которые предназначены для составления с другими функциями. Насколько я видел, методы экземпляров нелегко скомпонованы, что является одной из причин существования этих модулей. В случае этого расширения вы можете добавить функцию в модуль String.

module String =
    let right n (x:string) =
        if x.Length <= 2 then x
        else x.Substring(x.Length - n)

Затем он будет использоваться так.

"test"
|> String.right 2 // Resulting in "st"

["test"; "test2"; "etc"]
|> List.map (String.right 2) // Resulting in ["st"; "t2"; "tc"]

Хотя в этом случае метод расширения будет не намного больше кода.

["test"; "test2"; "etc"]
|> List.map (fun x -> x.Right 2)