2017-06-09 16 views
1

私は関数archive_lb_filesを持っています。テスト関数を使ってマッチしたものの1つを除いてすべてをスタブアウトしたいと思います。私は、スタブマッチを修正する方法がわからないので、私はF#マッチと満足のタイプを構成する方法

この式は、文字列型を持っていることが予想された得ることはありません - > BOOLが、ここでは部

エラーを入力しています。

ここにコードスニペットがあり、FileMaint.fm.archive_lb_file lb_dir archive_dir fnはboolを返します。回答やコメントへの答えで

(* Subroutine to process files we fetch from IC, and then need to be uploaded to Munis. *) 
let process_payment_processor_files spool_dir unload_dir paymt_dir report_date = 
    use fHLog = FileMaint.fm.open_log_file_out (FileMaint.fm.generate_log_file()) 
    // We'll flesh this in when Stratus is installed, and we know the directory names. cmn 5/26/2017 
    ignore 

let test_print fn = 
    printfn "%A" fn 

let archive_lb_files lb_dir archive_dir report_date = 
    use fHLog = FileMaint.fm.open_log_file_out(FileMaint.fm.generate_log_file()) 
    let lb_fnam_template = "*_lockbox.txt" 
    let dir_list = Directory.GetFiles(lb_dir, lb_fnam_template) 

    for pfn in dir_list do 
     let fn = Path.GetFileName(pfn) 
     match fn with 
     | "cb_lockbox.txt" -> FileMaint.fm.archive_lb_file lb_dir archive_dir fn 
     | "ics_lockbox.txt" -> (test_print fn) 
     | "ic_lockbox.txt" -> test_print fn 
     | _ -> test_print "does not exist" 

は、どのように関数を返しarchive_lb_fileていますか?

(* Moves a file to a unique file name but not including a central directory in between a source and destination. *) 
let archive_lb_file lb_path archive_path lockbox_file_name copy_only = 
    use fH = new StreamWriter(base_log_file, true) 
    let rc = 
     try 
      if (0 = String.Compare(copy_only, "copy_only")) then 
       File.Move((lb_path + lockbox_file_name), archive_path) |> ignore 
       fH.WriteLine(generate_time_stamp + ": " + lb_path + lockbox_file_name + " moved to " + archive_path) 
      else 
       File.Copy((lb_path + lockbox_file_name), archive_path) |> ignore 
       fH.WriteLine(generate_time_stamp + ": " + lb_path + lockbox_file_name + " copied to " + archive_path) 
      true 
     with ex -> 
      fH.WriteLine(generate_time_stamp + ": " + "An error occrred trying to move or copy " + 
         lb_path + lockbox_file_name + " to " + archive_path) 
      printfn "%A" ex 
      false 
    rc 

答えて

3

matchステートメントのすべてのパターンは、同じタイプを返す必要があります。 test_printはユニットを返しますが、FileMaint.fm.archive_lb_fileは関数string -> boolを返します。メソッドを

let test_print fn = 
    printfn "%A" fn 
    true 

に変更すると、これが変わってもエラーは修正されます。

編集: 欠落している機能を送信したため、表示されているエラーは、電話でcopy_only引数を渡さないことが原因です。

match fn with 
    | "cb_lockbox.txt" -> FileMaint.fm.archive_lb_file lb_dir archive_dir fn true 
    | "ics_lockbox.txt" -> (test_print fn) 
    | "ic_lockbox.txt" -> test_print fn 
    | _ -> test_print "does not exist" 

trueを追加すると、その機能が呼び出されます。コールでエラーが発生しない理由は、カリング機能が原因です。

https://fsharpforfunandprofit.com/posts/currying/

+1

いいえ、それはないでしょう:最初の分岐は '文字列型を持つ - > bool'だけではなく、' bool'を。 –

+0

あなたは正しいです。奇妙なreturn文を追加するコメントを編集しました。 –

+0

呼び出された関数を投稿しました。私はそれがブール関数ではなく返されたと考えました。 – octopusgrabbus

3

一致式のすべての枝は同じ型でなければなりません。あなたが投稿したエラーメッセージで判断すると、一致式の最初のブランチにはstring -> boolというタイプがあります。つまり、FileMaint.fm.archive_lb_fileへのコールにはおそらく1つの引数がありません:別のstringがあり、それを取得した後にboolを返します。このことから

、解決策は二つの部分があります:

  1. を、私はその関数の定義が表示されていないので、(私はもはやこれであなたを助けることができないFileMaint.fm.archive_lb_fileに不足している引数を渡すと、したがって、欠落している議論が何を想定しているのか分かりません)。
  2. test_print関数が同じタイプ、つまりboolを返すようにします。これを実現するには、戻り値を追加してください:

let test_print fn = 
    printfn "%A" fn 
    true 

言った、私はあなたのプログラムが実際に論理的な誤りがあることを疑う:ブール値を返しますが、あなたはそれを無視しているFileMaint.fm.archive_lb_file。あなたはすべきですか?戻り値があなたにとって重要でない場合、関数が最初にそれを返しますか?

関連する問題