作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 Haskell 的新手,在 Haskell Programming from First Principles 书中遇到了一个让我有点困惑的例子。在第 6 章结束时,我突然想到以下内容不起作用:
constant :: (Num a) => a
constant = 1.0
f :: (Num a) => a -> a
f x = 3*x
x
输入任何数值进入函数
f
什么都不会破坏。它不限于取整数。这对我来说很直观。但是常数的例子让我完全困惑。
constant
的值仅是不比
Num
更具体的事物.所以试图给它分配一个值,它来自
Num
的子类喜欢
Fractional
不是犹太教的。
Num
的任何值。 .
最佳答案
有时,将类型理解为两个参与者(类型的实现者和类型的用户)之间玩的游戏会有所帮助。为了很好地解释这个观点,我们必须介绍一些 Haskell 默认对你隐藏的东西:我们将为所有类型变量添加绑定(bind)器。所以你的类型实际上会变成:
constant :: forall a. Num a => a
f :: forall a. Num a => a -> a
forall a. t
表示:调用者选择类型a
,游戏继续为t
c => t
表示:调用者显示约束 c
成立,游戏继续t
t -> t'
表示:调用者选择类型为 t
的值,游戏继续为t'
t
(其中 t
是单态类型,例如裸变量或 Integer
或类似的)意味着:实现者产生类型为 a
的值fromInteger
的调用。应用于Integer
通过解析该数字产生。我们有fromInteger :: forall a. Num a => Integer -> a
. fromRational
的调用。应用于Rational
通过解析该数字产生。我们有fromRational :: forall a. Fractional a => Rational -> a
. Num
类包括方法(*) :: forall a. Num a => a -> a -> a
. constant :: forall a. Num a => a
constant = 1.0 {- = fromRational (1 % 1) -}
constant
的类型说:调用者选择了一个类型,说明这个类型实现了
Num
,然后实现者必须产生该类型的值。现在实现者尝试通过调用
fromRational :: Fractional a => Rational -> a
来玩他自己的游戏。 .他选择了与调用者相同的类型,然后尝试表明该类型实现了
Fractional
。 .哎呀!他无法证明这一点,因为来电者向他证明的唯一一件事就是
a
实现
Num
-- 这不能保证
a
还实现了
Fractional
.当。所以
constant
的实现者不允许调用
fromRational
在那种类型。
f
:
f :: forall a. Num a => a -> a
f x = 3*x {- = fromInteger 3 * x -}
f
的类型说:调用者选择了一个类型,表明该类型实现了
Num
, 并选择该类型的值。然后,实现者必须生成该类型的另一个值。他将通过与
(*)
玩自己的游戏来做到这一点。和
fromInteger
.特别是,他选择了与调用者相同的类型。但是现在
fromInteger
和
(*)
只要求他证明这个类型是
Num
的一个实例——所以他放弃了来电者给他的证明,从而挽救了局面!然后他选择
Integer
3
对于
fromInteger
的参数, 并选择这个结果和调用者交给他的值作为
(*)
的两个参数.每个人都很满意,实现者可以返回一个新值。
Num
两种情况下的约束都强制执行完全相同的事情,即我们选择实例化的任何类型
a
at 必须是
Num
的成员类(class)。只是在定义
constant = 1.0
在
Num
不足以完成我们编写的操作,而在
f x = 3*x
在
Num
足以完成我们编写的操作。而且由于我们为这两件事选择的操作是如此不同,所以一个有效而另一个无效也就不足为奇了!
关于haskell - 多态性:常数与函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39281442/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!