2011-08-15 197 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") 

的副作用将被引入最后一行。

相关问题