functional-programming - 什么是依赖类型?

标签 functional-programming dependent-type

有人可以向我解释一下依赖类型吗?我对 Haskell、Cayenne、Epigram 或其他函数式语言缺乏经验,因此您可以使用的术语越简单,我就越感激!

最佳答案

考虑一下:在所有像样的编程语言中,您都可以编写函数,例如

def f(arg) = result

这里,f 接受一个值 arg 并计算一个值 result。它是一个从值到值的函数。

现在,某些语言允许您定义多态(也称为通用)值:

def empty<T> = new List<T>()

这里,empty 采用类型 T 并计算一个值。它是一个从类型到值的函数。

通常,您还可以拥有泛型类型定义:

type Matrix<T> = List<List<T>>

这个定义接受一个类型并返回一个类型。可以将其视为从类型到类型的函数。

普通语言提供的功能就这么多了。如果一种语言还提供第四种可能性,即定义从值到类型的函数,则该语言被称为依赖类型。或者换句话说,通过值参数化类型定义:

type BoundedInt(n) = {i:Int | i<=n}

一些主流语言有一些虚假的形式,不要混淆。例如。在 C++ 中,模板可以将值作为参数,但应用时它们必须是编译时常量。在真正依赖类型的语言中并非如此。例如,我可以像这样使用上面的类型:

def min(i : Int, j : Int) : BoundedInt(j) =
  if i < j then i else j

这里,函数的结果类型取决于实际参数值j,因此是术语。

关于functional-programming - 什么是依赖类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9338709/

相关文章:

javascript - 具有常量字符串和依赖类型的流类型

scala - 我怎样才能拥有一个类型依赖于隐式参数的方法参数?

data-structures - 在 Clojure 中进入列表与进入向量

arrays - Scala 中的多重赋值而不使用数组?

functional-programming - Racket 遍历列表并获取索引

javascript - Mithril js - 跨组件通信模式

java - 让代码更加函数式风格

coq - Coq:在校对脚本编写过程中查看校对术语

coq - Coq 中保留表示法的多个Where 子句?

haskell - 为什么不依赖类型?