我想使用此功能 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
更新:
修复了错误的网址
答案 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)