В следующем примере кода демонстрируется реализация шаблона посетителя в F #.
module VisitorPattern
type IVisitor =
abstract Visit : ObjectA -> unit
abstract Visit : ObjectB -> unit
and IVisitable =
abstract InvokeVisit : IVisitor -> unit
and ObjectA =
interface IVisitable with
member this.InvokeVisit (visitor: IVisitor) =
visitor.Visit(this)
and ObjectB =
interface IVisitable with
member this.InvokeVisit (visitor: IVisitor) =
visitor.Visit(this)
type MyVisitor =
member this.Visit (a : ObjectA) =
printfn "Visited object A"
member this.Visit (b : ObjectB) =
printfn "Visited object B"
Это нормально компилируется, но мы ограничены тем, что все типы, реализующие IVisitable
, в одном файле из-за использования ключевого слова and
. Это ключевое слово кажется необходимым для разрешения взаимных ссылок на типы.
Есть ли способ реализовать этот шаблон таким образом, чтобы мы не ограничивались одним файлом?
(Я не спрашиваю мнения о том, следует ли вам использовать этот шаблон в F #)
РЕДАКТИРОВАТЬ: я задаю этот вопрос, потому что шаблон посетителя актуален при взаимодействии с кодом C #.
member this.InvokeVisit (visit : ObjectA -> unit) = visit this
. - person rmunn   schedule 25.06.2019namespace rec NamespaceNameHere
docs.microsoft.com/en-us/dotnet/ fsharp / language-reference /, но он вам почти наверняка не понадобится! Если вы включите его, все станет немного труднее читать, и очень трудно вернуться назад. По моему опыту, лучше просто притвориться, что его не существует, потому что это уводит вас от счастливого пути, особенно если вы не знакомы с F #. - person VoronoiPotato   schedule 25.06.2019