Types &引用;此表达式的类型应为“unit”;但我希望它是布尔型的
我试图创建一个函数,将元组与元组数组的值进行比较。我需要它来返回布尔值,但VS2013一直告诉我: 此表达式应具有类型“unit”,但具有类型“bool” 还尝试将值作为两个参数提供,但也不起作用: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 |
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#,它非常有趣。喜欢你的方法!