是否可以在警卫内使用警卫?

时间:2014-05-28 20:13:29

标签: haskell

我想知道是否可以在haskell中使用守卫内部的守卫。 像这样:

analyser modele instr
  |  instr == NoCom  = (modele, "No command" ,[])
  |  instr == ComK   | (read comargstr1) == 0 = function1 modele Nothing
                     | (read comargstr1) == 1 = function1 modele (Just (read comargstr1))
                     | (read comargstr1) <  0 = function1 modele (Just (read comargstr2))
                     | otherwise              = function2 modele
  | othercases...
  | othercases...

在我的例子中,我根本不能在第一列警卫中评估(阅读comargstr1),因为comargstr1并不总是返回一个可读的兼容字符串(致命错误)

我没有设法在守卫内使用警卫!

是否可以这样做(有诀窍,选项,特别之处,......)还是完全不可能?

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:4)

布局不适用于警卫,所以对齐它们并不重要。

你最接近的是使用MultiWayIf作为二级警卫。

答案 1 :(得分:2)

你可以达到如下模糊的相似之处:

analyser modele instr
  |  instr == NoCom = (modele, "No command" ,[])
  |  instr == ComK  = foo
  | othercases...
  | othercases...
  where foo | (read comargstr1) == 0 = function1 modele Nothing
            | (read comargstr1) == 1 = function1 modele (Just (read comargstr1))
            | (read comargstr1) <  0 = function1 modele (Just (read comargstr2))
            | otherwise              = function2 modele

请注意,每个分支都需要一个不同的名称foo。此外,如果嵌套的保护列表不以otherwise(或等效的)结尾,则控件将转移到最顶层的下一个保护。

答案 2 :(得分:0)

要么重复这两个条件,要么在单个警卫后使用if。据我所知,不支持两个/嵌套警卫。