英文:
Does Go support operator type variables?
问题
这可能不是一个很好的问题,因为我不知道任何支持这个特性的编译语言,但由于Go语言经常让我感到惊讶,我还是问一下:
为了练习,我正在用Go语言编写一个小型计算器程序。我想知道是否有一种方法可以声明和赋值一个类型为"Operator"的变量,这样我就可以像这样写:
var o Operator
o = +
var o1 Operator
o1 = /
并且编写如下的函数:
func DoOperation(a, b int, o Operator) int {
return a o b
}
(不,我不是在问运算符重载的问题。)
我不知道有哪些编译语言支持这样的功能(我对此不是很了解)。我查看了Go语言的文档中的运算符部分,但没有找到相关内容。Go语言会再次让我感到惊喜吗?
编辑: 接受的答案指出Haskell支持这一点,
英文:
This is might not be such a good question, since I don't know of any compiled language that supports this feature, but since Go is constantly surprising me, I'll ask it anyway:
For my own practice, I am writing a little calculator program in Go. I'm wondering if there is a way I can declare and assign a variable of type "Operator", such that I could, for example, write:
var o Operator
o = +
var o1 Operator
o1 = /
and write function like this
func DoOperation(a,b int,o Operator) int{
return a o b
}
(No, I am not asking about operator overloading.)
Offhand, I don't know of any compiled language that supports such a thing (I'm not an expert in this). I did look at the docs under operators and found nothing. Can Go surprise me again?
Edit: The accepted answer states that Haskell supports this,
答案1
得分: 7
不,Go运算符不是函数,因此没有有效的右侧表达式。它们以一种通用的方式工作,例如加法运算符适用于所有数值类型,而类似Haskell的中缀表示法也不受支持。
您将需要使用反射编写自己的“软”通用加法函数。
一个编译语言可以满足您所有要求的是Haskell。
英文:
No, Go operators are not functions and hence no valid right-hand expressions. They work in a generic way e.g. the plus-operator works on all numeric types and infix-notation a la haskell is not supported either.
You would have to write your own "soft"-generic addition function using reflection.
One compiled language that covers all of your requirements is Haskell.
答案2
得分: 5
你不能完全按照你说的那样做,但是你可以使用函数来代替。你需要为每个运算符编写函数,但这只需要很少的代码。
type BinaryOperator func(a, b int) int
func OpAdd(a, b int) int { return a + b }
func OpSub(a, b int) int { return a - b }
func ApplyBinaryOperator(a, b int, op BinaryOperator) int {
return op(a, b)
}
你可以定义一个BinaryOperator
类型的函数,它接受两个整数参数并返回一个整数。然后,你可以编写OpAdd
和OpSub
函数来执行加法和减法操作。最后,你可以使用ApplyBinaryOperator
函数来应用任何二元运算符。
英文:
You can't do exactly what you say, but you can use functions instead. You have to write functions for each operator, but that's relatively little code.
type BinaryOperator func(a, b int) int
func OpAdd(a, b int) int { return a + b }
func OpSub(a, b int) int { return a - b }
func ApplyBinaryOperator(a, b int, op BinaryOperator) int {
return op(a, b)
}
答案3
得分: 0
从面向对象编程(OOP)的背景出发,我开始编写以下代码:
package main
import "fmt"
type MyInt int64
func (i *MyInt) Add(n MyInt) *MyInt {
*i += n
return i
}
func (i MyInt) String() string {
v := int64(i)
return fmt.Sprintf("0x%x (%d)", v, v)
}
func main() {
x := MyInt(10)
x.Add(10).Add(20).Add(30)
fmt.Println("x =", x)
}
请注意,这是一个使用Go语言编写的程序,它定义了一个名为MyInt
的自定义类型,并为其定义了两个方法:Add
和String
。Add
方法用于将给定的整数与MyInt
类型的变量相加,并返回结果。String
方法用于将MyInt
类型的变量转换为字符串表示形式。
在main
函数中,我们创建了一个名为x
的MyInt
类型的变量,并连续调用了Add
方法四次,每次传入不同的整数。最后,我们使用fmt.Println
函数打印出x
的值。
希望这对你有帮助!
英文:
Coming from an oop background I started doing this :
package main
import "fmt"
type MyInt int64
func (i * MyInt) Add(n MyInt) * MyInt {
*i += n
return i
}
func (i MyInt) String() string {
v := int64(i)
return fmt.Sprintf("0x%x (%d)", v, v)
}
func main() {
x := MyInt(10)
x.Add(10).Add(20).Add(30)
fmt.Println("x = ", x)
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论