下面的Ocaml类型转换/转换方法有什么区别?
let a = (float) b ;;
和
let a = float_of_int b ;;
(考虑a是浮点数,b是整数。) 是否有任何优势?还是一样?
答案 0 :(得分:10)
OCaml中没有通用的类型转换机制。碰巧有一个名为import UIKit
class ViewController: UIViewController {
let screenSize: CGRect = UIScreen.mainScreen().bounds
let g = ShapeView(origin: CGPoint(x: UIScreen.mainScreen().bounds.width / 2, y: UIScreen.mainScreen().bounds.height / 2))
override func viewDidLoad() {
self.view.addSubview(g)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
for touch: AnyObject in touches {
let location = touch.locationInView(self.view) //Location of your finger
print((location.x / screenSize.width))
self.view.test((location.x / screenSize.width), v: g);
}
}
}
的函数与import UIKit
extension UIView {
func test(t : CGFloat, v : UIView){
v.superview!.bringSubviewToFront(v)
v.transform = CGAffineTransformMakeScale(CGFloat(t) + 1,1);
}
}
class ShapeView: UIView {
let size: CGFloat = 150.0
init(origin: CGPoint) {
super.init(frame: CGRectMake(0.0, 0.0, size, size))
self.center = origin
self.backgroundColor = UIColor.clearColor()
}
// We need to implement init(coder) to avoid compilation errors
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func drawRect(rect: CGRect) {
var path = UIBezierPath(ovalInRect: rect)
path.closePath()
UIColor.blackColor().setStroke()
path.fill()
}
}
做同样的事情。你可以使用任何一个,有或没有额外的括号。
float
但是没有名为(例如)float_of_int
的函数:
$ ocaml
OCaml version 4.03.0
# float 3;;
- : float = 3.
# float_of_int 3;;
- : float = 3.
# (float) 3;;
- : float = 3.
# (float_of_int) 3;;
- : float = 3.
C(和相关语言)中的类型转换与OCaml的强类型系统实际上不兼容。
答案 1 :(得分:7)
根据pervasives模块中的定义,float
和float_of_int
是两个相同的功能:
external float : int -> float = "%floatofint"
external float_of_int : int -> float = "%floatofint"
此外,写作(float) b
的风格不是类型转换。它仍然是一个功能应用程序。这里使用的括号并不意味着类型转换,但它们可以被视为表达式的一部分。
例如,以下三个表达式是相同的:
let a = (float) b;;
let a = (float b);;
let a = float b;;
答案 2 :(得分:4)
let a = (float) b
由语法规则解释为
let a = float b
其中float
是int -> float
类型的函数,恰好与float_of_int
具有相同的功能。这不是类似C语句的类型转换
double a = (float)b;
在OCaml中没有等价物。