Как создать метод расширения (F #)?
Как создать метод расширения в F #, например, как это расширение С#:
public static string Right(this string host, int index)
{
return host.Substring(host.Length - index);
}
Ответы
Ответ 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)