首页 > 解决方案 > 如何在 SML 中的 else if 语句中解决“未解析的弹性记录”?

问题描述

我想查找当前给定节点直接或间接连接到的节点列表。例如,我有一个节点列表:

[1,2]

和一个元组列表,每个元组代表一条直接边:

[(1,5),(2,4),(4,6)]

所以,我正在寻找的节点是

[1,2,5,4,6]

因为,1 连接到 5,2 连接到 4。然后,4 连接到 6。为此,我需要两个队列和一个列表。每次发现新节点时,我们将新节点附加到队列和列表中。然后,我们删除队列的第一个节点,并转到下一个节点。如果一个新节点连接到队列的当前节点。然后,我们将新节点添加到队列和列表中。

我们一直这样做,直到队列为空并返回列表。

所以现在,我有一个附加函数,它将一个列表附加到另一个列表:

fun append(xs, ys) = 
   case ys of 
        [] => xs
    | (y::ys') => append(xs @ [y], ys')

然后,我有一个名为 getIndirectNodes 的函数,它旨在返回给定节点间接连接到的节点列表,但会抛出“未解析的弹性记录”。据说 List1 和 List2 具有相同的项目。但是,List1 服务于队列,而 list2 服务于要返回的列表。

  fun getIndirectNode(listRoleTuples, list1, list2) =
      if list1 = []
          then list2
     else if hd(list1) = #1(hd(listRoleTuples))
        then (
            append(list1,#2(hd(listRoleTuples)) :: []);
            append(list2,#2(hd(listRoleTuples)) :: []);
            getIndirectNode(listRoleTuples,tl(list1),list2)
            )
        else
           getIndirectNode(listRoleTuples,tl(list1),list2)

如果我删除 else if 语句,它工作得很好。但是,这不是我打算做的。问题出在 else if 语句中。我能做些什么来修复它?

标签: smlsmlnj

解决方案


SML 需要准确地知道元组的形状才能解构它。
您可以指定参数的类型listRoleTuples : (''a * ''a) list- 但使用模式匹配是一个更好的主意。

(该代码还有许多其他问题,但这就是您问题的答案。)


推荐阅读