【问题标题】:F# Method Definition SyntaxF# 方法定义语法
【发布时间】:2009-06-14 06:11:49
【问题描述】:

我有一个方法(在这种情况下是静态的),但我不太清楚定义它的确切语法。

static member FindPath : Queue<Node> startNode : Node endNode : Node nodes : List<Node> = 
    //this method will call two other to be constructed methods and return a 
    //queue that is the return value of one of them
    return new Queue<Node>()

它在startNode 和第一个节点之间的冒号上失败:

“标签类型的语法错误”

制作这样的方法的最佳方法是什么?

【问题讨论】:

    标签: syntax f# methods definition


    【解决方案1】:

    要使其成为多行,您可以在单独的行上进行调用

    static member FindPath (startNode : Node) (endNode : Node) (nodes : List<Node>) = 
            let resultOfMethod1 = CallMethod1()
            CallMethod2()
            new Queue<Node>()
    

    我还删除了返回类型,因为如果你返回这样的队列,你不应该需要它

    【讨论】:

    • 所以如果 CallMethod2 的返回类型是节点队列,那么它会自动返回吗?顺便说一句,我会接受这两个,但抱歉,所以不允许。
    • 是的,方法的最后一个表达式就是返回的那个。不需要“return”关键字。
    • F# 在推断参数类型时确实具有魔力。我敢打赌,如果 FindPath 仅使用带有节点或节点列表的函数的 startNode、endNode 和节点,那么您可以删除 FindPath 声明中的所有类型注释。
    【解决方案2】:
    static member FindPath (startNode : Node)
                           (endNode : Node)
                           (nodes : List<Node>)
                         : Queue<Node>
       = new Queue<Node>()
    

    【讨论】:

    • 那么问题就变成了定义这样的多行方法的语法是什么?
    • 在 F# 中,一切都与缩进有关。我注意到这不是您第一次询问多行。与方法定义缩进相比,只需将正文缩进 4 个空格(在 VS 中您可以只使用一个制表符)并编写正文。当方法完成时,只需删除最后一级缩进
    猜你喜欢
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多