Найдите значения в дереве - проверка типов SML

Мне нужно написать свои собственные типы данных - либо, либо либоTree, у которых есть свои типы. С их помощью мне нужно создать функцию, которая принимает в качестве параметров int иitherTree, которая выполняет поиск по дереву и возвращает true, если значение существует в дереве. тип должен быть: либоTree -> 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

Кажется, что «трюк» заключается в приведении ImAnInt / int друг к другу, чтобы я мог их сравнить. У кого-нибудь есть идеи? Спасибо.


person Oppa    schedule 17.02.2018    source источник


Ответы (1)


Вы можете использовать сопоставление с образцом для всего параметра; вам не нужно ограничиваться внешним конструктором.

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

и вам никогда не нужно сравнивать логическое значение с true или false - e = true эквивалентно e, а e = false эквивалентно not e.

person molbdnilo    schedule 18.02.2018