相关疑难解决方法(0)

参数多态性与Ad-hoc多态性

我想了解参数多态性之间的关键区别,例如Java/Scala/C++语言中泛型类/函数的多态性和Haskell类型系统中的"ad-hoc"多态性.我熟悉第一种语言,但我从未使用过Haskell.

更确切地说:

  1. 如何在Java中的类型推断算法与Haskell中的类型推断不同?
  2. 请给我一个例子,说明可以用Java/Scala编写的东西,但不能用Haskell编写(根据这些平台的模块化特性),反之亦然.

提前致谢.

java polymorphism haskell types type-inference

52
推荐指数
2
解决办法
2万
查看次数

为什么我们需要总和类型?

想象一种语言,它不允许数据类型的多个值构造函数.而不是写作

data Color = White | Black | Blue
Run Code Online (Sandbox Code Playgroud)

我们会有

data White = White
data Black = Black
data Blue = Black
type Color = White :|: Black :|: Blue
Run Code Online (Sandbox Code Playgroud)

where :|:(这里不是|为了避免与sum类型混淆)是一个内置的类型union运算符.模式匹配可以以相同的方式工作

show :: Color -> String
show White = "white"
show Black = "black"
show Blue = "blue"
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,与副产品相比,它会产生扁平结构,因此您无需处理注射.而且,与sum类型不同,它允许随机组合类型,从而产生更大的灵活性和粒度:

type ColorsStartingWithB = Black :|: Blue
Run Code Online (Sandbox Code Playgroud)

我相信构造递归数据类型也不是问题

data Nil = Nil
data Cons a = Cons a (List a)
type List a = Cons a :|: Nil …
Run Code Online (Sandbox Code Playgroud)

haskell type-theory

11
推荐指数
3
解决办法
1096
查看次数