- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Hutton 在 Haskell 中编程 说:
A type that contains one or more type variables is called polymorphic.
最佳答案
Is a polymorphic type with a concrete type substituting its type variable a type?
id :: a -> a
a := Int
并获得
Int -> Int
, 和
a := Float -> Float
并获得
(Float -> Float) -> Float -> Float
.但是,您不能说
a := Maybe
并获得
id :: Maybe -> Maybe
.那是没有意义的。相反,我们必须要求您只能替换像
Int
这样的具体类型。和
Maybe Float
为
a
,而不是像
Maybe
这样抽象的.这是用 kind 系统处理的。这对你的问题来说不太重要,所以我只是总结一下。
Int
和
Float
和
Maybe Float
都是具体类型(即它们有值),所以我们说它们有类型
Type
(类型的类型通常称为它的种类)。
Maybe
是一个函数,它接受一个具体类型作为参数并返回一个新的具体类型,所以我们说
Maybe :: Type -> Type
.中型
a -> a
, 我们说类型变量
a
必须有类型
Type
,所以现在替换
a := Int
,
a := String
等是允许的,而像
a := Maybe
这样的东西是允许的不是。
Is a polymorphic type with different concrete types substituting its type variable considered the same or different types?
a -> a
:
a := Int
给
Int -> Int
,但是
a := Float
给
Float -> Float
.不一样。
Which is a polymorphic type: a type or a set of types?
id x = x
id
的类型是什么?一种观点是
id :: Int -> Int
,还有
id :: Float -> Float
,还有
id :: (Int -> Int) -> Int -> Int
,无止境,同时进行。这个无限的类型家族可以用一个多态类型来总结,
id :: a -> a
.这个观点给你
Hindley-Milner type system .这不是现代 GHC Haskell 的工作方式,但这个系统是 Haskell 创建时所基于的。
id = \x -> x -- rewriting the example
x
没有注释。更糟糕的是,我们甚至无法决定一个:
\(x :: Int) -> x
和
\(x :: Float) -> x
一样好.在系统 F 中,我们所做的就是编写
id = /\(a :: Type) -> \(x :: a) -> x
/\
代表
Λ
(大写 lambda)就像我们使用的
\
代表
λ
.
id
是一个带两个参数的函数。第一个参数是
Type
, 名为
a
.第二个参数是
a
.结果也是
a
.类型签名是:
id :: forall (a :: Type). a -> a
forall
基本上是一种新的功能箭头。请注意,它为
a
提供了一个活页夹。 .在HM,当我们说
id :: a -> a
,我们并没有真正定义什么
a
曾是。这是一个全新的全局变量。按照惯例,最重要的是,该变量不会在其他任何地方使用(否则
Gen
eralization 规则不适用,一切都会崩溃)。如果我写过例如
inject :: a -> Maybe a
,之后,文本出现
a
将指代一个新的全局实体,与
id
中的实体不同。 .在系统 F 中,
a
在
forall a. a -> a
实际上有范围。它是一个“局部变量”,只能在
forall
下使用。 .
a
在
inject :: forall a. a -> Maybe a
可能是也可能不是“相同”
a
;没关系,因为我们有实际的范围规则,可以防止一切分崩离析。
runCont :: forall (a :: Type). (forall (r :: Type). (a -> r) -> r) -> a
runCons a f = f a (id a) -- omitting type signatures; you can fill them in
newtype Yoneda f a = Yoneda (forall b. (a -> b) -> f b)
type Bool = forall a. a -> a -> a
true, false :: Bool
true a t f = t
false a t f = f
thueMorse :: [Bool]
thueMorse = false : true : true : false : _etc
id = /\a -> \(x :: a) -> x
有类型
forall a. a -> a
,不是
Int -> Int
或
Float -> Float
.为了得到一个
Int -> Int
出
id
,你必须给它一个参数:
id Int :: Int -> Int
, 和
id Float :: Float -> Float
.
forall
没有
-XExplicitForalls
.它通过插入
forall
来模拟 Hindley-Milner 不稳定的隐式全局变量创建。在某些地方。这样做的地方被
-XScopedTypeVariables
改变了.除非启用
-XRankNTypes
,否则不能采用多态参数或具有多态字段。 .你不能说
[forall a. a -> a -> a]
,也不能说
id (forall a. a -> a -> a) :: (forall a. a -> a -> a) -> (forall a. a -> a -> a)
- 你必须定义例如
newtype Bool = Bool { ifThenElse :: forall a. a -> a -> a }
将多态性包装在单态的东西下。除非您启用
-XTypeApplications
,否则您不能显式提供类型参数。 ,然后你可以写
id @Int :: Int -> Int
.你不能写类型 lambdas (
/\
),句号;相反,它们会尽可能隐式插入。如果您定义
id :: forall a. a -> a
,那么你甚至不能写
id
在 haskell 。它将始终隐式扩展为应用程序,
id @_
.
关于haskell - 哪个是多态类型 : a type or a set of types?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57085678/
假设a是张量,那么有什么区别: 类型(a) a.类型 a.type() 我找不到区分这些的文档。 最佳答案 type 是 python 内置方法。 它将返回对象的类型。喜欢 torch.Tensor.
什么是 Type 1 的居民的例子?两者都不是 Type也不是Type的居民?在 Idris REPL 中进行探索时,我无法想出任何东西。 更准确地说,我正在寻找一些 x除了 Type产生以下结果:
我找到了一些资源,但我不确定我是否理解。 我找到的一些资源是: http://help.sap.com/saphelp_nw70/helpdata/en/fc/eb2ff3358411d1829f00
这两个函数原型(prototype)有什么区别? void apply1(double(f)(double)); void apply2(double(*f)(double)); 如果目标是将提供的函
http://play.golang.org/p/icQO_bAZNE 我正在练习使用堆进行排序,但是 prog.go:85: type bucket is not an expression
假设有一个泛型定义的方法信息对象,即一个方法信息对象,这样的方法Info.IsGenericMethodDefinition==TRUE:。也可以说它们也有一个泛型参数列表:。我可以使用以下命令获取该
在具有依赖类型的语言中,您可以使用 Type-in-Type 来简化语言并赋予它很多功能。这使得语言在逻辑上不一致,但如果您只对编程感兴趣而不对定理证明感兴趣,这可能不是问题。 在 Cayenne
根据 Nim 手册,变量类型是“静态类型”,而变量在内存中指向的实际值是“动态类型”。 它们怎么可能是不同的类型?我认为将错误的类型分配给变量将是一个错误。 最佳答案 import typetrait
假设您有以下结构和协议(protocol): struct Ticket { var items: [TicketItem] = [] } struct TicketItem { } prot
我正在处理一个 EF 问题,我发现它很难调试...以前,在我的系统中有一个表类型继承设置管理不同的用户类型 - 所有用户共有的一种根类型,以及大致基于使用该帐户的人员类型的几种不同的子类型。现在,我遇
这是我的 DBManager.swift import RealmSwift class DBManager { class func getAllDogs() -> [Dog] {
我正在尝试使用傅里叶校正图像中的曝光。这是我面临的错误 5 padded = np.log(padded + 1) #so we never have log of 0 6 g
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
请考虑以下设置: protocol MyProcotol { } class MyModel: MyProcotol { } enum Result { case success(value:
好吧,我将我的 python 项目编译成一个可执行文件,它在我的电脑上运行,但我将它发送给几个 friend 进行测试,他们都遇到了这个错误。我以前从未见过这样的错误。我使用 Nuitka 来编译代码
当我尝试训练我的模型时"ValueError: Type must be a sub-type of ndarray type"出现在 line x_norm=(np.power(x,2)).sum(
我尝试在另一个类中打断、计数然后加入对象。所以我构建协议(protocol): typealias DataBreaker = () -> [Double] typealias DataJoiner
我正在使用 VS 2015 更新 3、Angular 2.1.2、Typescript 2.0.6 有人可以澄清什么是 typings 与 npm @types 以及本月很难找到的任何其他文档吗? 或
我正在考虑从 VS2010 更改为 Mono,因此我通过 MoMA 运行我的程序集,看看我在转换过程中可能遇到多少困难。在生成的报告中,我发现我不断收到此错误: bool Type.op_Equali
主要问题 不太确定这是否可能,但由于我讨厌 Typescript 并且它使我的编码变得困难,我想我会问只是为了确定。 interface ISomeInterface { handler: ()
我是一名优秀的程序员,十分优秀!