【问题标题】:Comparing two lists having a different structure比较具有不同结构的两个列表
【发布时间】:2015-08-26 15:50:32
【问题描述】:

我正在尝试使用 SML 在 CPN 工具中执行模式匹配功能。 我已经定义了一个颜色集事件:colset EVENT = product EVENTTYPE * EVENTTIME timed;

比较列表时,我只对事件类型感兴趣,所以我试图比较例如[a,b][ (a,0), (b,1) ] 到 - 所以我编写了以下 SML 函数来比较两个列表:

fun pattern_match _ [] = true
  | pattern_match [] [x] = false
  | pattern_match (x::xs) (y::ys) =
    if #1 x = y
    then pattern_match xs ys
    else pattern_match xs (y::ys)

这只会在 evalloop.sml 中给我一个未指定的编译器错误 由于我对 SML 相当陌生,我的猜测是 SML 不支持 CPN-Tools #-operator。 不幸的是,我不知道如何从我真正感兴趣的第一个列表中只提取元组的一部分。对此有什么帮助吗?

【问题讨论】:

  • 有什么理由不能只map (fn (a,_) => a) xs,然后直接比较两个列表?看起来您不需要此函数中的任何内容的第二个值。

标签: list sml petri-net


【解决方案1】:

Inaimathi 可能是正确的,有一种更简单的方法可以做你想做的事,尽管它仍然是一个很好的练习来修正你的定义以使其工作。

当我在 SML/NJ 中输入你的有趣定义时,我得到了错误

stdIn:10.1-14.30 Error: unresolved flex record
   (can't tell what fields there are besides #1)

这意味着 SML 的类型推断无法充分解析类型。给它一点提示就足够了:

fun pattern_match _ [] = true
|   pattern_match [] [y] = false
|   pattern_match ((x:string*int)::xs) (y::ys) = if #1 x = y
then pattern_match xs ys
else pattern_match xs (y::ys);

现在 SML 知道 xstring*int 类型,它可以编译。

推断的类型是(string * int) list -> string list -> bool,它按预期工作:

- pattern_match [("a",0),("b",1)] ["a","b"];
val it = true : bool

【讨论】:

  • 非常感谢您的评论,约翰。不幸的是,CPN-Tools 中的编译器似乎不喜欢您的解决方案,因为我仍然收到未指定的错误。当我删除 #1 时,函数会编译,但比较不会那样工作。即使我删除 #1 并将您的解决方案添加到正文中,它也会产生编译错误。
  • @DustinH 很奇怪。我对此知之甚少,无法确定,但这听起来像是 CPN-Tools 中的一个错误。有趣的是,它如何返回“未指定的错误”,而不是我在尝试编译您的原始定义时得到的相当具体的错误消息。我以前从未听说过 CPN-Tools,但它看起来是一个非常有趣的项目(即使它的 SML 实现存在错误)。
  • 我认为问题在于,他们没有给你编译器抛出的实际错误,而只是告诉你那里一个编译错误。这使得调试非常困难。我刚刚读到 CPN-Tools 实际上使用 SML/NJ - 这让这更加奇怪。无论如何,感谢您的输入!我现在已经联系了该工具的开发人员,并将根据他们的回复更新这篇文章。
  • +1,虽然我认为写(a, _)a之类的东西可能比写(x:string*int)#1 x更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-25
  • 1970-01-01
  • 2014-06-02
  • 1970-01-01
  • 2013-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多