需要帮助在F#中进行简单的管道

时间:2014-08-20 22:26:07

标签: f# f#-fake

我想使用此功能 let CopyDir target source filterFile ...(line 219) 并指定过滤器。想法是过滤器将包含将被排除的文件。现在我正在使用字符串值 log4net 并且它正在工作,但我想用 nugetDependencies 替换它,这是一个字符串集合。你能帮我吗

let nugetDependencies = getDependencies "./packages.config" let excludeNuget (path : string) = path.Contains "log4net" |> not CopyDir nugetToolsDir (buildDir @@ package) excludeNuget

更新:
修复了错误的网址

2 个答案:

答案 0 :(得分:3)

我必须多次阅读这个问题才能理解它。我的理解是你要通过排除列表过滤文件路径列表 - 使用" log4net"是一个排斥的例子。

我会利用List.exists

这样做
let excludePaths (pathsToExclude : string list) (path: string) =
    pathsToExclude |> List.exists (fun exPath -> path.Contains(exPath)) |> not

这个实现实际上可以将labda函数fun exPath -> path.Contains(exPath)简化为path.Contains,因为该方法只需要一个参数,这将给我们提供:

let excludePaths (pathsToExclude : string list) (path: string) =
    pathsToExclude |> List.exists path.Contains |> not

Currying(F#形式术语为partial application)也可用于将参数绑定到函数。要创建" log4net"的检查,您只需执行以下操作:

let nugetExclusions = ["log4net"]
let excludeNuget = excludePaths nugetExclusions 

只需添加您需要从列表中排除的所有nuget路径。


由于您要比较路径contains,因此不会出现不区分大小写的重载。至少没有开箱即用。但是,您可以向字符串添加扩展函数。 C#实现是here on SO

这里是扩展方法的F#实现(注意我用小写包含--F#函数和重载不要混合)

type System.String with 
    member x.contains (comp:System.StringComparison) str = 
        x.IndexOf(str,comp) >= 0

有了这个type extension,我们就可以将excludePaths功能更改为此功能(同样,我正在讨论新创建的contains扩展方法:

let excludePaths (pathsToExclude : string list) (path: string) =
    pathsToExclude 
        |> List.exists (path.contains StringComparison.OrdinalIgnoreCase)) 
        |> not

我希望你继续使用F#。

答案 1 :(得分:1)

这个怎么样?

let excludeNuget (path : string) =
    nugetDependencies
    |> Seq.exists (fun x -> path.Contains x)