我试过了
println [ ]
但得到了
unknown context: Show <3298 a>
这是设计不支持还是我的代码错误?
关键是表达式
[]
不提供有关列表元素类型的任何信息。但是需要此信息才能将其打印出来!
乍一看这似乎很荒谬,但请记住,类型类系统允许我们打印 A 的列表与 B 的列表不同。例如,在 Haskell 中,字符列表不会像这样打印
['n', 'o', 't', ' ', 's', 'o']
我认为在 Haskell 中存在某种类型的默认设置(至少在 GHCi 中?),因此无论如何都可以打印它。您可以在这个问题中添加“haskell”标签,并要求解释为什么它在 Haskell 中有效。
解决方案当然是添加缺少的类型信息:
println ([] :: [()]) -- for example
- - - - - - - - 编辑 - - - - - - - - - - - -
我用 GHC 7.6.2 检查了以下代码:
foo n = if n == 0 then print [] else print Nothing
main = foo 42
它确实给出了错误消息:
Could not deduce (Show a0) arising from a use of `print'
...
The type variable `a0' is ambiguous
Possible fix: add a type signature that fixes these type variable(s)
...
In the expression: print []
Could not deduce (Show a1) arising from a use of `print'
...
The type variable `a1' is ambiguous
Possible fix: add a type signature that fixes these type variable(s)
...
In the expression: print Nothing
底线是 ghci 允许在 Haskell 源代码中无效的东西。实际上,您可以键入:
let bar n = if n == 0 then print [] else print Nothing
但是如果您尝试加载相同的代码,它会给您上面的错误消息。