2014-03-04 84 views
0

如何在haskell中正確縮進嵌套的case表達式,這將在命令式編程中充當嵌套循環?我應該如何縮進嵌套的case表達式?

f x y = case x of 
    1 -> case y of 
      1 -> 
      2 -> 
      ...   
    2 -> case y of 
     ... 

編譯器給我的第二個X的情況下開始的壓痕錯誤,所以我猜它不理解的是,第一個X案件結束

回答

3

您的代碼似乎確定。 Haskell有在維基解釋Indenation的一個非常簡單的規則:這是一些表達的一部分,應該進一步 比表達的開始縮進

代碼。

這個工作對我來說:

f x y = case x of 
    1 -> case y of 
     1 -> undefined 
     2 -> undefined 
    2 -> case y of 
     1 -> undefined 

你可能要檢查你的編輯器,看它是否在做正確的縮進。正如@Tarmil所建議的,始終使用空格來縮進。對here.

+3

「您可能想檢查您的編輯器,看看是否正在進行正確的縮進。」 - >特別是你可能想檢查它是否使用標籤。我建議你配置它只爲Haskell使用空格。 – Tarmil

+0

@Tarmil或使用'{; }'消除歧義。在這種情況下,它實際上也可以提高可讀性。 –

+0

這確實是一個列表問題,我用空格替換了它們,它使用了完全相同的縮進 – user3130051

6

沒有直接回答更多細節,但也可能有助於不過:

在這種特殊情況下,你也可以寫:

f 1 1 = ... 
f 1 2 = ... 
f 2 2 = ... 

,或者作爲一個案例表達:

f x y = case (x, y) of 
    (1,1) -> ... 
    (1,2) -> ... 
    (2,1) -> ... 
+0

非常有用,因爲它更具可讀性。 Java正在破壞我的大腦,我感到很愚蠢的想出了這個醜陋的解決方案。 – user3130051

0

我有同樣的問題,這是因爲我用標籤進行身份驗證。當我用空格縮進代碼時,它就起作用了!