Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是什么让哈斯克尔';s型系统更多“;“强有力的”;比其他语言';类型系统? 阅读,我必须问:具体是什么,这使得Haskell的类型系统比其他语言的类型系统(C,C++,java)更强大。显然,即使Scala也无法实现Haskell类型系统的某些功能。具体来说,是什么使哈斯克尔的类型系统(Hindley–Milner类型推理)如此强大?你能举个例子吗?_Haskell_Types_Type Inference_Type Systems_Hindley Milner - Fatal编程技术网

是什么让哈斯克尔';s型系统更多“;“强有力的”;比其他语言';类型系统? 阅读,我必须问:具体是什么,这使得Haskell的类型系统比其他语言的类型系统(C,C++,java)更强大。显然,即使Scala也无法实现Haskell类型系统的某些功能。具体来说,是什么使哈斯克尔的类型系统(Hindley–Milner类型推理)如此强大?你能举个例子吗?

是什么让哈斯克尔';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

在其他语言中,我非常喜欢和怀念的一件事是对TypClass的支持,它是解决许多问题(包括例如多变量函数)的一种优雅的解决方案

使用TypeClass,非常容易定义非常抽象的函数,这些函数仍然是完全类型安全的,例如Fibonacci函数:

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类型系统工程工作的方向:


Hindley Milner不是一个类型系统,而是一个类型推断算法。哈斯凯尔的类型系统,回到那个时代,过去可以使用HM完全推断出来,但那艘船已经在现代哈斯凯尔号上航行了很长时间,并进行了扩展。(ML仍然能够完全推断)

可以说,主要或完全推断所有类型的能力在表达能力方面产生了力量

但我认为这并不是问题的实质所在

dons链接的论文指出了另一个方面——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
    的使用规则
  • C++代码类型> SUMJUSTS <代码>并没有指定它需要<代码> +>代码>,并从<代码> 0 < /CUL>中抛出。当事情不起作用时显示的错误消息是神秘而奇怪的。在Haskell中,编译器只会抱怨类型不是
    Num
    的实例,非常简单
简而言之,Haskell有:

  • ADTs
  • 类型类
  • 一个非常友好的语法和对泛型的良好支持(C++中的人们试图避免它们的隐式语法)
    什么是表现力?据我所知,类型系统允许我们对代码施加什么约束,或者换句话说,我们可以证明代码的哪些属性。类型系统的表现力越强,我们可以在类型级别嵌入的信息就越多(类型检查器可以在编译时使用这些信息来检查代码)。
    以下是Haskell类型系统的一些其他语言所没有的属性

  • 纯度。
    纯度允许Haskell区分纯代码和支持IO的代码
  • 顺磁性。
    Haskell对参数多态函数强制参数化,因此它们必须遵守一些规则。(某些语言确实允许您表达多态函数类型,但它们不强制参数化,例如Scala允许您在特定类型上进行模式匹配,即使参数是多态的)
  • ADT
  • 扩展
    Haskell的基型系统是λ2的一个较弱的版本,它本身并不令人印象深刻。但是通过这些扩展,它变得非常强大(甚至能够用单例表示依赖类型):
  • 存在类型
  • 秩-n型(满λ2)
  • 类型族
  • 数据类型(允许在类型级别进行“类型化”编程)
  • 游荡

  • 如果你提供更多你所知道的细节,回答这个问题会更容易。例如,你知道什么是类型推断吗?你只想知道Hindley-Milner类型推断有什么不同,还是想知道Hindley-Milner之外的Haskell的扩展?另请参见:斐波那契不是一个很好的例子,因为它只定义为afaikYeah的整数,我认为函子会这样做
    template <T> T sumJusts(vector<maybe<T> >);