相关疑难解决方法(0)

为什么3和x(已分配3)在Haskell中具有不同的推断类型?

Haskell中的类型推断有一点学习曲线(至少可以说!).开始学习它的一个好方法是使用简单的例子.因此,以下是类型推断的"hello world".

请考虑以下示例:

Prelude> :t 3
3 :: (Num t) => t
Prelude> let x = 3
Prelude> :t x
x :: Integer
Run Code Online (Sandbox Code Playgroud)

问题是:为什么3和x有不同的类型?

链接摘要:

阅读以下答案的完整故事; 这里只是一个链接摘要:

  1. GHC类型默认:Haskell报告第4.3.4节
  2. GHCi的扩展类型默认值:使用GHCi第2.4.5节
  3. 单形限制:Haskell维基

haskell type-inference monomorphism-restriction

26
推荐指数
2
解决办法
958
查看次数

为什么GHCi奇怪地输入这个陈述?

在回答有关stackoverflow的问题时,我注意到GHCi(交互式)在let语句中分配了一个限制性太强的类型.即,给定代码,

import Control.Arrow
f = maximum &&& id >>> fst &&& (\(m,l) -> length $ filter (==m) l)
Run Code Online (Sandbox Code Playgroud)

(作为我的回答对/sf/ask/439726941/#6283594),如果一次性插入"让"之前f和在ghci中输入它,它提供以下类型信息

Prelude Control.Arrow> :t f
f :: [()] -> ((), Int)
Run Code Online (Sandbox Code Playgroud)

而只是要求表达式的类型给出正确的结果,即Ord a => [a] -> (a, Int).我正在使用ghc 7.0.3.

haskell typing ghc ghci

9
推荐指数
1
解决办法
247
查看次数