“约束中的非类型变量参数”的真正含义是什么?

Nea*_*roo 6 haskell type-deduction

例如:

map (+1) 2
Run Code Online (Sandbox Code Playgroud)

GHCI 收益率

<interactive>:23:1: error:
* Non type-variable argument in the constraint: Num [b]
  (Use FlexibleContexts to permit this)
* When checking the inferred type
    it :: forall b. (Num b, Num [b]) => [b]
Run Code Online (Sandbox Code Playgroud)

我见过很多与我类似的问题,但所有问题似乎都只是回答我们可以从中推断出的内容(第二个参数的类型是map错误的),以及如何修复它 - 但不是错误的实际含义。到底哪里出了问题?

che*_*ner 2

2有类型Num a => a;我们没有指定什么a ,只是它必须有一个Num实例。

map (+1)有类型Num b => [b] -> [b];我们已经指定了它b是什么,但它必须有一个Num实例。

当我们确定了类型之后map (+1) 2,我们基本上就统一了Num a ~ Num b => [b]

2 ::                  Num a    => a
map (+1) ::    Num b           => [b] -> [b]
map (+1) 2 :: (Num b, Num [b]) =>        [b]
Run Code Online (Sandbox Code Playgroud)

这就是问题所在。需要像or 这样Num的类型变量,而不是像 那样的多态类型作为其参数。ab[b]