我试过
println [ ]
但得到了
unknown context: Show <3298 a>
设计不支持,或者我的代码错了吗?
答案 0 :(得分:2)
重点是表达式
[]
不提供有关列表元素类型的任何信息。 但需要这些信息才能打印出来!
这看起来很荒谬,但请记住,类型类系统允许我们以不同于B列表的方式打印A列表。例如,在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
但是如果您尝试加载相同的代码,它会为您提供上面的错误消息。