2016-04-13 89 views
2

我试图打印以下元组为什么我可以用Haskell中的5个元素打印一个元组,但不打印6个元组?

(1,2,3,4,5,6) 

这给了我下面的错误

ERROR - Cannot find "show" function for: 
*** Expression : (1,2,3,4,5,6) 
*** Of type : (Integer,Integer,Integer,Integer,Integer,Integer) 

但是,如果我用下面的元组尝试

(1,2,3,4,5) 

一切就像一个魅力。

我的猜测是,Haskell只为最多五个元素的元组定义了Show(因为具有5个元素的元组显然是具有6个元素的元组的另一个类型)。但不知何故,我很愚蠢地为此找到证据。

所以我的问题是:

为什么会这样,我怎么能打印6个元素的元组(因为我似乎不能把元组在instance定义的头)?

编辑:我用拥抱

+1

无法重现。你使用哪个版本的GHC? – ZhekaKozlov

+0

我也一样无法重现 –

+0

我正在使用Hugs,相应地编辑了这个问题 – wastl

回答

1

你在这里。包含这个6元组的显示实例

-- Tuples -- for ref, def'n from the Prelude 
{- 
instance (Show a, Show b) => Show (a,b) where 
    showsPrec p (x,y) = showChar '(' . shows x . showChar ',' . 
            shows y . showChar ')' 


instance (Read a, Read b) => Read (a,b) where 
    readsPrec p  = readParen False 
         (\r -> [((x,y), w) | ("(",s) <- lex r, 
              (x,t) <- reads s, 
              (",",u) <- lex t, 
              (y,v) <- reads u, 
              (")",w) <- lex v ]) 
-} 
-- Other tuples have similar Read and Show instances 

instance (Show a, Show b, Show c, Show d, Show e, Show f) 
     => Show (a,b,c,d,e,f) where 
    showsPrec p (x1,x2,x3,x4,x5,x6) = showChar '(' . shows x1 . showChar ',' . 
            shows x2 . showChar ',' . 
            shows x3 . showChar ',' . 
            shows x4 . showChar ',' . 
            shows x5 . showChar ',' . 
            shows x6 . showChar ')' 
1

这是我在ghci

Prelude> (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,5 1,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100) 

<interactive>:445:1: 
    A 100-tuple is too large for GHC 
     (max size is 62) 
     Workaround: use nested tuples or define a data type 

测试然而,对于打印15是极限

Prelude> (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16) 

<interactive>:450:1: 
    No instance for (Show 
         (t0, 
         t1, 
         t2, 
         t3, 
         t4, 
         t5, 
         t6, 
         t7, 
         t8, 
         t9, 
         t10, 
         t11, 
         t12, 
         t13, 
         t14, 
         t15)) 
     arising from a use of `print' 
    Possible fix: 
     add an instance declaration for 
     (Show 
     (t0, 
      t1, 
      t2, 
      t3, 
      t4, 
      t5, 
      t6, 
      t7, 
      t8, 
      t9, 
      t10, 
      t11, 
      t12, 
      t13, 
      t14, 
      t15)) 
    In a stmt of an interactive GHCi command: print it 
+0

是GHCi有限制。拥抱也有一个限制,只是更低。 (我同意O.P.5个元素是好的,6个不是。)Hugs中容易找到Prelude Show实例定义的位置;复制代码;添加你自己的实例。在GHC中并非如此。 – AntC

7

不要用拥抱。

它没有维护多年,并且不支持现代Haskell实现应该支持的一半东西。 (Hugs支持“Haskell”98,这是语言规范的前一版本)中的大部分。)

您可能会在互联网上找到与GHC完美配合的示例代码,但与Hugs失败失败。你会花费很多时间试图弄清楚为什么你的代码不工作,只是为了最终实现“哦,它确实工作—只是与拥抱”。

+0

拥抱是Haskell无懈可击的开始。尽管使用GHC约15年,但我仍然偶尔使用它(在iPad上)。 GHC现在如此拥挤,充满了高级打字/激励,理解错误信息需要深奥的数学博士学位。不好鼓励人们进入函数式编程。我认为有一些介绍CompSci的课程推荐拥抱GHC – AntC

+0

@AntC:“提示:映射'compiler :: ProgrammingLanguage - > Program'可能不是内射的......” - 是的,GHC的错误信息从来都不是最初级的友好的,特别是[FTP](https://wiki.haskell.org/Foldable_Traversable_In_Prelude)使它变得更糟。但是,那时他们正在改变 - 现在Haskell的很多卖点是它实际上是一个竞争激烈,功能全面的生态系统,感谢Stack,您可以快速在大多数平台上运行。与那种学术,漂亮,简单但不适合生产的翻译相比,许多Lisp一直坚持。 – leftaroundabout

+0

@leftaroundabout :(StackOverflow不是讨论这个问题的地方,但是...)是的,GHC在让FP被认可用于严肃的工业强度编程方面处于领先地位。我很担心我们如何让新手去体验Haskell编程的优雅。 (尤其是来自面向对象的范例)Hugs中的工作将在GHC中起作用,所以它是一个很好的学习平台。 IMO。 – AntC

相关问题