types - "This expression was expected to have type unit"但我希望它是 bool 值

标签 types f# tuples unit-type

我正在尝试创建一个函数,将元组与元组数组的值进行比较。我需要这个来返回一个 bool 值,但 VS2013 一直告诉我: “此表达式的类型应为‘unit’,但类型为‘bool’”

let compare (i,j,a,(x : (int*int*int) array)) =
    for q in 0 .. x.GetLength(0) do  
        match (i,j,a,x) with
        | (i,j,a,x) when (i,j,a) = x.[q] -> true
        |  _ -> false

还尝试将值作为两个参数给出,但它也不起作用:

let compare (i,j,a) (x : (int*int*int) array) =
    for q in 0 .. x.GetLength(0) do  
        match (i,j,a) with
        | x.[q] -> true
        |  _ -> false

如有任何帮助,我们将不胜感激!

最佳答案

进一步扩展 Chris 的回答,您的代码不起作用的主要原因是 F# 是一种基于表达式的语言,并且没有命令式风格的控制流你可能会在这里期待(如果你错误地将表达式的主体阅读为 return 关键字)。

由于 F# 是基于表达式的,因此一切都是计算结果为值的表达式。因此,true 是一个计算结果为 true( bool 值)的表达式。您示例中的模式匹配:

match (i,j,a,x) with
| (i,j,a,x) when (i,j,a) = x.[q] -> true
|  _ -> false

... 也是一个表达式,根据变量的值计算为 truefalse( bool 值)。在这种情况下,条件会更简单:

if (i,j,a,x) = x.[q] then true else false

... 或者您可以只写条件 (i,j,a,x) = x.[q] 这意味着完全相同的事情。现在,for 循环很棘手,因为它会多次计算主体,因此它可能会获得多个返回值。出于这个原因,F# 有一个特殊类型 unit(想想 C# 中的 void),它代表一个不携带任何信息的值。因此,for 循环期望 unit 返回主体,如:

for i in 1 .. 10 do 
  printfn "Foo"

您可以检查 printfn "Foo" 是否实际返回单位值,例如:

for i in 1 .. 10 do 
  let nothing = printfn "Foo"
  nothing

如果将鼠标指针放在nothing 上,您会看到它的类型是unit

因此,如果您想在中间中断迭代,for 循环不是一个好的方法(因为它不能在 F# 中完成)。正如 Chris 和 Søren 已经提到的,您可以使用 Array 模块中的函数来轻松实现逻辑。或者,您必须使用递归或可变变量来编写它 - 但 Array 模块在这里工作得很好。

关于types - "This expression was expected to have type unit"但我希望它是 bool 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22428157/

相关文章:

python - numpy 数组转换规则不是 'safe'

java - 以 HH :MM (Not time) 的形式存储数值

java - 如何序列化接口(interface)?

f# - 我应该为 Mac OS X 中的 F# 脚本使用哪个 shebang?

python - 将包含字符串和整数值的元组中的值组合起来并存储为数据帧

c++ - 将两个参数传递给 remove_if 谓词

c# - 将字符串作为日期时间插入 SQL 中,无需 CAST

f# - 如何使用 Akka.FSharp API 在 Akka.NET 集群中实现故障转移?

scala - 相当于 F# 中的 Scala "case class"

Python 3 : Comparing tuples in a master list?