Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 如何在F中终止函数#_F# - Fatal编程技术网

F# 如何在F中终止函数#

F# 如何在F中终止函数#,f#,F#,我得到了这个错误: 此“let”后面的错误块未完成。期待一个表情。 我应该写什么?thznk u问题是函数不返回值。函数必须始终返回一个值。如果没有要返回的内容,请返回单元。您可以将装置返回为() 我在这里做了一些可能不正确的假设,但我试图弄清楚它们是什么。在trans函数中,我还展示了如何指定返回类型。通常最好让编译器推断出类型,直到它无法推断为止。将鼠标悬停在函数上,查看编译器对类型的说明字符串->整数->字符串列表表示函数接受字符串和整数并返回字符串列表 let Trans(DirPath

我得到了这个错误: 此“let”后面的错误块未完成。期待一个表情。
我应该写什么?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
    之类的功能性行为。。做
另一方面,严重依赖副作用可能会在其他地方给你带来困难。数据处理的一种更常见的做法是使用readFile这样的函数,将文件内容按顺序返回,并将结果传递给下游处理:

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
    之类的功能性行为。。做
另一方面,严重依赖副作用可能会在其他地方给你带来困难。数据处理的一种更常见的做法是使用readFile这样的函数,将文件内容按顺序返回,并将结果传递给下游处理:

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
你得到两个警告