作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
标题和标签应充分解释问题。
最佳答案
Title and tags should explain the question adequately.
existential-type
,但您提供的两种类型都不是存在的。
map
函数将被写入
map :: ∀a. ∀b. (a → b) → [a] → [b]
map = Λa. Λb. λ(f :: a → b). λ(xs :: [a]). case xs of
[] → []
(y:ys) → f y : map @a @b f ys
map
现在是一个有四个参数的函数:两种类型(
a
和
b
)、一个函数和一个列表。我们像往常一样使用 Λ(大写 lambda)编写类型上的函数,以及使用 λ 的值上的函数。包含 Λ 的项产生包含 ∀ 的类型,就像包含 λ 的项产生包含 → 的类型一样。我使用符号
@a
(如在 GHC Core 中)表示类型参数的应用。
∀a. [a]
类型的术语?我们知道包含 ∀ 的类型来自包含 Λ 的项:
term1 :: ∀a. [a]
term1 = Λa. ?
?
我们必须提供一个
[a]
类型的术语.即,类型为
∀a. [a]
的术语意思是“给定任何类型
a
,我会给你一个类型
[a]
的列表”。
a
一无所知。 ,因为它是从外部传入的参数。所以我们可以返回一个空列表
term1 = Λa. []
term1 = Λa. undefined
term1 = Λa. [undefined, undefined]
[∀a. a]
, 然后?如果 ∀ 表示类型上的函数,则
[∀a. a]
是一个函数列表。我们可以提供尽可能少的:
term2 :: [∀a. a]
term2 = []
term2 = [f, g, h]
f
的选择是什么? ,
g
, 和
h
?
f :: ∀a. a
f = Λa. ?
a
的值,但我们对
a
类型一无所知.所以我们唯一的选择是
f = Λa. undefined
term2
看起来像
term2 :: [∀a. a]
term2 = []
term2 = [Λa. undefined]
term2 = [Λa. undefined, Λa. undefined]
term2 = undefined
∃x. T
(S, v)
v :: T
,假设您绑定(bind)了类型变量
x
至
S
内
T
.
term3 :: ∃a. a
term3 = (Int, 3)
term3 = (Char, 'x')
term3 = (∀a. a → Int, Λa. λ(x::a). 4)
∃a. a
,只要我们将该值与其类型配对。
∀a. a
的值的用户处于有利地位;他们可以选择他们喜欢的任何特定类型,使用类型应用程序
@T
, 获取
T
类型的项.类型为
∀a. a
的值的生产者处于一个糟糕的位置:他们必须准备好生产任何需要的类型,所以(如上一节)唯一的选择是
Λa. undefined
.
∃a. a
的值的用户处于可怕的境地;里面的值是某种未知的特定类型,而不是灵活的多态值。类型为
∃a. a
的值的生产者处于有利地位;正如我们在上面看到的那样,他们可以将他们喜欢的任何值(value)加入到货币对中。
type Something = ∃a. (a, a → a → a, a → String)
term4_a, term4_b :: Something
term4_a = (Int, (1, (+) @Int , show @Int))
term4_b = (String, ("foo", (++) @Char, λ(x::String). x))
triple :: Something → String
triple = λ(a, (x :: a, f :: a→a→a, out :: a→String)).
out (f (f x x) x)
triple term4_a ⇒ "3"
triple term4_b ⇒ "foofoofoo"
x
上进行模式匹配内
triple
,因为它的类型(因此是一组构造函数)是未知的。这有点像面向对象的编程。
{-# LANGUAGE ExistentialQuantification #-}
data Something = forall a. MkThing a (a -> a -> a) (a -> String)
term_a, term_b :: Something
term_a = MkThing 1 (+) show
term_b = MkThing "foo" (++) id
triple :: Something -> String
triple (MkThing x f out) =
out (f (f x x) x)
forall
而不是
exists
.这引用了这样一个事实,即我们声明了一个存在类型,但数据构造函数具有通用类型:
MkThing :: forall a. a -> (a -> a -> a) -> (a -> String) -> Something
data SomeMonoid = forall a. (Monoid a, Show a) => MkMonoid a
关于haskell - forall 和 a. 有什么区别? [a] 和 [forall a.一种]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3961851/
我是一名优秀的程序员,十分优秀!