F# 座標計算のメモ書き
ループ文で座標計算をしたかったのでタプル関係を調べてみたところ、意外と簡単にできました。
> let mvlist = [ - (((+), (+)), (0, 1)); - (((+), (+)), (1, 0)); - (((-), (-)), (0, 1)); - (((-), (-)), (1, 0)); - ];; > let posadd ((x, y), (a, b)) (c, d) = ((x c a), (y d b));; val posadd : (('a -> 'b -> 'c) * ('d -> 'e -> 'f)) * ('b * 'e) -> 'a * 'd -> 'c * 'f > posadd mvlist.[0] (10, 10);; val it : int * int = (10, 11) > posadd mvlist.[1] (10, 10);; val it : int * int = (11, 10) > posadd mvlist.[2] (10, 10);; val it : int * int = (10, 9) > posadd mvlist.[3] (10, 10);; val it : int * int = (9, 10)
何だかもう少しましな書き方があるような・・・
[追記]
対して変わってないかもしれないけれど、こちらのほうが好み
// その1 let mvlist = [ (((+), (+)), (0, 1)); (((+), (+)), (1, 0)); (((-), (-)), (0, 1)); (((-), (-)), (1, 0)); ];; let posadd ((x, y), (a, b)) (c, d) = ((x c a), (y d b));; [for a in mvlist do yield (posadd a (5, 5))];;
// その2 let calc op a b = op b a;; let mvlist = [ ((calc (+) 0), (calc (+) 1)); ((calc (+) 1), (calc (+) 0)); ((calc (-) 0), (calc (-) 1)); ((calc (-) 1), (calc (-) 0)); ];; let posadd (x, y) (a, b) = ((x a), (y b));; [for a in mvlist do yield (posadd a (5, 5))];;