【问题标题】:Parsing a list of tuples with mutliple data types in SML在 SML 中解析具有多种数据类型的元组列表
【发布时间】:2021-10-16 07:27:33
【问题描述】:

所以我想要一个包含 int 键和 int 或布尔值的元组列表:

[(0, 1), (1, 2), (2, true), (3, 4), ...]

我一直在尝试编写可以将元组添加到列表中并返回给定键的值的函数。例如:

getValue(2, [(0,1),(1,true),(2,3),(3,4)]); -> returns 3
getValue(1, [(0,1),(1,true),(2,3),(3,4)]); -> returns true
addValue([(0,1),(1,true),(2,3),(3,4)], (4, false)); -> [(0,1),(1,true),(2,3),(3,4),(4,false)]
addValue([(0,1),(1,true),(2,3),(3,4)], (2, 5)); -> [(0,1),(1,true),(2,5),(3,4)]

这是我到目前为止生成的代码,在严格使用 int 或 bool 时可以正常工作。当我将它们组合起来时,它会给我错误“运算符和操作数不同意”。

fun getValue (key1, list) =
  let
    fun parse [] = 0
      | parse ((key, v)::list) =
          if key1 = key then v
          else parse list;
  in
    parse list
  end;

fun addValue([], (key1, v1)) = [(key1, v1)]
  | addValue((key, v)::a, (key1, v1)) =
        if key1 = key then (key1, v1)::a
        else (key, v)::addValue(a, (key1, v1));

我对 SML 很陌生,这甚至可能是不可能的。只是想问问周围。谢谢!

编辑

这不起作用的原因是什么?

datatype denotable_value =  Boolean of bool 
                          | Integer of int;

fun accessStore ( loc1, (env, s : (int * denotable_value) list) ) =
    let
        val msg = "Error: accessEnv " ^ Int.toString(loc1) ^ " not found.";

    fun aux [] = error msg
      | aux ( (loc, v)::s ) =
            if loc1 = loc then v
            else aux s;
    in
        aux s
    end;

accessStore(0, ([], [(0, 1), (1, true), (2, 3)]));

【问题讨论】:

    标签: sml smlnj


    【解决方案1】:

    确实,你所描述的是不可能的;标准 ML 专门使用静态类型,这意味着每个表达式都需要具有唯一且定义明确的类型,以便在运行时理解该值。 [(0, 1)] 可以,类型为(int * int) list;并且[(2, true)] 可以,并且类型为(int * bool) list;但是[(0, 1), (2, true)] 不行,因为像(List.nth ([(0, 1), (2, true)], i) 这样的表达式(它采用列表的第i 个元素)必须是int * intint * bool,具体取决于@ 的值987654329@,这不是类型系统的工作方式。

    相反,您要做的是为需要为整数或布尔值的值定义一个新的代数数据类型

    datatype intOrBool = INT of int | BOOL of bool
    

    并使用适当的构造函数将这些值包装在该类型中:

    [(0, INT 1), (1, INT 2), (2, BOOL true), (3, INT 4)] : (int * intOrBool) list
    

    (当然,与intOrBoolINTBOOL 相比,您会希望使用更好的名称——更适合您的应用程序;但希望以上内容能给您带来启发。)

    【讨论】:

    • @DanielBoyd:我的荣幸!
    • @DanielBoyd:你需要写例如Boolean true 而不仅仅是 true。 (Boolean 的类型为 bool -> denotable_value。)
    猜你喜欢
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多