在树中查找值 - 类型检查 SML

Find values in a tree - type checking SML

我需要编写自己的数据类型 - either 和 eitherTree,它们都有自己的类型。有了这些,我需要创建一个函数,它接受一个 int 和一个 eitherTree 作为参数,搜索树,如果树中存在该值,则 returns 为真。类型需要是: eitherTree -> int -> bool

到目前为止我有:

datatype either = ImAString of string | ImAnInt of int
datatype eitherTree = eLEAF of either | eINTERIOR of (either*eitherTree*eitherTree)

fun eitherSearch v1 (eLEAF((v2)) = if v1 = v2 then true
                                            else false
    | eitherSearch v1 (eINTERIOR(e1, et1, et2)) = if v1 = e1 then true
                                              else if (eitherSearch v1 et1) = true
                                              then true
                                              else if  (eitherSearch v1 et1) = true
                                              then true else false

"trick" 似乎正在将 ImAnInt / int 相互转换,以便我可以比较它们。谁有想法? 谢谢。

您可以对整个参数使用模式匹配;你不需要将自己局限于最外层的构造函数。

fun eitherSearch v1 (eLEAF (ImAnInt v2)) = v1 = v2
  | eitherSearch v1 (eLEAF _) = false
  | ...

或者你可以写一个比较函数:

fun equalInt (v, ImAnInt v') = v = v'
  | equalInt _ = false

fun eitherSearch v1 (eLEAF v2) = equalInt(v1, v2)
  | ...

旁注,

if E then true else false

是一种很迂回的写法E,

if E1 then true else E2

通常写成

E1 orelse E2

并且您永远不需要将布尔值与 truefalse 进行比较 – e = true 等同于 ee = false 等同于 not e.