我正在尝试使用正则表达式来过滤字符串列表中的所有字符串。这是我的函数,它接受一个字符串并过滤它
let filterWord wordToFilter =
Regex.Replace(wordToFilter, "[^a-zA-Z0-9/!\'?.-]", "");
因为我想将该函数应用于我的字符串列表中的每个元素,所以使用List.map似乎是有意义的。这是我尝试使用地图
let filteredWords = unfilteredWords |> List.map(fun x -> filterWord(x));
我希望该行将我的过滤器函数应用于我的列表中的每个字符串(unfilteredWords是一个字符串列表)但是我得到一个语法错误说
"Type mismatch. Expecting a
string [] -> 'a
but given a
'b list -> 'c list
The type 'string []' does not match the type ''a list'"
并且不知道为什么。这是完整的代码
open System;
open System.IO;
open System.Text.RegularExpressions;
(*Tests if an element is in a list*)
let isInList elementToFind listToCheck =
List.fold(fun a b -> a || b = elementToFind) false listToCheck;
(*Takes a string and filters it down to common text characters*)
let filterWord wordToFilter =
Regex.Replace(wordToFilter, "[^a-zA-Z0-9/!\'?.-]", "");
(*Main method of the program*)
[<EntryPoint>]
let main argsv =
let input = File.ReadAllText("Alice in Wonderland.txt"); //Reads all the text into a single string
let unfilteredWords = input.Split(' ');
let filteredWords = unfilteredWords |> List.map(fun x -> filterWord(x));
0;
任何帮助将不胜感激,谢谢!
编辑:显然将unfilteredWords的值更改为硬编码字符串数组可以修复它。问题是我不知道如何让它与拆分一起工作。
答案 0 :(得分:1)
以下是修复方法:使用Array.map
代替List.map
。
请注意,您可以使用F#.Split [|' '|]
代替.Split(' ')
。
let input = "### $$$ Alice In Wonderland ,,,,";
let unfilteredWords = input.Split [|' '|]
let filteredWords = unfilteredWords |> Array.map(fun x -> filterWord(x));
printfn "%A" filteredWords;
请参阅IDEONE demo
我的演示中示例字符串的输出是
[|""; ""; "Alice"; "In"; "Wonderland"; ""|]
答案 1 :(得分:-1)
看到这个问题: F# Using List.map on an array of strings
我猜你应该使用Array.map或Seq.map而不是List.map