2

これをリファクタリングする方法はありますか:

let collide (b1 : Box) (b2 : Box) =
  if   bottom b1 > top b2
  then false
  else if   top b1 < bottom b2
       then false
       else if   right b1 < left b2
            then false
            else if   left b1 > right b2
                 then false
                 else true

これよりも読みやすい方法で:

let collide (b1 : Box) (b2 : Box) =
  match () with
  | _ when bottom b1 > top    b2 -> false
  | _ when top    b1 < bottom b2 -> false
  | _ when right  b1 < left   b2 -> false
  | _ when left   b1 > right  b2 -> false
  | _                            -> true

?

GHC 7.6.1 の多方向 if 式に似たものを考えています: http://www.haskell.org/ghc/docs/7.6.1/html/users_guide/syntax-extns.html#multi-方法-if .

4

3 に答える 3

4

使ってみませんか||-

not (bottom b1>topb2 || top b1<bottom b2 || right b1<left b2 || left b1>right b2)
于 2012-09-26T03:12:48.537 に答える
4

ブライアンの答えを補完することは、それelifがただの砂糖であることも指摘する価値がありelse ifます。つまり、元のコードを再フォーマットして、それほど悪くないようにすることができます。

let collide (b1 : Box) (b2 : Box) =
    if bottom b1 > top b2 then false
    else if top b1 < bottom b2 then false
    else if right b1 < left b2 then false
    else if left b1 > right b2 then false
    else true
于 2012-09-26T03:54:33.783 に答える
4
let collide (b1 : Box) (b2 : Box) = 
    if   bottom b1 > top b2 then false 
    elif top b1 < bottom b2 then false 
    elif right b1 < left b2 then false 
    elif left b1 > right b2 then false 
    else true 
于 2012-09-26T03:28:14.610 に答える