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í?

¿Fue útil?

Solución

'dejó rec ... y ...' es la sintaxis que está buscando.

let rec F() = 
    G()
and G() =
    F()

aventuras en Fa # Co -Recursion .

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top