2014-04-22 34 views
1

我没有在ML中做过任何编程,但我正在学习函数式编程。毫无疑问,ML的类型通常很特别,但我想知道是否可以进行类型转换来解决严格的类型限制?如果你不能,那是因为ML想要减少不正确类型的机会,还是它没有被实现?你可以在ML中进行类型转换吗?

+1

有关ML的一切都是故意的。 :) –

回答

3

“类型铸造”可能意味着很多不同的东西。至少有3种完全不同的用例:

  • 在特定不同类型(例如数字类型)之间转换。 ML可以通过各自的功能实现,它们只是不会伪装成“casts”

  • 从顶部类型(如Objectvoid*)往返铸造。这只是一种破解压制类型系统的方法。幸运的是,ML具有适当的参数多态性和代数数据类型,所以通常不需要这样做。

  • 做了令人讨厌的低级别诡计,彻底颠覆了类型系统。 ML通常不支持它,因为它被设计成一种安全的高级语言。

什么形式的铸造你特别感兴趣,为什么?

+0

感谢您的回答。我在谈论第一个要点。我从来没有真正想到第二个子弹类型铸造。我很感兴趣,因为我看到你可以在ML中有[1,2,3]这样的东西,但是你不可能有[1,[1,2],3](对不起,如果语法关闭),因为所有第二个列表的元素不是相同的类型。所以,我想了一个像[1,2.0,3]这样的例子。从技术上讲,这是行不通的,但演员可以轻松解决这个问题。 – JustBlossom

+0

@ LearnLanguages96您的示例与ML无法区分;都失败了,因为列表中的第二个项目与第一个示例中的第一个项目具有不同的类型,它是一个“int list”,在第二个项目中它是“真实”的,但是重要的是它们不匹配。 SML太漂亮了,不能在标准中允许这样的事情,但是有特定于实现的转换,例如[在SML/NJ中的Unsafe结构中](http://www.smlnj.org/doc/SMLofNJ/pages/ unsafe.html)或[MLton中的MLtonStructure](http://mlton.org/MLtonStructure)。 –

+0

@ LearnLanguages96,你的例子是关于第二点。这就是通常使用代数数据类型的原因。我假设你的例子应该描述一棵树,所以你可以定义'datatype'树'L' B'列表'并写入'B [L 1,B [L 1,L 2],L 3]'。或者如果你真的想要一个异构列表,那么你也可以使用数据类型:'datatype item = N of int | S的字符串| b bool val xs = [N 5,B true,S“boo”,N 6]'。幸运的是,后一种情况在实践中很少需要。 –

相关问题