如何在Frege中打印空文字列表

时间:2013-09-11 21:15:47

标签: frege

我试过

println [ ] 

但得到了

unknown context: Show <3298 a>

设计不支持,或者我的代码错了吗?

1 个答案:

答案 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

但是如果您尝试加载相同的代码,它会为您提供上面的错误消息。