F#连续调用Split方法触发FS0597错误的原因是什么?
F#链式调用报错FS0597的原因分析
先看这段可以正常运行的F#代码:
let string = "Items: 79, 98" let parts = string.Split(":")[1] let items = parts.Split(", ")
运行后会得到字符串数组 [|" 79"; "98"|]。
但把代码改成链式调用后就会报错:
let string = "Items: 79, 98" let items = string.Split(":")[1].Split(", ")
触发的错误信息为:error FS0597: Successive arguments should be separated by spaces or tupled, and arguments involving function or method applications should be parenthesized
错误原因
这是F#的语法解析优先级规则导致的问题。编译器会错误地把链式调用的代码解析成:将":"[1].Split(", ")作为string.Split的参数,而不是先执行string.Split(":")取索引1的元素,再对这个元素调用Split方法。
具体来说,F#中函数/方法调用的参数解析逻辑会优先把后续的表达式绑定到前面的方法调用上,导致它误以为你是要给第一个Split传递多个参数,而这种写法不符合F#的参数传递规范,因此抛出了FS0597错误。
解决方法
给string.Split(":")[1]加上括号,明确告诉编译器这部分是一个完整的表达式,先执行它再调用后续的Split方法:
let string = "Items: 79, 98" let items = (string.Split(":")[1]).Split(", ")
内容的提问来源于stack exchange,提问作者Olav
相关产品推荐
相关产品推荐

