正木です。

Ruby で Category が扱えないかと思って,手始めに
写像(関数)の class を作ってみました。

-------
class Function
  def initialize(hash={},*parameter)
    @hash=hash
    @para=parameter
    if @para && @para[0].type==Proc
      @lambda=@para.shift
    elsif block_given?
      @lambda=eval "lambda{"+yield+"}"
    end
  end

  def [](n)
    @hash[n] || @hash[n]=@lambda.call(n,*@para)
  end

  def	*(y)
    Function.new({},lambda{|z| self[y[z]]})
  end
end
------
計算結果を保持するので、同じ関数を何度も使うような場合には
早くなると思います。
関数の合成が簡潔に書けるので次の様に使えます。

Inverse=Function.new{"|x| 1/x"}
def Shift(y)
  Function.new({},y){"|x,y| x+y"}
end
ChSgn=Function.new{"|x| -x"}

Cot=Function.new{"|x|  Real.new([1/x],x){\"|n,x| Inverse[x-n*PI]+Inverse[x+n*P
I]\"}.Sum "}

Tan=ChSgn*Cot*Shift(PI/2)

又
def (Power={}).[](x)
  super || Power[x]=Sequence.new([1],x){"|n,x| x*self[n-1]"}
end
の代わりに
Power=Function.new{"|x| Sequence.new([1],x){\"|n,x| x*self[n-1]\"}"}
とも書けます。