简单F#代码报Unexpected keyword错误该如何解决
F#随机字符串函数报错排查
报错原因
FS0010错误由轻量级缩进语法与显式in关键字混用导致:
F#默认启用轻量级语法模式,靠缩进区分绑定作用域,不需要显式书写in关键字。你在let sz = Array.length ch后额外添加了in,会触发编译器的显式语法校验逻辑,要求同作用域所有绑定都必须以in结尾,后续的let e = randomStr 5不符合该规则,因此抛出错误。
修复方案
方案1(推荐):删除多余in,使用默认轻量级语法
这是F#的标准写法,符合绝大多数开发场景的规范:
open System let randomStr (len : int) : string = let rand = new Random() let ch = Array.concat [| [|'a' .. 'z'|];[|'A' .. 'Z'|];[|'0' .. '9'|] |] let sz = Array.length ch System.String(Array.init len (fun _ -> ch.[rand.Next sz])) let e = randomStr 5 printf "%s" e
方案2:全量使用显式in语法
如果需要保留in的写法,需要给同作用域所有let绑定都加上in关键字,适配显式语法规则:
open System let randomStr (len : int) : string = let rand = new Random() in let ch = Array.concat [| [|'a' .. 'z'|];[|'A' .. 'Z'|];[|'0' .. '9'|] |] in let sz = Array.length ch in System.String(Array.init len (fun _ -> ch.[rand.Next sz])) in let e = randomStr 5 in printf "%s" e
额外优化提示
现有代码每次调用randomStr都会新建Random实例,短时间内多次调用时可能生成重复的随机字符串,建议将rand绑定提到函数外部,或者将随机实例作为参数传入,避免该问题。
内容的提问来源于stack exchange,提问作者TheSpiceMustFlow
相关产品推荐
相关产品推荐

