2017-07-09 52 views
1

如何美化將ShowS轉換爲String的最佳方法?

(displayS $ renderPretty 0.8 80 $ _errDoc ei <> linebreak) "" 

爲什麼我不能

show $ displayS $ renderPretty 0.8 80 $ _errDoc ei <> linebreak 
+0

你不能對它進行美化,它開始並不醜陋! –

+0

因此,給它空字符串是正常的行爲,因爲DList有功能,所以要求問'toList dl = unDL dl []' – bjornmelgaard

+2

將'ShowS'轉換爲'String'的規範函數是'($「」)'。你還需要什麼? – dfeuer

回答

3

你不能show $ displayS blah因爲ShowS不是Show一個實例。回想一下,

type ShowS = String -> String 

所以如果我們想的Show一個實例,我們會寫:

instance Show (String -> String) where 
    show f = ... 

而現在我們有一個有點問題。畢竟,我們能用f這個函數做的唯一事情就是用String參數來調用它。有這麼映入腦海隨手一對夫婦的選擇,但他們每個人都有缺點:

  1. 試圖描述的所有可能的輸入的f行爲。這不會奏效 - 它有無數的輸入。閱讀和理解無限的輸出將需要很長時間。
  2. 根本不用打電話f。選取一個String作爲show的輸出,如show f = "<it's a function, lol>"中的輸出。這不是非常有用,因爲它實際上沒有給你任何有關f的信息。
  3. 撥打電話f,並帶有顯着的字符串""。這是沒有用的,因爲有很多不同的函數會爲該輸入提供相同的輸出,您將無法區分它們。 (也許碰巧你的圖書館用於烹飪ShowS值不會有這個問題,但是如果我們要有實例,它應該適用於來自任何地方的值,而不僅僅是值的一小部分! )

由於這些考慮因素,函數Show的實例不包含在標準庫中,儘管方法(1)和(2)可用於從Hackage進行安裝。

+0

有沒有任何函數'showsToString'? – bjornmelgaard

+0

我覺得這有點不公平。當然,類型'String - > String'允許函數檢查參數,但'ShowS'類型的想法是它將字符串表示爲差異列表,並且約定參數是剩餘的字符串而不被查看。這可能不會在類型級別上顯現,並且Haskell類型系統的限制可以防止'instance Show ShowS',但對於ShowS'的任何「守法」值,方法3都是明智的。 –

+0

@bjornmelgaard您已經使用過它:'showsToString f = f「」'。這很簡單,甚至不值得給一個名字。 –

相關問題