F# 如何在F中终止函数#
我得到了这个错误: 此“let”后面的错误块未完成。期待一个表情。F# 如何在F中终止函数#,f#,F#,我得到了这个错误: 此“let”后面的错误块未完成。期待一个表情。 我应该写什么?thznk u问题是函数不返回值。函数必须始终返回一个值。如果没有要返回的内容,请返回单元。您可以将装置返回为() 我在这里做了一些可能不正确的假设,但我试图弄清楚它们是什么。在trans函数中,我还展示了如何指定返回类型。通常最好让编译器推断出类型,直到它无法推断为止。将鼠标悬停在函数上,查看编译器对类型的说明字符串->整数->字符串列表表示函数接受字符串和整数并返回字符串列表 let Trans(DirPath
我应该写什么?thznk u问题是函数不返回值。函数必须始终返回一个值。如果没有要返回的内容,请返回
单元
。您可以将装置返回为()
我在这里做了一些可能不正确的假设,但我试图弄清楚它们是什么。在trans
函数中,我还展示了如何指定返回类型。通常最好让编译器推断出类型,直到它无法推断为止。将鼠标悬停在函数上,查看编译器对类型的说明<代码>字符串->整数->字符串列表表示函数接受字符串和整数并返回字符串列表
let Trans(DirPath:string) =
if ( numOfVmFiles(DirPath) > 1) then //if there are more than 1 vm files in the directory
Init("")
let VmFiles = ListOfVmFiles(DirPath)
for VmFile in VmFiles do // for each vm file
ReadFile(VmFile)
如果函数正在执行副作用,并且没有返回某些内容,则可以这样做:
let init dirName = () //unit is returned... kind of like void but is actually a return value
let listOfVmFiles dirName = ["some";"files"] // list of string
let readFile path = "content of file" //string
let trans(dirPath:string) : string list = // takes a string and returns a list of string represented as string-> string list
let vmFiles = listOfVmFiles(dirPath) // get files from path
if(vmFiles.Length > 1) then init("") // init if more than 1 file
List.map readFile vmFiles // return a list of the content of the files
这会忽略将readFile
函数映射到列表上的结果,然后使用()
返回单元
我建议你学习fsharp。
希望这对你有帮助,祝你好运。虽然语法看起来很奇怪,但还是坚持使用它。太棒了 问题在于函数不返回值。函数必须始终返回一个值。如果没有要返回的内容,请返回
单元
。您可以将装置返回为()
我在这里做了一些可能不正确的假设,但我试图弄清楚它们是什么。在trans
函数中,我还展示了如何指定返回类型。通常最好让编译器推断出类型,直到它无法推断为止。将鼠标悬停在函数上,查看编译器对类型的说明<代码>字符串->整数->字符串列表表示函数接受字符串和整数并返回字符串列表
let Trans(DirPath:string) =
if ( numOfVmFiles(DirPath) > 1) then //if there are more than 1 vm files in the directory
Init("")
let VmFiles = ListOfVmFiles(DirPath)
for VmFile in VmFiles do // for each vm file
ReadFile(VmFile)
如果函数正在执行副作用,并且没有返回某些内容,则可以这样做:
let init dirName = () //unit is returned... kind of like void but is actually a return value
let listOfVmFiles dirName = ["some";"files"] // list of string
let readFile path = "content of file" //string
let trans(dirPath:string) : string list = // takes a string and returns a list of string represented as string-> string list
let vmFiles = listOfVmFiles(dirPath) // get files from path
if(vmFiles.Length > 1) then init("") // init if more than 1 file
List.map readFile vmFiles // return a list of the content of the files
这会忽略将readFile
函数映射到列表上的结果,然后使用()
返回单元
我建议你学习fsharp。
希望这对你有帮助,祝你好运。虽然语法看起来很奇怪,但还是坚持使用它。太棒了 在F#中,函数返回其计算的最后一个表达式的值。
在您的特定情况下,它返回单位()
,因为for
循环返回单位,除非它的主体产生
s值(在这种情况下,您需要将其包装为seq
)。
如注释中所述,此代码解析为ok-您的问题在于代码中其他地方有一个未完成的表达式
Devon Buriss的重写是最佳实践的一个很好的例子:
- 在签名中显式声明函数返回值
函数返回值,如果函数仅因副作用而调用(例如忽略
和readFile
)init(“”
- 与for.之类的命令相比,更喜欢
之类的功能性行为。。做map
let trans(dirPath:string) : unit =
let vmFiles = listOfVmFiles(dirPath)
if(vmFiles.Length > 1) then init("")
List.map readFile vmFiles |> ignore //ignore the result
()
这是否适合您取决于您打算对每个文件的内容做什么。在F#中,函数返回其计算的最后一个表达式的值。
在您的特定情况下,它返回单位()
,因为for
循环返回单位,除非它的主体产生
s值(在这种情况下,您需要将其包装为seq
)。
如注释中所述,此代码解析为ok-您的问题在于代码中其他地方有一个未完成的表达式
Devon Buriss的重写是最佳实践的一个很好的例子:
- 在签名中显式声明函数返回值
函数返回值,如果函数仅因副作用而调用(例如忽略
和readFile
)init(“”
- 与for.之类的命令相比,更喜欢
之类的功能性行为。。做map
let trans(dirPath:string) : unit =
let vmFiles = listOfVmFiles(dirPath)
if(vmFiles.Length > 1) then init("")
List.map readFile vmFiles |> ignore //ignore the result
()
这是否适合您取决于您打算对每个文件的内容做什么。现有答案为您提供了如何更好地编写代码的良好提示。您说您遇到了一个错误: 此“let”后面的块未完成。期待一个表情 这通常表示函数结束后缺少
=
或缩进错误(或类似的一些容易忽略的语法错误)。在您发布的代码片段中,所有语法对我来说都很好,所以我怀疑其他地方也有问题。以下内容没有错误:
List.map readFile vmFiles
|> seq.Concat // concatenate the file outputs
|> processContents
您会收到两条警告-因为变量名应该是
camelCase
而不是PascalCase
,但没有错误。正如其他人所说,您可能应该让Init
和ReadFile
返回一些内容,然后您需要收集结果(使代码更具功能),但这是一个单独的问题。现有答案为您提供了如何更好地编写代码的好提示。您说您遇到了一个错误:
此“let”后面的块未完成。期待一个表情
这通常表示函数结束后缺少=
或缩进错误(或类似的一些容易忽略的语法错误)。在您发布的代码片段中,所有语法对我来说都很好,所以我怀疑其他地方也有问题。以下内容没有错误:
List.map readFile vmFiles
|> seq.Concat // concatenate the file outputs
|> processContents
你得到两个警告