- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道为什么 :sprint
在这种情况下报告 xs = _
:
Prelude> xs = map (+1) [1..10]
Prelude> length xs
10
Prelude> :sprint xs
xs = _
但不是在这种情况下:
Prelude> xs = map (+1) [1..10] :: [Int]
Prelude> length xs
10
Prelude> :sprint xs
xs = [_,_,_,_,_,_,_,_,_,_]
注意:我正在使用 -XNoMonomorphismRestriction
运行 ghci
。这是否与 xs
的类型在第一种情况下是多态的但在第二种情况下不是有关?我想知道内部发生了什么。
最佳答案
要点是,对于多态 xs
,它具有以下形式的类型
xs :: Num a => [a]
底层的类型类实际上只是函数,它们采用 GHC 自动填充的额外参数,其中包含类型类函数的记录。所以你可以认为 xs
具有类型
xs :: NumDict a -> [a]
所以当你运行时
Prelude> length xs
它必须为a
选择一些值,并找到相应的NumDict
值。 IIRC 它将用 Integer 填充它,因此您实际上是在调用函数并检查结果列表的长度。
当您使用 :sprint
xs
时,您将再次填充该参数,这次使用新的类型变量。但关键是,您得到了一个完全不同的列表,您给了它一个不同的 NumDict
,因此当您之前调用 length
时,它不会以任何方式强制。
这与显式单态列表非常不同,因为那里实际上只有一个列表,只有一个要强制的值,因此当您调用 length 时,它会强制它用于 xs
的所有 future 使用.
为了让这一点更清楚,请考虑代码
data Smash a = Smash { smash :: a -> a -> a }
-- ^ Think of Monoids
intSmash :: Smash Int
intSmash = Smash (+)
listSmash :: Smash [a]
listPlus = Smash (++)
join :: Smash a -> [a] -> a
join (Smash s) xs = foldl1' s xs
这实际上就是类型类的本质,GHC 会自动为我们填写第一个 Smash a
参数。现在您的第一个示例类似于 join
,当我们将其应用于不同类型时,我们无法对输出进行任何假设,但您的第二个示例更像
join' :: [Int] -> Int
join' = join intSmash
关于haskell - :sprint for polymorphic values?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21518584/
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 5 年前。 Improve
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 6 年前。 Improv
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 4年前关闭。 Improve this qu
我已经通过此链接安装了 phabricator 扩展 Sprint https://github.com/wikimedia/phabricator-extensions-Sprint用于在 phab
冒着被告知不要询问在哪里可以找到特定程序的风险,我正在询问在哪里可以找到特定程序。我需要在 LWUIT 中开发一个应用程序(是的,旧技术,我很清楚)。有谁知道在哪里可以找到 Sprint Wirele
mongodb是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多。由于很多公司使用了云服务,服务器默认都开放了外网地址,导致前一阵子大批 MongoDB 因配
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 3年前关闭。 Improve t
我有以下过滤器来查找当前 Sprint 中的问题: resolution is EMPTY AND assignee = currentUser() AND Sprint in openSprints
我可以为我团队的 TFS 当前 Sprint 任务板添加书签吗?我们有两周的冲刺,因此 URL 每两周更改一次。 默认 URL 的形式为: http://[Server]/tfs/[Project]/
在 JIRA v7.0.10 中 当我在积压工作屏幕上时,即使我切换它们,我也可以看到已开始的冲刺的估计故事点。 (绿色圆圈)但我们也有一些计划的冲刺,当切换给定的冲刺时,故事点不可见。 (红色圆圈)
当从基本流程中分支出来时,任务项会显示在冲刺板上。但是,错误项目(及其子任务)不会显示其父错误。见下文: 任务应该显示其父任务。事实上,如果我从板上编辑错误,我可以在板上看到它。见下文: 不幸的是,刷
我想知道为什么 :sprint 在这种情况下报告 xs = _: Prelude> xs = map (+1) [1..10] Prelude> length xs 10 Prelude> :spri
当从基本流程中分支出来时,任务项会显示在冲刺板上。但是,错误项目(及其子任务)不会显示其父错误。见下文: 任务应该显示其父任务。事实上,如果我从板上编辑错误,我可以在板上看到它。见下文: 不幸的是,刷
这样写比较好 Mono.just (someVariable) .filter (somVariable doSomeStuff (v)) .switchIfEmpty
当我想使用 sprintf 函数时,char 数组(缓冲区)的适当大小是多少? 如果缓冲区只能容纳 1 个字符,我不知道为什么这部分代码可以工作?我在里面放了比 1 个多得多的字符。 /* sprin
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
与使用 + 添加字符串相比,我真的不明白使用 fmt.Sprint 有什么好处。这是两者都在使用的示例: func main() { myString := fmt.Sprint("Hello
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 3年前关闭。 Improve thi
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 3年前关闭。 Improve thi
我是 Azure DevOps 新手(之前使用过 JIRA),我不明白如何向 Sprint 添加任务、问题和错误。 我选择的流程是敏捷。 最佳答案 欢迎来到 AzureDevOps 您需要创建并定义
我是一名优秀的程序员,十分优秀!