Pergunta

Estou um pouco confuso a respeito de como obter dois método para chamar uns aos outros (ou seja, tem A() B() chamada e B() chamada A()). Parece que F # apenas 'vê' o método depois de ter sido encontrado em código, por isso, se não tem, ele apenas diz valor ou construtor não foi definido .

Am I faltando algo muito básico aqui?

Foi útil?

Solução

'vamos rec ... e ...' é a sintaxe que você procura.

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

Veja também Adventures in F # Co -Recursion .

Outras dicas

Uma vez que a pergunta é sobre métodos, ea resposta de Brian é sobre funções, talvez seja útil para salientar que você pode usar uma sintaxe semelhante para tipos:

type A() =
    let b = new B()
    member x.MethodA() = b.MethodB()
and B() =
    member x.MethodB() = ()

Note-se também que os membros são 'deixe rec' por padrão (na verdade eu não acho que eles podem ser não recursivo).

F # 4.1 introduz mutuamente módulos recursiva e namespaces .

Estes são uma alternativa para a palavra-chave and.

module rec PingPong = // <------ rec keyword here.

    let pong() = 
        printfn "pong"
        ping() 

    let ping () = 
        printfn "ping"
        pong()

Os módulos define rec palavras-chave e namespaces que "permitem a todo o código contido ser mutuamente recursiva."

Funções declarou via let

let rec a () = b ()
and b () = ()

Estes são mutuamente funções recursivas .

Métodos dentro do mesmo tipo

type T () =
    member t.A () = t.B()
    member t.B () = ()

Esta é trivial; ele simplesmente funciona. Nota comentário de Abel embora.

Métodos dentro de diferentes tipos

type TypeA () =
    member t.A (b : TypeB) = b.B()

and TypeB () =
    member b.B () = ()

Este usa a sintaxe type ... and para tipos mutuamente recursivas .

Notas

Normalmente, and só é usado se as chamadas ocorrem em ambas as direções. Caso contrário, ele pode ser melhor para re-ordem as declarações de modo que a função chamada vem em primeiro lugar. Muitas vezes, é útil para o tipo de inferência e legibilidade para evitar dependências circulares, e não implica-los onde eles não são usados.

proponho para editar a questão, quer pedir funções em geral, ou para pedir diferentes tipos (caso em que eu iria remover os dois primeiros casos de esta resposta). Métodos são geralmente considerado um subconjunto de funções, que é o termo matemático geral. No entanto, todas as # funções F são tecnicamente métodos CLI , que é o que eles são compilados para. Como é, não está claro que a questão está pedindo, mas eu assumo a partir da resposta aceita que não só pedem métodos, como o título implicaria.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top