2012-10-21 103 views
1

這是我的數據類型:Haskell中,參數化的數據類型轉換成字符串

data Foo a = Value Integer 
      |Boo a 

,我必須爲Foo數據類型轉換成字符串的函數:

showFoo::Show a=> Foo a -> String 
showFoo (Value n) = show n 
showFoo (Boo a) = show a 

例如:showFoo(值10)變爲:「10」,但對於showFoo(Boo「S」),變成:「\」S \「」但我只需要「S」。

回答

4

這歸結爲帶有字符串的show的行爲。 show旨在提供機器可讀的輸出,它不是一個漂亮的打印機,因此它會在所有字符串上放置引號。這樣,當它的閱讀它們放回它可以告訴10"10"之間的 差異。

showFoo功能顯然不是設計爲在show家庭, 因爲它抹殺了ValueBoo標籤,因此使用show你真的不是什麼 你的意思。

可能的解決方案:

  1. 放棄,幹到底,並獲得Show
  2. 如果a始終是一個字符串,請更改您的數據類型並且不要使用show
  3. 瞭解更多類型課程並定義您自己的Showish課程。 使用-XFlexibleInstances-XOverlappingInstances覆蓋 String的實例,並且不使用引號。
  4. 使用init.tail.show $ a
1

這只是你使用GHCi的結果,它顯示了以前的結果。在編譯的程序中嘗試執行此操作,或者嘗試運行(GHCi)putStrLn (showFoo (Boo "S")),您將看到在字符串上調用show會導致一組引號。

+0

我明白你的意思劈它,但我不能改變功能的簽名(putStrLn不能使用)。 – Sam

+0

我同情你,但是我不能(或者沒有動力去)在有人工約束的時候提供幫助。我想你可以做一些像'filter(/ =''')(show a)'(或者如果它們是第一個和最後一個字符,只是有條件地放下'''')。 –

+1

我敢肯定,根本的問題是,OP希望「show」foo「'導致」foo「'。我不認爲不希望將函數'Foo a - > String'放入IO monad中,並且總是寫入控制檯是解決方案中的「人爲約束」。 – Ben

相關問題