为什么 GHCi 输入这个语句很奇怪?

发布于 2024-11-14 06:53:14 字数 720 浏览 3 评论 0原文

在回答 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

缱绻入梦 2024-11-21 06:53:14

请参阅 GHCi 中使用的扩展默认规则了解 () 的来源。

至于为什么在这种情况下会发生默认,请比较以下内容:

> let f x = maximum &&& id >>> fst &&& (\(m,l) -> length $ filter (==m) l) $ x
> :t f
f :: (Ord a) => [a] -> (a, Int)

我认为这与绑定是单态有关,但我不确定细节。

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:

> let f x = maximum &&& id >>> fst &&& (\(m,l) -> length $ filter (==m) l) $ x
> :t f
f :: (Ord a) => [a] -> (a, Int)

I assume this has something to do with bindings being monomorphic, but I'm not certain of the details.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文