这有点主观,但是我希望能更清楚地了解哪些因素使操作员易于使用,比较钝和困难。我最近一直在考虑语言设计,而我经常回想的一个问题是何时使用该语言对该键进行一些关键操作,以及何时使用关键字或函数。
Haskell为此而臭名昭著,因为自定义运算符易于创建,并且经常会打包新的数据类型,并附带多个运算符以供使用。例如,Parsec库带有大量运算符,用于将解析器组合在一起,并带有类似的宝石>.
,.>
我什至不记得它们现在的含义,但是我确实记得一旦记住了它们,它们将非常易于使用他们的意思是。这样的函数调用会leftCompose(parser1, parser2)
更好吗?当然更冗长,但在某些方面更加清晰。
类似C的语言中的运算符重载是一个类似的问题,但又与另一个问题相混淆,即重载了熟悉的运算符的含义,例如+
具有异常的新含义。
在任何新语言中,这似乎都是一个棘手的问题。例如,在F#中,强制转换使用数学派生的类型转换运算符,而不是C#样式强制转换语法或冗长的VB样式。C#:(int32) x
VB:CType(x, int32)
F#:x :> int32
从理论上讲,一种新语言可以为大多数内置功能提供运算符。取而代之的def
或dec
或var
变量声明,为什么不! name
和@ name
或类似的东西。它肯定会缩短声明后再进行绑定:@x := 5
代替declare x = 5
或let x = 5
大多数代码将需要大量变量定义,那么为什么不呢?
操作员什么时候清楚和有用,什么时候不清楚?
+
用于字符串连接或<<
用于流)。另一方面,在Haskell中,运算符要么只是具有自定义名称(即不重载)的函数,要么是类型类的一部分,这意味着尽管它是多态的,但它对每种类型都执行相同的逻辑操作,并且甚至具有相同的类型签名。因此,>>
为>>
每一个类型,是永远不会成为一个移位。