OCaml型铸造之间的区别

时间:2016-08-14 14:45:07

标签: types casting ocaml

下面的Ocaml类型转换/转换方法有什么区别?

let a = (float) b ;;

let a = float_of_int b ;;

(考虑a是浮点数,b是整数。) 是否有任何优势?还是一样?

3 个答案:

答案 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模块中的定义,floatfloat_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 

其中floatint -> float类型的函数,恰好与float_of_int具有相同的功能。这不是类似C语句的类型转换

double a = (float)b;

在OCaml中没有等价物。