type 'a t
val id : float t
val linear : domain:(float * float) -> range:(float * float) -> float t