首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用于简单递归数据类型的Haskell基本显示实例

用于简单递归数据类型的Haskell基本显示实例
EN

Stack Overflow用户
提问于 2016-07-21 09:42:48
回答 3查看 316关注 0票数 0

我有个简单的问题。这个密码在我看来很好。

代码语言:javascript
运行
复制
main = do
      print("10-2")
      let a = L
      let b = E "abc" a
      print(a)
      print(b)


  data List a = L | E a (List a)

  instance (Show a) => Show (List a) where
      show L = "Empty"
      show (E a list) = (show a)++ (show list)

但它会产生以下错误:

代码语言:javascript
运行
复制
10-2.hs:5:5:
    No instance for (Show a0) arising from a use of `print'
    The type variable `a0' is ambiguous...

我找不到问题。谢谢你的帮助!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-07-21 10:10:34

如果您试图编译这个简单的程序,就会遇到相同的错误:

代码语言:javascript
运行
复制
main = print []

什么?Haskell不能打印空列表?这是正确的,不能。也就是说,除非列表元素的类型是已知的。在这种情况下不知道,所以编译失败。为了了解原因,运行以下两个程序:

代码语言:javascript
运行
复制
main = print ([] :: [Int])
main = print ([] :: [Char])

输出是不同的,尽管这些程序之间唯一的区别是空列表的类型。

但是,如果您在ghci中尝试相同的模棱两可的程序,它将很好地打印[]

代码语言:javascript
运行
复制
Prelude> let main = print []
Prelude> main
[]
Prelude>

这是因为ghcihttps://downloads.haskell.org/~ghc/7.10.1/docs/html/users_guide/interactive-evaluation.html设置比ghc稍微宽松一些。因此,如果您将数据类型定义加载到ghci,并在提示符下表示print Lghci将乐于服从:

代码语言:javascript
运行
复制
[1 of 1] Compiling Main             ( h.hs, interpreted )
Ok, modules loaded: Main.
*Main> print L
Empty
*Main>
票数 4
EN

Stack Overflow用户

发布于 2016-07-21 10:03:00

在函数main中,当您编写let a = L时,a的类型就是List a0。当编译器试图知道它必须使用的Show实例的哪个版本时,所有类型都适合,因为a的类型没有完全定义。但是,如果删除行print a,您将看到print b将工作,因为b的类型只能是List String,而且编译器确切地知道必须使用哪个版本的show

代码语言:javascript
运行
复制
main = do
  print "10-2"
  let a = L
  let b = E "abc" a
  -- print a
  print b

尝试编写print [],您将看到编译器给出了相同的错误。

但是,在ghci中,如果只键入print Lprint [],则不会提示错误。我不知道为什么会这样。

票数 4
EN

Stack Overflow用户

发布于 2016-07-21 12:33:33

正如其他人已经说过的,您需要给您的列表一个类型,即使不需要它来创建自己。

所以试一试:

代码语言:javascript
运行
复制
print (L :: List Int) 

或任何您喜欢的只要打印一个字符串的显示实例(列表a)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38500611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档