2011-04-07 7 views
0

私はLuaを使って関数型プログラミングを学ぼうとしています。私はJavaの背景を持っています。 再帰的メソッドを使用してチェーンを構築したいと思います。 Javaでは、これはどういうわけか、次のようにします。関数型プログラミングで隠れ引数を持つ関数を実装するにはどうすればよいですか?

//Java 
public Link buildChain() { 
    return buildChain(null, 0, 100); 
} 


private Link buildChain(Link parentLink, int count, int length) { 

    Link link = new Link(); 
    link.setParentLink(parentLink); 
    if(count != length) { 
     link.setChildLink(buildChain(link, count+1, length)); 
    } 

    return link; 
} 

もちろん、私はいくつかのクラスLinkを持っています。

これを機能的なスタイルでどのように実装すればよいですか?そのクラスのLinkは、親と子のリンクとリンクに必要な他のものを格納するテーブル(Lua)です。しかし、私はどのようにして2つの機能を果たしますか? 私はクロージャを使用しますか(プライベートメソッドはパブリックなローカル変数を使用しません)か逆カリングの種類ですか?または単にパターンマッチング?

ヒントと説明は非常に高く評価されます。 ああ、私はこの質問のタイトルを見つけるのに苦労しました。

答えて

1

私はこの回答について何か「機能的」はないと思っていますが、ここで私はそれをLuaでどうやって行うのでしょうか。各リンクの「id」フィールドは、一意のIDを提供するためだけにあります。

function buildChain(link, cnt, len) 
    cnt = cnt or some_global_default_cnt or 0 
    len = len or some_global_default_len or 100 
    link = link or { parent=nil, child=nil, id="Link " .. cnt } 

    if cnt < len then 
    link.child = buildChain({parent=link, child=nil, id="Link " .. cnt+1 }, 
          cnt+1, len) 
    end 

    return link 
end 

n = buildChain() 
0

ルアの構文はわかりませんが、ワーカー関数を他のコンテキストでも使用するかどうかによって2つのオプションがあります。

ワーカー関数(2番目の関数)が単独で役に立つ場合は、2つの独立した関数を記述します。言語によっては、2つの異なる名前を使用している可能性があります。

さもないと、このhaskelishコードのように、最初の1への第二の機能は、ローカル行います

buildChain = worker [] 0 100 where 
    worker parent count link = .... 

それは、少なくともHaskellでは、buildChainが本当に機能ではない、ということが判明しました。これは、他のすべての純粋な言語でも当てはまります。つまり、workerが3つの定数引数で呼び出されるため、結果は常に同じになります。

関連する問題