特定警卫的哪个条款

时间:2016-11-28 17:02:16

标签: haskell

下面有一段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

1 个答案:

答案 0 :(得分:1)

您真的不需要,因为(filter (\(a,b) -> b == cipherChar0) stecker)!!0不会被评估,直到需要enigmaInput的值,而您不会使用enigmaInput在前两个警卫案件中。这是懒惰评估的一个很好的功能。

除了重组模式匹配和守卫之外,没有办法将where子句附加到一些但不是全部的一组守卫方程中。