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))];;