【问题标题】:SML: multiple case statementsSML:多案例陈述
【发布时间】:2017-02-10 23:56:35
【问题描述】:

我怎样才能有多个不相互交错的 case 语句。 例如一个玩具示例:

 fun multi_cases(xs) =
     case xs of
       [] => 5
      | x::ys => case x of
                    1 => 2
                   |_ => 3
      | x::[] => case x of
                    1 => 5
                    | _ => 7
 ;

stdIn:59.17-64.28 Error: types of rules don't agree [overload conflict]
  earlier rule(s): [int ty] -> [int ty]
  this rule: [int ty] list -> [int ty]
  in rule:
    :: (x,nil) =>
      (case x
        of 1 => 5
         | _ => 7)

最后两个 case 语句混淆了我如何告诉 SML 它们确实是两个独立的 case 语句,而不是 case x of 1 => 2 的延续/单独分支 ...

以下答案中指出的上述模式存在通用性问题。

【问题讨论】:

标签: sml


【解决方案1】:

这段代码有两个明显的问题:

  1. 正如约翰链接到的问题Nested case statements in SML 所说,case-of 在语法上有点棘手,因为它们的 case 语句列表永远不会“停止”。也就是说,您的代码实际上被解析为:

    fun multi_cases xs =
        case xs of
             [] => 5
           | x::ys => case x of
                           1 => 2
                         | _ => 3
                         | x::[] => case x of
                                         1 => 5
                                       | _ => 7
    

    这是荒谬的,因为第三个模式应该属于外部 case-of 而不是内部(内部 case-ofx 作为int,外层以x::[]int 列表)。

    由于您的缩进不会积极帮助编译器实现预期含义,因此使用括号“阻止” case-of 相互缠绕,就像那篇帖子所说的那样,是解决方法:

    fun multi_cases xs =
        case xs of
             [] => 5
           | x::ys => (case x of
                           1 => 2
                         | _ => 3)
           | x::[] => (case x of
                            1 => 5
                          | _ => 7)
    

    或者,您可以将外部 case-of 转换为函数参数本身的匹配项,并将内部 case-of 与其混合在一起,因为单个模式匹配允许任意深度匹配:

    fun fun_cases [] = 5
      | fun_cases [1] = 5
      | fun_cases [_] = 7
      | fun_cases (1::_) = 2
      | fun_cases (_::_) = 3
    
  2. 您的两种情况重叠,因为x::xs 是比x::[] 更通用的模式。也就是说,它还通过将xs 设置为[] 来覆盖列表x::[]。您可以通过以下两种方式之一解决此问题:

    1. 首先列出最不通用的模式,例如

      case xs of
           [] => 5
         | [x] => ...
         | x::_ => ...
      
    2. 通过指定列表应至少包含两个元素,将 x::xs 通用模式变为不太通用的模式:

      case xs of
           x :: _ :: _ => ...
         | [x] => ...
         | [] => ...
      

【讨论】:

  • 这些括号有什么作用?他们是否添加了某种模式匹配?
  • +1 问题,语言中是否有一条规则可以帮助您首先定义更一般的模式?因为不太通用的模式不匹配。
  • 什么括号?我不确定您所说的语言规则是什么意思。 Stack Overflow 并不适合在评论中来回讨论,也不适合对子问题进行持续阐述。我建议您阅读entry-level book on Standard ML,参加有助教的课程,或阅读有关特定主题的内容,例如type inference/unification
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2010-10-30
  • 2016-05-13
  • 2016-02-21
  • 1970-01-01
  • 2012-09-08
相关资源
最近更新 更多