类型为Num([Char] - > t)=> t的奇怪Haskell表达式

mlj*_*jrg 10 haskell type-inference literals ghci

在GHCi做一些练习时,我输入并获得以下内容>

ghci> (1 "one")

<interactive>:187:1:
  No instance for (Num ([Char] -> a0)) arising from a use of ‘it’
  In a stmt of an interactive GHCi command: print it
Run Code Online (Sandbox Code Playgroud)

这是一个错误,但如果我问GHCi表达式的类型,它不会给出任何错误:

ghci> :type (1 "one")
(1 "one") :: Num ([Char] -> t) => t
Run Code Online (Sandbox Code Playgroud)

是什么意思(1 "one")

为什么这个表达式会出错,但是GHCi告诉它输入是否正确?

是什么意思Num ([Char] -> t) => t

谢谢.

dup*_*ode 10

哈斯克尔报告救援!(引用部分6.4.1)

整数文字表示函数fromInteger应用于Integer类型的适当值.

fromInteger 有类型:

Prelude> :t fromInteger
fromInteger :: Num a => Integer -> a
Run Code Online (Sandbox Code Playgroud)

所以,1实际上是语法糖fromInteger (1 :: Integer).那么你的表达是:

fromInteger 1 "one"
Run Code Online (Sandbox Code Playgroud)

哪个可以写成:

(fromInteger 1) "one"
Run Code Online (Sandbox Code Playgroud)

现在,fromInteger生成一个数字(即,类型的值,其类型的实例Num告诉我们).在表达式中,此数字应用于[Char](字符串"one").GHC正确地组合了这两条信息,推断出你的表达式有类型:

Num ([Char] -> t) => t
Run Code Online (Sandbox Code Playgroud)

也就是说,这将是结果(未指定的类型t应用一个函数,这也是一个的)Num到一个[Char].原则上这是一种有效的类型.唯一的问题是没有Numfor的实例[Char] -> t(也就是说,带字符串的函数不是数字,这并不奇怪).

PS:正如Sibi和Ørjan指出的那样,在GHC 7.10及更高版本中,如果FlexibleContextsGHC扩展已启用,您将只看到问题中提到的错误; 否则类型检查器会抱怨在类约束中具有固定类型和类型构造函数(即Char,[](->)).