是什么让哈斯克尔';s型系统更多“;“强有力的”;比其他语言';类型系统? 阅读,我必须问:具体是什么,这使得Haskell的类型系统比其他语言的类型系统(C,C++,java)更强大。显然,即使Scala也无法实现Haskell类型系统的某些功能。具体来说,是什么使哈斯克尔的类型系统(Hindley–Milner类型推理)如此强大?你能举个例子吗?
在其他语言中,我非常喜欢和怀念的一件事是对TypClass的支持,它是解决许多问题(包括例如多变量函数)的一种优雅的解决方案 使用TypeClass,非常容易定义非常抽象的函数,这些函数仍然是完全类型安全的,例如Fibonacci函数:是什么让哈斯克尔';s型系统更多“;“强有力的”;比其他语言';类型系统? 阅读,我必须问:具体是什么,这使得Haskell的类型系统比其他语言的类型系统(C,C++,java)更强大。显然,即使Scala也无法实现Haskell类型系统的某些功能。具体来说,是什么使哈斯克尔的类型系统(Hindley–Milner类型推理)如此强大?你能举个例子吗?,haskell,types,type-inference,type-systems,hindley-milner,Haskell,Types,Type Inference,Type Systems,Hindley Milner,在其他语言中,我非常喜欢和怀念的一件事是对TypClass的支持,它是解决许多问题(包括例如多变量函数)的一种优雅的解决方案 使用TypeClass,非常容易定义非常抽象的函数,这些函数仍然是完全类型安全的,例如Fibonacci函数: fibs :: Num a => [a] fibs@(_:xs) = 0:1:zipWith (+) fibs xs 例如: map (`div` 2) fibs -- integral context (fibs !! 10) + 1.2
fibs :: Num a => [a]
fibs@(_:xs) = 0:1:zipWith (+) fibs xs
例如:
map (`div` 2) fibs -- integral context
(fibs !! 10) + 1.234 -- rational context
map (:+ 1.0) fibs -- Complex context
您甚至可以为此定义自己的数字类型
具体来说,哈斯克尔的类型系统是由什么构成的
在过去的十年中,它被设计成既灵活——作为财产验证的逻辑——又强大
Haskell的类型系统多年来一直在开发,以鼓励一种相对灵活、表现力强的静态检查规程,几组研究人员确定了支持强大的新编译时验证类的类型系统技术。Scala's在该地区相对不发达
也就是说,Haskell/GHC提供了一种功能强大的逻辑,旨在鼓励类型级编程。函数式编程世界中相当独特的东西
一些论文给出了Haskell类型系统工程工作的方向:
关于Scala的另一篇文章:“将类作为对象和隐式类型”探讨了为什么实际上也可以在Scala中执行大部分操作,尽管要更明确一些。我倾向于感觉,但这比实际的Scala体验更具直觉性,它更为特定和明确的方法(C++讨论所谓的“名义”)最终有点混乱。 < P> Haskell语言允许你编写更安全的代码而不放弃功能。现在大多数语言都是为了安全而交换特性的:Haskell语言就是为了表明两者都有可能 我们可以在没有空指针、显式转换、松散键入的情况下生存,并且仍然拥有一种完美的表达性语言,能够生成高效的最终代码 此外,Haskell类型的系统,加上其默认的惰性和纯编码方法,在复杂但重要的问题上,如并行性和并发性,可以得到提升
只有我的两分钱。让我们举一个非常简单的例子:Haskell的
也许
data Maybe a = Nothing | Just a
在C++中:
template <T>
struct Maybe {
bool isJust;
T value; // IMPORTANT: must ignore when !isJust
};
和C++:
template <T> T sumJusts(vector<maybe<T> >);
模板T sumJusts(向量);
差异:
-
C++中有更多可能犯的错误。编译器没有检查
Maybe
的使用规则
Num
的实例,非常简单- ADTs
- 类型类
- 纯度。
纯度允许Haskell区分纯代码和支持IO的代码 - 顺磁性。
Haskell对参数多态函数强制参数化,因此它们必须遵守一些规则。(某些语言确实允许您表达多态函数类型,但它们不强制参数化,例如Scala允许您在特定类型上进行模式匹配,即使参数是多态的) - ADT
- 扩展
Haskell的基型系统是λ2的一个较弱的版本,它本身并不令人印象深刻。但是通过这些扩展,它变得非常强大(甚至能够用单例表示依赖类型): - 存在类型
- 秩-n型(满λ2)
- 类型族
- 数据类型(允许在类型级别进行“类型化”编程)
- 游荡
什么是表现力?据我所知,类型系统允许我们对代码施加什么约束,或者换句话说,我们可以证明代码的哪些属性。类型系统的表现力越强,我们可以在类型级别嵌入的信息就越多(类型检查器可以在编译时使用这些信息来检查代码)。
以下是Haskell类型系统的一些其他语言所没有的属性
如果你提供更多你所知道的细节,回答这个问题会更容易。例如,你知道什么是类型推断吗?你只想知道Hindley-Milner类型推断有什么不同,还是想知道Hindley-Milner之外的Haskell的扩展?另请参见:斐波那契不是一个很好的例子,因为它只定义为afaikYeah的整数,我认为函子会这样做
template <T> T sumJusts(vector<maybe<T> >);