¿Cómo tener dos métodos de llamada entre sí?
-
22-08-2019 - |
Pregunta
Estoy un poco confundido en cuanto a cómo conseguir dos métodos para llamar entre sí (es decir, tienen A()
B()
llamada y llamada B()
A()
). Parece que F # sólo se 've' el método después de haber sido encontrado en el código, por lo que si no es así, sólo dice valor o constructor no se ha definido .
Me estoy perdiendo algo muy básico aquí?
Solución
'dejó rec ... y ...' es la sintaxis que está buscando.
let rec F() =
G()
and G() =
F()
Otros consejos
Dado que la pregunta se refiere a métodos, y la respuesta de Brian es acerca de las funciones, tal vez sea útil señalar que se puede utilizar una sintaxis similar para tipos:
type A() =
let b = new B()
member x.MethodA() = b.MethodB()
and B() =
member x.MethodB() = ()
Tenga en cuenta también que los miembros están 'permiten rec' por defecto (de hecho no creo que puede ser no recursivo).
F # 4.1 introduce mutuamente módulos y espacios de nombres recursivo .
Estos son una alternativa a la palabra clave and
.
module rec PingPong = // <------ rec keyword here.
let pong() =
printfn "pong"
ping()
let ping () =
printfn "ping"
pong()
La palabra clave rec
define módulos y espacios de nombres que "permitir todo código contenido para ser mutuamente recursivo."
Las funciones declaradas mediante let
let rec a () = b ()
and b () = ()
Estos son funciones mutuamente recursivos .
métodos dentro del mismo tipo
type T () =
member t.A () = t.B()
member t.B () = ()
Esto es trivial; simplemente funciona. Nota comentario de Abel embargo.
Métodos dentro de diferentes tipos
type TypeA () =
member t.A (b : TypeB) = b.B()
and TypeB () =
member b.B () = ()
Esto utiliza la sintaxis type ... and
para tipos mutuamente recursivos .
Notas
Normalmente, and
sólo se utiliza si las llamadas se producen en ambas direcciones. De lo contrario, puede que sea mejor para reordenar las declaraciones de manera que la función llamada es lo primero. A menudo es útil para el tipo de inferencia y la legibilidad para evitar dependencias circulares, y no implica que en los que no se utilizan.
propongo para editar la pregunta en Preguntar para las funciones en general, o para solicitar diferentes tipos (en cuyo caso me quite los dos primeros casos de esta respuesta). Los métodos se consideran generalmente ser un subconjunto de funciones, que es el término matemático general. Sin embargo, todas las funciones F # son técnicamente métodos CLI , ya que es lo que se compilan a. Como es, no está claro lo que la pregunta está pidiendo, pero supongo de la respuesta aceptada que no sólo se piden métodos, como el título implicaría.