- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
F# 确实允许重载像 + 这样的算术运算符,但似乎不允许重载像 || 这样的 boolean 运算符。以下代码生成一个警告和两个错误:
type MyBool =
val Value : bool
new(value) = { Value = value }
static member (||) (v1: MyBool, v2 : MyBool) =
new MyBool(v1.Value || v2.Value)
let b1 = new MyBool(true)
let b2 = new MyBool(false)
let b3 = b1 || b2
警告(关于静态成员 (||) 定义):名称“(||)”不应用作成员名称。如果定义静态成员供其他 CLI 语言使用,则改用名称“op_BooleanOr”。
错误(在“let b3”语句中的 b1 和 b2 上):此表达式应具有 bool 类型,但此处具有 MyBool 类型
如果我使用 op_BooleanOr 而不是 (||),则警告消失,但错误仍然存在。
当我对 MyInt 类型中的 + 运算符执行完全相同的操作时,没有警告或错误。那么,为什么当我尝试重载 || 时会出现这些警告/错误?或者&&?
最佳答案
恐怕 F# 编译器没有任何允许您覆盖它们的逻辑运算符处理方法(就像 C# 那样)。据我所知,x && y
被简单地编译为 if x then y else false
,因此 x
必须是 boolean 值。我没有检查 F# 编译器是否支持在 C# 中声明的类型的这种行为,但我认为它不支持。
据我所知,为您自己的运算符模拟短路行为的最佳方法是使用 lazy
关键字来创建惰性值。然后你可以这样写:
let foo b =
printfn "foo %b" b
MyBool(b)
lazy foo true &&! lazy foo false // Calls 'foo' for both branches
lazy foo false &&! lazy foo false // Calls 'foo' only for the first one
这两个运算符可以使用静态成员约束来定义,因此它们应该(原则上)适用于实现 C# 所需运算符的任何类型。
let inline (&&!) (x:Lazy<_>) (y:Lazy<_>) =
if (^T: (static member op_False : ^T -> bool) x.Value)
then x.Value else x.Value &&& y.Value
let inline (||!) (x:Lazy<_>) (y:Lazy<_>) =
if (^T: (static member op_False : ^T -> bool) x.Value)
then x.Value else x.Value ||| y.Value
然后您可以使用所有必需的运算符定义您的 MyBool
类型(作为旁注,如果您这样定义它,它应该可以在 C# 中以自然的方式使用):
type MyBool(b) =
member x.Value = b
static member (|||) (v1: MyBool, v2 : MyBool) =
MyBool(v1.Value || v2.Value)
static member (&&&) (v1: MyBool, v2 : MyBool) =
MyBool(v1.Value && v2.Value)
static member op_True (v: MyBool) = v.Value
static member op_False (v: MyBool) = not v.Value
关于f# - 无法在 F# 中重载 boolean 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5002115/
Or 运算符 对两个表达式进行逻辑“或”运算。 result = expression1 Or expression2 参数 result 任意数值变量。 expression1 任意
Not 运算符 对表达式执行逻辑非运算。 result = Not expression 参数 result 任意数值变量。 expression 任意表达式。 说明 下表显示如何
Is 运算符 比较两个对象引用变量。 result = object1 Is object2 参数 result 任意数值变量。 object1 任意对象名。 object2 任意
\ 运算符 两个数相除并返回以整数形式表示的结果。 result = number1\number2 参数 result 任意数值变量。 number1 任意数值表达式。 numbe
And 运算符 对两个表达式进行逻辑“与”运算。 result = expression1 And expression2 参数 result 任意数值变量。 expression1
运算符(+) 计算两个数之和。 result = expression1 + expression2 参数 result 任意数值变量。 expression1 任意表达式。 exp
我对此感到困惑snippet : var n1 = 5-"4"; var n2 = 5+"4"; alert(n1); alert(n2); 我知道 n1 是 1。那是因为减号运算符会将字符串“4”转
我想我会得到 12,而不是 7。 w++,那么w就是4,也就是100,而w++, w 将是 8,1000;所以 w++|z++ 将是 100|1000 = 1100 将是 12。 我怎么了? int
Xor 运算符 对两个表达式进行逻辑“异或”运算。 result = expression1 Xor expression2 参数 result 任意数值变量。 expression1
Mod 运算符 两个数值相除并返回其余数。 result = number1 Mod number2 参数 result 任意数值变量。 number1 任意数值表达式。 numbe
Imp 运算符 对两个表达式进行逻辑蕴涵运算。 result = expression1 Imp expression2 参数 result 任意数值变量。 expression1 任
Eqv 运算符 执行两个表达式的逻辑等价运算。 result = expression1 Eqv expression2 参数 result 任意数值变量。 expression1 任
我有一个运算符重载的简单数学 vector 类。我想为我的运算符(operator)获取一些计时结果。我可以通过计时以下代码轻松计时我的 +=、-=、*= 和/=: Vector sum; for(s
我是用户定义比较运算符的新手。我正在读一本书,其中提到了以下示例: struct P { int x, y; bool operator、运算符<等),我们
在 SQL 的维基百科页面上,有一些关于 SQL 中 bool 逻辑的真值表。 [1] 维基百科页面似乎来源于 SQL:2003 标准。 等号运算符 (=) 的真值表与 SQL:2003 草案中的 I
我遇到了一个奇怪的 C++ 运算符。 http://www.terralib.org/html/v410/classoracle_1_1occi_1_1_number.html#a0f2780081f
我正在阅读关于 SO 和 answers 中的一个问题,它被提到为: If no unambiguous matching deallocation function can be found, pr
我偶然发现了这个解决方案,但我无法理解其中到底发生了什么。谁能解释一下! 据我了解,它试图通过计算一半的单元格然后将其加倍来计算 a*b 网格中的单元格数量。但是我无法理解递归调用。 请不要建议其他解
Go的基本类型 布尔类型bool 长度:1字节 取值:布尔类型的取值只能是true或者false,不能用数字来表示 整型 通用整型 int / uint(有符号 / 无符号,下面也类似) 长度:根据运
在本教程中,您将学习JavaScript中可用的不同运算符,以及在示例的帮助下如何使用它们。 什么是运算符? 在JavaScript中,运算符是一种特殊符号,用于对运算数(值和变量)执行操作。例如,
我是一名优秀的程序员,十分优秀!