我正在解析由换行符分隔的字符串。为此,我有:
for line in str.Split([|Environment.NewLine|], StringSplitOptions.None) do
这给了我每条线路。我想做的是取line
,如果它以某个字符串开头,则将余数添加到字典中,并以起始字符串作为键。基本上,我想在F#中实现以下逻辑:
if line equals "[end]" then
break
else if line startsWith "string1" then
add the rest of line to a dictionary with the key "string1"
else if line startsWith "string2" then
add the rest of line to a dictionary with the key "string2"
else
continue
根据我发现的情况,我应该使用match..with
语句来执行此操作,而不是按照this的顺序将其音译为F#。
到目前为止,我有:
open System
open System.IO
open System.Collections.Generic
let str =
"Some string that
spans multiple lines
with prefixes
[end]"
let (|Prefix|_|) (p:string) (s:string) =
if s.StartsWith(p) then
Some(s.Substring(p.Length))
else
None
let dict = new Dictionary<string, string>();
for line in str.Split([|Environment.NewLine|], StringSplitOptions.None) do
match line with
| Prefix "[end]" -> dict // stop searching
| Prefix "spans" rest -> dict.Add("spans", rest) // add to dictionary
| _ -> () // continue searching
这给了我以下错误,我不确定如何处理:
test.fs(20,5): error FS0001: Type mismatch.
Expecting a string -> 'a option but given a string -> string -> string option
The type ''a option' does not match the type 'string -> string option'
我使用MonoDevelop /开源F#编译器,如果这对任何事情都很重要,但我认为不会。
答案 0 :(得分:2)
所以我修复了一些错误:
字符串文字应为
let str =
"Some string that
spans multiple lines
with prefixes
[end]"
或者你在每行的开头都有一些你不想要的空格
匹配应该看起来像
for line in str.Split([|Environment.NewLine|], StringSplitOptions.None) do
match line with
| Prefix "[end]" rest -> ()
| Prefix "spans" rest -> dict.Add("spans", rest)
| _ -> ()
在这里,F#并没有像break
这样的东西,所以我让第一个和最后一个案例无所作为。我认为这应该做你想要的。