2016-04-13 130 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

相關問題