ここでは私の問題で、これは私のために働いていない理由...私は理解していない:)のF# - 関数合成を理解していない(ファイルが重複ファイルの機能を取得するために機能し得る変換)
をより具体的にはファイル取得機能があります(問題はありませんが、フィードバックは歓迎です)。
type DirectoryOptions = Directory of string * Option<SearchOption>
type SearchOptions =
| SearchSubDirectories
| SearchCurrentDirectory
let WithExtensionIn extlist filename =
let fileext = Path.GetExtension filename
extlist |> Seq.exists (fun e -> e = fileext)
let GetFiles dir extlist =
match dir with
| Some diroptions ->
let directoryname, suboptions = diroptions
match suboptions with
| Some SearchSubDirectories | None ->
Directory.GetFiles(directoryname, "*.*", SearchOption.AllDirectories)
|> Seq.filter (WithExtensionIn extlist)
| Some SearchCurrentDirectory ->
Directory.GetFiles(directoryname, "*.*", SearchOption.TopDirectoryOnly)
|> Seq.filter (WithExtensionIn extlist)
| None ->
Directory.GetFiles(Directory.GetCurrentDirectory(), "*.*", SearchOption.AllDirectories)
|> Seq.filter (WithExtensionIn extlist)
これを「ファイルの複製を取得」機能にしたいと考えています。私はできないかもしれないが、私は機能的な考え方に頭を向けようとしている。私の理解に基づいた私の現在の試みは機能しません。これは私の理解が間違っていることを意味し、これを解決する方法についていくつかの助けや説明をしたいと思います。私の理解は、関数の構成では、最も内側の関数はn個の入力パラメータを持つことができますが、出力を1つしか持たず、残りの関数は1つの入力を持つことができます。私は明確な入出力がないので、最初の関数がどのように解釈されているか(F#の合成の文脈では、使用するのが悪い単語かもしれません)は完全にはわかりません。私はこれがカレーの直接の影響だと信じています。ここで
私の現在の試みです:
let GetDuplicateFiles =
let LengthAndExtension file =
//this is faked for simplicity
(12, ".htm")
let GroupSizeGreaterThanOne group =
let _, values = group
Seq.length values > 1
let content file =
//again faked
()
let groups items =
snd items
GetFiles
>> Seq.groupBy LengthAndExtension
>> Seq.filter GroupSizeGreaterThanOne
>> Seq.collect groups
>> Seq.groupBy content
>> Seq.filter GroupSizeGreaterThanOne
>> Seq.collect groups
これは、エラーはタイプ「されてくれSeq.groupBy LengthAndExtension にコンパイルエラーを与える」B - > seqは「タイプ」以降と互換性がありません< 'a>'
ご意見/ご感想は歓迎します。私はあなたが私が何を意味するか知っているなら、私はああハッピーモーメントを探していると思う。
ないことを意味するものはF#関数の構成と数学的構成はわずかに異なり、F#に数学を模倣させる方法は、n個の入力をタプルにラップすることですか? Wierdしかし、大丈夫。私のコードは今動作します、ありがとう。 – Brad
はい。その理由は、関数が複数の戻り値を持つことができないからです。タプルはそれを達成する方法です。 – Daniel