2017-02-09 103 views
0

如何擁有多個不相互交錯的陳述陳述? 例如玩具例子:SML:多個案例陳述

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語句,而不是1情況下,x的延續/獨立分支=> 2 ...

上面的答案在下面的答案中指出了它們的一般性問題。

+0

[巢式病例中陳述的可能的複製SML](http://stackoverflow.com/questions/14708732/nested-case-statements-in-sml) –

回答

2

這段代碼有兩個明顯的問題:

  1. 由於問題Nested case statements in SML約翰鏈接到說,案例的 s爲語法有點棘手,因爲他們的case語句列表從來沒有「停止」。也就是說,你的代碼實際上被解析爲:

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

    這是荒謬的,因爲第三模式應該有屬於外案例的而不是內側(內案例中涉及x作爲int,而外部的x::[]作爲int list)。

    由於您的壓痕不積極幫助朝本意編譯器,使用括號從纏繞「停止」 病例的S,這樣的帖子裏說,是修復:

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

    或者你可以把外案例的到比賽上函數的參數本身與它融爲一體內案例在一起,因爲一個單一的模式匹配允許任意深度匹配:

    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] => ... 
          | [] => ... 
      
+0

這些括號是做什麼的?他們是否添加了某種模式匹配? – Har

+0

+1問題,在語言中是否有規則可以幫助您首先定義更一般的模式?因爲較不普遍的模式不匹配。 – Har

+0

什麼括號?我不確定你的語言規則是什麼意思。堆棧溢出並不真正適合評論中的前後討論,也不適合對子問題進行持續的闡述。我建議你閱讀[標準ML入門級書籍](https://www.amazon.com/Introduction-Programming-International-Computer-Science/dp/0201398206),參加一門有TA的課程,或者閱讀有關特定主題的內容,例如[類型推斷/統一](http://www.cs.cornell.edu/courses/cs312/2005sp/lectures/lec22.asp)。 –