2016-04-11 8 views
3

f#で実行する必要のあるコマンドの文字列[]を繰り返し実行すると、各コマンドは新しいコマンドを実行して次の関数に渡すマップを生成します。書式設定f#の複合関数f#

コマンドは正しく動作しますが、読み込みには大型で扱いにくいです。私は、パイプ構文を使用してこれらの複合関数を順序付け/整形するより良い方法があると信じています。それを動作させるように見えることはできません。

私のコマンドは次のとおりです。

let rec iterateCommands (map:Map<int,string array>) commandPosition = 
    if commandPosition < commands.Length then 
     match splitCommand(commands.[0]).[0] with 
     |"comOne" -> 
      iterateCommands (map.Add(commandPosition,create(splitCommand commands.[commandPosition])))(commandPosition+1) 

私が管理している最も近い機能をインデントすることですが、これは厄介です:

iterateCommands 
(map.Add 
    (commandPosition,create 
     (splitCommand commands.[commandPosition]) 
    ) 
) 
(commandPosition+1) 

は、F#でこれを再フォーマットすることも可能ですか?私はそれが可能と信じて読んだものから、任意の助けを大幅に

The command/variable types are: 
commandPosition - int 
commands - string[] 
splitCommand string -> string[] 
create string[] -> string[] 
map : Map<int,string[]> 

そしてもちろんmap.addマップをいただければ幸いです - >マップ+ X

+0

作成する機能の定義、または少なくともそれらの種類を分けてください。 –

+0

すべての関数と変数の型を含めるように私の答えを編集しました –

答えて

2

あなたは周りの引数変更された場合には、コールを構成するために少し簡単になるだろう:

let rec iterateCommands commandPosition (map:Map<int,string array>) = 
    // ... 

ような何かを書くことができますでしょう:

splitCommand commands.[commandPosition] 
|> create 
|> (fun x -> commandPosition, x) 
|> map.Add 
|> iterateCommands (commandPosition + 1) 

commandPositionであるという事実組成の3倍のは、私の意見では、この全体の表現のタイプがunitであるという事実であるという設計匂いです。特に機能的には見えませんが、この機能が何をしようとしているのか正確にはわからないので、私はより良いデザインを提案することはできません。

あなたは、引数の順序を変更することはできませんので、iterateCommands制御し、いない場合、あなたは常に標準関数型プログラミングユーティリティ関数を定義することができます。これは、できます

let flip f x y = f y x 

に対して次のように記述することをiterateCommands

splitCommand commands.[commandPosition] 
|> create 
|> (fun x -> commandPosition, x) 
|> map.Add 
|> (flip iterateCommands) (commandPosition + 1) 
+0

ありがとうございましたこれは私が後に行ったことでした=) iterateCommandsは渡されたマップの各コマンドを実行し、すべてのコマンドがテキストファイルアプリケーションが終了します。 iterateCommands関数がユニット型以外のものを必要とするとは思わなかった。関数が完了するとアプリケーションが終了すると思います。とにかくこれを変更することをお勧めしますでしょうか?現在、関数呼び出しはiterateCommands Map.emptyです。空の? –

+1

@Matthewkingston右上の関数の場合、 'unit'は完全に良い戻り値の型です。私の間違い。 –

3

はそれが起こっているものを作るのは困難です複数の入力を持つ大きなステートメントで私は個々の式に名前を付けるので、読者はどんな位置にでもジャンプすることができ、計算に使用される値に何が入っているかを大まかに知ることができます。

let inCommands = splitCommand commands.[commandPosition] 
let map' = map.Add (commandPosition, inCommands) 
iterateCommands map' inCommands 

私はここで何が行われているのか分からないので、名前はあまり意味がありません。理想的には、計算の個々のステップを理解するのに役立ちます。