2011-08-15 80 views
0

all!Seq.Map string-> string

這段代碼有什麼問題?我無法理解我在Seq.Map中做了什麼錯誤。 以下是錯誤消息:類型「單元」不與類型兼容「SEQ <‘一>’

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

我懷疑問題是實際上以前的電話。

Seq.iter不返回任何東西(或者說,返回unit),所以你不能在管道中間使用它。試試這個:

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

...然後如果你真的需要打印出來的「庫找到了」行了,你可以添加執行打印另一個映射,只是返回輸入:

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#,但我認爲目的是正確的:)

+0

我懷疑是一樣的;) – Carsten

+0

@Coenoen:'reportLib'函數看起來好嗎?這是我很擔心的一點:) –

+0

reportLib可能想成爲一種方法而不是一種功能。對於給定的輸入,它不會執行一次以上。但這可能會或可能不是原始海報的問題。 – Rangoric

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") 

在另一方面,你最終會遍歷collection兩次這可能不是你想要的。

更好的方法是定義一個函數Do(小寫字母do是F#中的保留關鍵字),這會在迭代序列時引入副作用。 Rx.NET(九)在EnumerableEx提供這樣的功能:

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

,然後你可以介紹,像這樣的副作用:只有在上遍歷collection

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

的副作用將被引入最後一行。

相關問題