下面有一段Haskell代码。问题是前两个警卫的条款(enigmaInput,_) = (filter (\(a,b) -> b == cipherChar0) stecker)!!0
将失败。我怎样才能为最后2名守卫分配它。谢谢!
followMenu :: Crib->Menu->Stecker->Offsets->Maybe Stecker
followMenu c [] s o = Just s
followMenu crib menu stecker offsets
| (length stecker) == 1 && initAdd == Nothing = Nothing
| (length stecker) == 1 && initAdd /= Nothing = followMenu crib (tail menu) (fromMb initAdd) offsets
| (length stecker) /= 1 && normalAdd == Nothing = Nothing
| otherwise = followMenu crib (tail menu) (fromMb normalAdd) offsets
where (_,_,cipherChar0) = crib!!(menu!!0)
(_,_,cipherChar1) = crib!!(menu!!1)
(enigmaInput,_) = (filter (\(a,b) -> b == cipherChar0) stecker)!!0
enigmaOutput = enigmaEncode enigmaInput (SimpleEnigma rotor3 rotor2 rotor1 reflector1) offsets
(_,initInput) = stecker!!0
initOutput = enigmaEncode initInput (SimpleEnigma rotor3 rotor2 rotor1 reflector1) offsets
(_,_,initCipher) = crib!!(menu!!0)
initAdd = steckerAdd initOutput initCipher stecker
normalAdd = steckerAdd enigmaOutput cipherChar1 stecker
答案 0 :(得分:1)
您真的不需要,因为(filter (\(a,b) -> b == cipherChar0) stecker)!!0
不会被评估,直到需要enigmaInput
的值,而您不会使用enigmaInput
在前两个警卫案件中。这是懒惰评估的一个很好的功能。
除了重组模式匹配和守卫之外,没有办法将where
子句附加到一些但不是全部的一组守卫方程中。