0

全て!

このコードの何が問題になっていますか? Seq.Map で何が間違っているのか理解できません。エラー メッセージは次のとおりです。タイプ 'unit' は、タイプ 'seq<'a>' と互換性がありません。

let getPathToLibFile value =
    let regex = new Regex("\"(?<data>[^<]*)\"")
    let matches = regex.Match(value)
    matches.Value

let importAllLibs (lines:string[]) =
    lines
    |> Seq.filter isImportLine
    |> Seq.iter (printfn "Libs found: %s")
    |> Seq.map getPathToLibFile // error in this line
    |> Seq.iter (printfn "Path to libs: %s")

Seq.Map にわかりやすい例はありますか?

PSウィキの例(動作します):

(* Fibonacci Number formula *)
let rec fib n =
    match n with
    | 0 | 1 -> n
    | _ -> fib (n - 1) + fib (n - 2)

(* Print even fibs *)
[1 .. 10]
|> List.map     fib
|> List.filter  (fun n -> (n % 2) = 0)
|> printlist
4

2 に答える 2

5

問題は実際にはあなたの以前の電話だと思います。

Seq.iter何も返さない(つまり、を返すunit)ので、パイプラインの途中で使用することはできません。これを試して:

let importAllLibs (lines:string[]) =
    lines
    |> Seq.filter isImportLine
    |> Seq.map getPathToLibFile
    |> Seq.iter (printfn "Path to libs: %s")

...そして、本当に「libs found」行を印刷する必要がある場合は、印刷を実行して入力を返す別のマッピングを追加できます。

let reportLib value =
    printfn "Libs found: %s" value
    value

let importAllLibs (lines:string[]) =
    lines
    |> Seq.filter isImportLine
    |> Seq.map reportLib
    |> Seq.map getPathToLibFile
    |> Seq.iter (printfn "Path to libs: %s")

これは無効なF#である可能性がありますが、目的は正しいと思います:)

于 2011-08-15T13:35:25.650 に答える
0

WebSharper には、次のように自分で定義できる演算子が含まれています。

let (|!>) a f = f a; a

'a -> unit同じ値を返す入力値でタイプの関数を呼び出すことができます。

コードを修正するには、わずかな変更が必要です。

lines
|> Seq.filter isImportLine
|!> Seq.iter (printfn "Libs found: %s")
|> Seq.map getPathToLibFile // error in this line
|> Seq.iter (printfn "Path to libs: %s")

一方で、コレクションを 2 回反復することになり、これは望ましくない場合があります。

より良いアプローチは、関数 Do (小文字doは F# の予約済みキーワード) を定義することです。これは、シーケンスの反復に副作用をもたらします。Rx.NET (Ix) は、EnumerableEx でそのような機能を提供します。

let Do f xs = Seq.map (fun v -> f v; v) xs

そして、次のように副作用を導入できます。

lines
|> Seq.filter isImportLine
|> Do (printfn "Libs found: %s")
|> Seq.map getPathToLibFile // error in this line
|> Seq.iter (printfn "Path to libs: %s")

副作用は、最後の行でコレクションを反復するときにのみ導入されます。

于 2011-08-17T23:45:10.533 に答える