Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.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
Types &引用;此表达式的类型应为“unit”;但我希望它是布尔型的_Types_F#_Tuples_Unit Type - Fatal编程技术网

Types &引用;此表达式的类型应为“unit”;但我希望它是布尔型的

Types &引用;此表达式的类型应为“unit”;但我希望它是布尔型的,types,f#,tuples,unit-type,Types,F#,Tuples,Unit Type,我试图创建一个函数,将元组与元组数组的值进行比较。我需要它来返回布尔值,但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) with | x.[q] -> true |

我试图创建一个函数,将元组与元组数组的值进行比较。我需要它来返回布尔值,但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) with
        | x.[q] -> true
        |  _ -> false

任何帮助都将不胜感激

问题在于
for
循环希望其中的表达式计算为
单位
。您需要一种不同的方法,例如使用
Array.exists

Short and sweet:

let compare triple x = Array.exists ((=) triple) x
无需解压缩元组
(i,j,x)

符号
(=)
将相等比较运算符转换为两个常用参数的函数。当我们将
(=)
部分应用于
三重
时,也就是说,当我们编写

(=) triple

我们得到一个取一个参数的函数,并将该参数与
三元组进行比较,返回true或false。

要对Chris给出的答案进行一点扩展,代码不起作用的主要原因是F#是一种基于表达式的语言,没有您可能期望的命令式控制流(如果您错误地将表达式主体理解为
return
关键字)

由于F#是基于表达式的,所以所有内容都是计算为值的表达式。因此,
true
是计算为true(布尔)的表达式。示例中的模式匹配:

match (i,j,a,x) with
| (i,j,a,x) when (i,j,a) = x.[q] -> true
|  _ -> false
for i in 1 .. 10 do 
  let nothing = printfn "Foo"
  nothing
…也是一个表达式,根据变量的值计算为
true
false
(布尔值)。在这种情况下,条件表达式会更简单:

if (i,j,a,x) = x.[q] then true else false
…或者您可以只编写条件
(i,j,a,x)=x.[q]
,这意味着完全相同的事情。现在,
for
循环是很棘手的,因为它会多次计算实体,因此可能会得到多个返回值。因此,F有一个特殊类型的
单位
(想想C中的
void
)它表示一个不携带任何信息的值。因此,
for
循环期望
单元
-返回如下主体:

for i in 1 .. 10 do 
  printfn "Foo"
您可以检查
printfn“Foo”
是否实际返回单位值,例如:

match (i,j,a,x) with
| (i,j,a,x) when (i,j,a) = x.[q] -> true
|  _ -> false
for i in 1 .. 10 do 
  let nothing = printfn "Foo"
  nothing
如果将鼠标指针放在
上,您将看到它的类型为
单元


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

让我们比较triple x=Array.exists(=)triple)x
让我们比较triple=Array.exists(=)triple)
工作顺利!谢谢!为了扩展,“一点”:)-谢谢Tomas,我认为这是从OP的问题到单行实现的一个大飞跃,需要很多解释非常感谢!我正在学习F#,它非常有趣。喜欢你的方法!