Functional programming 你能用ML打字吗?

Functional programming 你能用ML打字吗?,functional-programming,ml,Functional Programming,Ml,我没有用ML做过任何编程,但我正在学习函数式编程。ML在一般情况下对类型非常挑剔,但我想知道您是否可以进行类型转换以绕过其严格的类型限制?如果不能,是因为ML希望减少错误类型的发生,还是因为它没有实现?“类型转换”可能意味着很多不同的事情。至少有3个完全不同的用例: 在特定的不同类型(例如数字类型)之间转换。这在ML中是可能的,通过各自的函数,它们只是不伪装成“强制转换” 在顶部类型之间来回转换(如对象或无效*)。这只是一种针对非表达型系统的破解。幸运的是,ML具有适当的参数多态性和代数数据类

我没有用ML做过任何编程,但我正在学习函数式编程。ML在一般情况下对类型非常挑剔,但我想知道您是否可以进行类型转换以绕过其严格的类型限制?如果不能,是因为ML希望减少错误类型的发生,还是因为它没有实现?

“类型转换”可能意味着很多不同的事情。至少有3个完全不同的用例:

  • 在特定的不同类型(例如数字类型)之间转换。这在ML中是可能的,通过各自的函数,它们只是不伪装成“强制转换”

  • 在顶部类型之间来回转换(如
    对象
    无效*
    )。这只是一种针对非表达型系统的破解。幸运的是,ML具有适当的参数多态性和代数数据类型,因此通常不需要这些

  • 做卑鄙的低级骗术,彻底颠覆类型系统。这在ML中通常不受支持,因为它被设计成一种安全的高级语言


您对哪种类型的类型转换特别感兴趣,为什么?

关于ML的所有内容都是有意的:谢谢你的回答。我说的是第一个要点。不过,我从来没有想过第二颗子弹是铸型。我很感兴趣,因为我看到在ML中可以有类似于[1,2,3]的东西,但不能有[1,1,2,3](如果语法是关闭的,很抱歉),因为第二个列表中的所有元素都不是同一类型的。所以,我考虑了一个像[1,2.0,3]这样的例子。从技术上讲,这是行不通的,但是一个cast可以很容易地解决这个问题。@LearnLanguages96您的示例与ML无法区分;两者都失败了,因为列表中的第二项与第一个示例中的第一项类型不同,它是
int list
,第二项是
real
,但重要的是它们不匹配。SML太漂亮了,不能在标准中允许这样的事情,但是有一些特定于实现的强制转换,例如,@LearnLanguages96,您的示例是关于第二点的。这就是通常使用代数数据类型的目的。我假设您的示例应该描述一棵树,因此您可以定义树列表中的树a=L of'a | B,并将其写入
B[L1,B[L1,L2],L3]
。或者,如果您确实想要一个异构列表,那么您也可以使用数据类型:
datatype item=N of int | S of string | B of bool val xs=[n5,btrue,S“boo”,n6]
。幸运的是,后一种情况在实践中很少需要。@DanielLyons,这些不安全的结构是为了涵盖我的第三个要点。如果您试图使用它们来构建异构列表,您将走不远。