【问题标题】:function parameter errors in Standard ML标准 ML 中的函数参数错误
【发布时间】:2014-03-31 05:49:56
【问题描述】:

我正在尝试实现一个使用此数据类型的函数 treeToString:

datatype Tree = LEAF of string | NODE of Tree list;

还有这棵树:

val L1a = LEAF "a"
val L1b = LEAF "b"
val L1c = LEAF "c"
val L2a = NODE [L1a, L1b, L1c]
val L2b = NODE [L1b, L1c, L1a]
val L3 = NODE [L2a, L2b, L1a, L1b]
val L4 = NODE [L1c, L1b, L3]
val L5 = NODE [L4]

该函数接受treeToString L5 之类的参数,它将输出字符串((cb((abc)(bca)ab)))

问题是我无法找出区分函数何时采用 LEAF 或 NODE 类型的正确方法。我编写了下面的代码来尝试测试它,但我遇到了错误。任何人都知道为了让它工作的语法?一旦我得到参数,实际的递归应该很容易。

(* treeToString *)
fun treeToString(LEAF str) = str
|   treeToString(NODE h::t) = 
    h;

【问题讨论】:

    标签: sml ml


    【解决方案1】:

    这个功能是我用来让它工作的。只需要在我的论点周围加上括号

    fun treeToString f Node = let
        fun helperFun (LEAF(v)) = [f v]
        |   helperFun (NODE(h::t)) = ["("] @ List.concat (map helperFun(h::t)) @ [")"]
        in
            String.concat(helperFun Node)
    end;
    

    【讨论】:

      【解决方案2】:

      改变这个:

      |   treeToString(NODE h::t) = ...
      

      到这里:

        | treeToString (NODE (h::t)) = ...
      

      原因是(NODE h::t) 可以解释为((NODE h)::t)(其中NODE h 是节点列表中的第一项)或(NODE (h::t)),这是您想要的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-19
        • 2012-04-09
        • 1970-01-01
        • 1970-01-01
        • 2015-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多