2014-03-04 33 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

我有同样的问题,这是因为我用标签进行身份验证。当我用空格缩进代码时,它就起作用了!