- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如预期的那样,可以正常工作:
valFrac :: Fractional a => a
valFrac = undefined
fNum :: Num a => a -> a
fNum a = undefined
resFrac :: Fractional a => a
resFrac = fNum valFrac -- Works as expected because every
-- Fractional is also a Num.
-- So as expected, we can pass
-- a Fractional argument into
-- a Num parameter.
fFrac :: Fractional a => a -> a
fFrac a = undefined
valNum :: Num a => a
valNum = undefined
valFrac :: Fractional a => a
valFrac = fFrac valNum -- Works unexpectedly! There are
-- Nums that are not Fractionals.
-- So why can I pass a Num argument
-- into a Fractional parameter?
最佳答案
chi的答案对正在发生的事情给出了很好的高层解释。我认为,提供一种稍微底层(但也更加机械化)的方式来理解这一点也可能很有趣,这样您就可以解决其他类似的问题,发动曲柄并获得正确的答案。我将讨论类型,将其作为该类型的值的用户与实现者之间的一种协议。
forall a. t
,调用者可以选择一种类型,然后继续使用协议t
(其中a
中的t
已被调用者的选择替换)。 Foo a => t
,调用者必须向实现者提供证明a
是Foo
的实例。然后,他们继续使用协议t
。 t1 -> t2
,调用者可以选择t1
类型的值(例如,通过以实现者和调用者的角色运行协议t1
)。然后,他们继续使用协议t2
。 t
(即在任何时候),实现者都可以通过仅产生适当类型的值来缩短协议的时间。如果上述规则均不适用(例如,如果我们已经达到Int
这样的基本类型或a
这样的裸类型变量),则实现者必须这样做。 valFrac :: forall a. Fractional a => a
valNum :: forall a. Num a => a
idFrac :: forall a. Fractional a => a -> a
idNum :: forall a. Num a => a -> a
applyIdNum :: forall a. Fractional a => a
applyIdNum = idNum valFrac
applyIdFrac :: forall a. Fractional a => a
applyIdFrac = idFrac valNum
applyIdNum
。该协议说:
a
类型。 Fractional
。 a
类型。 idNum
协议。因此,她必须:a
。她悄悄地做出了与呼叫者相同的选择。 a
是Num
的实例。没问题,因为她实际上知道a
是Fractional
,这意味着Num
。 a
的值。她在这里选择valFrac
。为了完整起见,她必须然后显示valFrac
具有类型a
。 valFrac
协议。她:a
类型。在这里,她安静地选择了idNum
期望的类型,恰好与呼叫者为a
选择的类型相同。 a
是Fractional
的实例。她使用与呼叫者相同的证据。 valFrac
的实现者承诺根据需要提供a
类型的值。 applyIdFrac
的类似讨论。该协议说:
a
类型。 a
是Fractional
。 a
类型的值。 idFrac
协议。因此,她必须:a
是Fractional
。她将来电者的证明转给了她。 a
类型的值。她将执行valNum
协议来执行此操作;并且我们必须检查它是否产生a
类型的值。 valNum
协议期间,她:idFrac
期望的类型,即a
;这也恰好是呼叫者选择的类型。 Num a
成立。她可以这样做,因为呼叫者提供了Fractional a
的证明,您可以从Num a
的证明中提取Fractional a
的证明。 valNum
的实现者提供一个a
类型的值。 applyIdNum
和
applyIdFrac
具有相同的类型,即
forall a. Fractional a => a
。因此,在两种情况下,实现者都可以假定
a
是
Fractional
的实例。但是由于所有
Fractional
实例都是
Num
实例,因此这意味着实现者可以假定
Fractional
和
Num
都适用。这使得在实现中假设约束的函数或值易于使用。
forall a. t
协议期间所需的类型。这是因为Haskell非常努力地向用户隐藏这些选择。但是,如果愿意,可以使用
TypeApplications
扩展名将它们明确显示。在协议
t
中选择类型
f
使用语法
f @t
。但是,实例证明仍将代您静默管理。
关于haskell - 为什么Num可以表现为分数形式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42820603/
我知道这是基本的,但我不确定,我哪里出错了,之前从未写过正则表达式.. 我需要从命令中获取一些输出 cmd | grep '[0-9]+:[0-9]+:[0-9]+:[0-9]+' 我需要grep一些
这个问题在这里已经有了答案: How does assignment work with list slices? [duplicate] (5 个答案) What does colon at as
我在一本 C 书中读到,对于数组 num[7],术语 num 等同于 &num[0]。这个概念对我来说很好,但是当我编写如下所示的程序时,我再次感到困惑。 #include #include int
例如,一种不好的方法是通过字符串分解: toReadableNum :: (Num a, Num b, Read b) => a -> b toReadableNum = read . show 如果
在输入文本字段中,我必须获取该值并在我的 .ts 文件中使用它。你能建议我应该使用以下哪种语法吗? 最佳答案 如果您希望在文本字段中看到的内容与变量中看到的内容之间进行同步对齐,请使用 如果您想在文
我正在研究 while 循环。我目前正在研究一个问题,要求从名为 a、b 和 c 的用户那里获取三个数字。我尝试显示 a 和 b 之间的所有数字,它们除以 c。我尝试使用“if”的想法,但没有成功。
因为这些符号,我很难用谷歌搜索。 num & 8, num >> 8 和 num >> 8 & 64 在 javascript 中是什么意思? 最佳答案 它们是 bitwise operators 关
显然,我的类型签名已关闭。从那以后我发现了原因。现在,我有兴趣了解更多关于我的错字上的 GHCI 推断签名。我试图让这段代码工作: elemNum :: (Eq a, Num b) => a -> [
我有一个程序根据定义的规则接受特定的字符串,即数字运算符编号。例如:2+4-5*9/8 上面的字符串是可以接受的。现在,当我输入类似 2+4-a 的内容时,它再次显示可接受,这是完全 Not Acce
我读到了这样一个旋转数组的解决方案 问题: public class Solution { public void rotate(int[] nums, int k) { in
一般来说,对于 int num , num++ (或 ++num ),作为读-修改-写操作,是 不是原子的 .但是我经常看到编译器,比如GCC ,为其生成以下代码( try here ): void
这个问题在这里已经有了答案: What's the difference between my ($variableName) and my $variableName in Perl? (4 个回答
如果列表中的 num 大于 0.5,我想得到 1,否则得到 0。 例如,a是一个列表 Matlab: b = (a > 0.5) Python: b = [1 if x > 0.5 else 0 fo
第4行为什么要在“-”后面加上“=”? num = 5 if num > 2: print(num) num -= 1 print(num) 最佳答案 num - 1:产生num减一的
iex> num = [9] '\t' 分配单个 [9] 列表返回 '\t'。这是什么原因? 最佳答案 您可以使用 i helper in IEx有关数据类型的更多信息: iex> i [9] Te
好吧,我做错了什么 - Moose 忽略了我的强制: package moo; use Moose; use Moose::Util::TypeConstraints; subtype Bar =>
这个问题已经有答案了: JavaScript property access: dot notation vs. brackets? (17 个回答) 已关闭 4 年前。 我正在练习编写一些代码。在练
我有声明 SELECT COUNT(*) as num_requests, ip_address FROM requests GROUP BY ip_address ORDER BY num_requ
有什么方法可以在 javascript 中编写更短的 (num>0)?num:0 吗? 原因是 num 变量还没有定义,在上面的例子中需要计算两次。 换句话说,a和b是已知的。我想写 (a>b)?(a
这个问题在这里已经有了答案: Why does 2 == [2] in JavaScript? (9 个回答) 关闭 9 年前。 这些陈述的计算结果为真是否有原因? 0 == [0]; 1 == [
我是一名优秀的程序员,十分优秀!