在表达式中使用gu ..

Rij*_*ijk 18 haskell

有时我会写这样的代码

solveLogic :: Int -> Int -> Int
solveLogic a b =
    let 
        x = 1
        brainiac
            | a >= x     = 1
            | a == b     = 333
            | otherwise  = 5
    in
        brainiac
Run Code Online (Sandbox Code Playgroud)

每次我都强烈要求编写这些东西而不需要"brainiac"功能,如下所示:

solveLogic :: Int -> Int -> Int
solveLogic a b =
    let 
        x = 1
    in
        | a >= x     = 1
        | a == b     = 333
        | otherwise  = 5
Run Code Online (Sandbox Code Playgroud)

哪个代码更像是"Haskellish".有没有办法做到这一点?

huo*_*uon 46

是的,使用where条款:

solveLogic a b
        | a >= x     = 1
        | a == b     = 333
        | otherwise  = 5
    where
      x = 1
Run Code Online (Sandbox Code Playgroud)


aug*_*tss 13

当我想要守卫作为表达时,我会使用这个有点丑陋的黑客

case () of
_ | a >= x     -> 1
  | a == b     -> 333
  | otherwise  -> 5
Run Code Online (Sandbox Code Playgroud)

  • 给以后的读者一个小注意:现在可以用`if |代替此技巧。a> = x-> 1 | a == b-> 333 | 否则-> 5,使用“ MultiWayIf”扩展名,该扩展名自GHC 7.6起可用。 (3认同)