我对 F# 的“构造类型”语法很好奇。它被记录在这里。
类型参数 通用类型名称
或者
通用类型名称
通过以下示例:
int option
string list
int ref
option<int>
list<string>
ref<int>
Dictionary<int, string>
我很好奇“向后”语法是否有什么特别之处,即参数位于类型之前,或者它是否只是具有一个参数的泛型类型的糖。以下内容有效:
type 'a MyOption = // MyOption<'a> also works
| MySome of 'a
| MyNone
Run Code Online (Sandbox Code Playgroud)
但我无法让它与多个类型参数一起使用。为什么 F# 开发人员更喜欢这种带有一个参数的类型语法?是否有可能或需要让它与两个人一起工作?
我该如何用 F# 编写以下内容?
var reader = await someDatabaseCommand.ExecuteReaderAsync();
while (await reader.ReadAsync())
{
var foo = reader.GetDouble(1);
// ...
}
Run Code Online (Sandbox Code Playgroud)
我对 F# 很陌生,所以这是我能想到的最好的方法
task {
let! reader = someDatabaseCommand.ExecuteReaderAsync ()
let! tmp1 = reader.ReadAsync ()
let mutable hasNext = tmp1
while hasNext do
// ...
let! tmp2 = reader.ReadAsync ()
hasNext <- tmp2
}
Run Code Online (Sandbox Code Playgroud)
我知道它是一个 C# 库,所以它不会是完美的,但我想避免需要将结果存储ReadAsync在变量中,更不用说有两个临时变量了。我不知道有什么方法可以在Task不将其绑定到名称的情况下获得 a 的“结果”。也许递归解决方案会起作用?
我读过,取决于函数结果变量的值是非标准的 Fortran。
integer function my_sum(x, n)
integer, dimension(n), intent(in) :: x
integer , intent(in) :: n
integer :: i
my_sum = 0
do i = 1, n
my_sum = my_sum + x(i) ! Error! Cannot re-use my_sum
end do
end function
Run Code Online (Sandbox Code Playgroud)
相反,我们必须使用局部变量并在函数末尾对其进行赋值。需要明确的是,我并不期望该值在调用之间保存,而是在函数体内保存,就好像它是局部变量一样。
此说法在 Fortran 90 或更高版本中正确吗?它适用于我的编译器(英特尔),但我不确定这是否是标准的,并且除了在线随机大学幻灯片之外还没有找到任何东西。
编辑:我找到了函数名称的来源。它位于本演示文稿的幻灯片 4 中,链接来自官方 fortran-lang.org 网站。
函数中的某处必须有一个或多个如下所示的赋值语句:
函数名 = 表达式
其中表达式的结果保存到函数的名称中。
请注意,函数名称不能出现在任何表达式的右侧。