Jus*_*rey 3 haskell ml type-conversion
我想知道Haskell和ML的Type系统之间的完全不同.我不需要一般的差异,但只需要他们的类型系统的差异.
任何人都可以解释为什么在Haskell中引入这些差异?(为简单起见的任何优点)
提前致谢!
Dan*_*zer 12
在这个答案中,我将讨论Haskell 98和SML.
这两种类型的系统都具有相同的基础实在,系统F.这意味着您具有基本的参数多态性
foo :: a -> b -> a
foo : 'a -> 'b -> 'c
Run Code Online (Sandbox Code Playgroud)
SML提供了函子和模块以及Haskell类型类,但这两者都是建立在核心微积分之上的.
最有趣的区别是Haskell是System Fw,它是System F的加强版本.特别是,它提供了更丰富的种类概念(类型的类型),允许像
data Foo f a = Foo (f a)
Run Code Online (Sandbox Code Playgroud)
请注意,这f是一个从一个类型到另一个类型的函数,换句话就是它的类型* -> *.实际上,Haskell 98 + Type系列+ PolyKinds + DataKinds通过允许任意类型函数进一步扩展了这一点.这给你一些简单的类型lambda演算.例如,这是类型级别列表的教会编码
{-# LANGUAGE TypeFamilies, EmptyDataDecls #-}
-- So we can box things up to partially apply them
type family Eval e
type instance Eval (Car a b) = a
type instance Eval (Cdr a b) = b
type instance Eval (Cons a b f) = Eval (f a b)
data Car a b
data Cdr a b
data Cons a b (f :: * -> * -> *)
type First p = Eval (p Car)
type Second p = Eval (p Cdr)
foo :: First (Cons (First (Cons Int Bool)) String)
foo = 1
Run Code Online (Sandbox Code Playgroud)
这在SML的核心类型系统中是不可表达的,但是对于仿函数,人们可以解决这个问题.