为什么 GHCi 输入这个语句很奇怪?
在回答 stackoverflow 上的问题时,我注意到 GHCi(交互式)在 let 语句中分配了过于严格的类型。也就是说,给定代码,
import Control.Arrow
f = maximum &&& id >>> fst &&& (\(m,l) -> length $ filter (==m) l)
(如我对 https://stackoverflow.com/questions/6281813/maximum-of-list-and-count-of-repeat-maximum-number/6283594#6283594),如果在<之前插入“let” code>f 并在 ghci 中输入此内容,它会给出以下类型信息,
Prelude Control.Arrow> :t f
f :: [()] -> ((), Int)
而仅询问表达式的类型就会给出正确的结果,即 Ord a =>; [一]-> (a,整数)
。我正在使用 ghc 7.0.3。
In answering a question on stackoverflow, I noticed that GHCi (interactive) is assigning a too-restrictive type in a let statement. Namely, given the code,
import Control.Arrow
f = maximum &&& id >>> fst &&& (\(m,l) -> length $ filter (==m) l)
(as on my answer to https://stackoverflow.com/questions/6281813/maximum-of-list-and-count-of-repeat-maximum-number/6283594#6283594), if one inserts a "let" before f
and enters this in ghci, it gives the following type information
Prelude Control.Arrow> :t f
f :: [()] -> ((), Int)
whereas just asking for the type of the expression gives the correct result, namely Ord a => [a] -> (a, Int)
. I'm using ghc 7.0.3.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
请参阅 GHCi 中使用的扩展默认规则了解
()
的来源。至于为什么在这种情况下会发生默认,请比较以下内容:
我认为这与绑定是单态有关,但我不确定细节。
See the extended defaulting rules used in GHCi for an explanation of where the
()
is coming from.As for why the defaulting occurs in this case, compare the following:
I assume this has something to do with bindings being monomorphic, but I'm not certain of the details.