我想知道是否可以在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并不总是返回一个可读的兼容字符串(致命错误)
我没有设法在守卫内使用警卫!
是否可以这样做(有诀窍,选项,特别之处,......)还是完全不可能?
提前感谢您的帮助!
答案 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
。据我所知,不支持两个/嵌套警卫。