【问题标题】:Why is GHCi typing this statement oddly?为什么 GHCi 奇怪地键入此语句?
【发布时间】:2011-06-08 18:48:29
【问题描述】:

在回答有关 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 的回答一样),如果在f 之前插入一个“let”并将其输入到ghci 中,它会提供以下类型信息

Prelude Control.Arrow> :t f
f :: [()] -> ((), Int)

而仅仅询问表达式的类型会给出正确的结果,即Ord a => [a] -> (a, Int)。我正在使用 ghc 7.0.3。

【问题讨论】:

    标签: haskell ghc typing ghci


    【解决方案1】:

    请参阅 GHCi 中使用的 extended defaulting rules,了解 () 的来源。

    至于为什么会出现这种情况下的默认情况,对比如下:

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

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

    【讨论】:

    • 确实如此。使用-XNoMonomorphismRestriction 运行 GHCi 会得到相同的结果。
    • @hammar:谢谢,很好!出于某种原因,我没有想到要尝试这样做,我不确定 GHCi 是否可能对 REPL 中的绑定有其他特殊行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 2013-07-13
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    • 2015-06-19
    相关资源
    最近更新 更多