1

これが私のデータ型です:

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

2 に答える 2

4

これは、文字列を使用した場合の動作に要約されshowます。 showは機械可読出力を提供するように設計されており、きれいなプリンターではないため、すべての文字列を引用符で囲みます。そうすれば、それがそれらを読み返しているときとの違いを知ることができます10"10"

あなたのshowFoo関数は明らかにshow家族の中にあるように設計されていません。なぜならそれはValueBooタグを消し去るので、使うshowことはあなたが本当に意味することではありません。

可能な解決策:

  1. 諦め、豚全体に行き、派生しますShow
  2. が常に文字列の場合aは、データ型を変更し、を使用しないでくださいshow
  3. 型クラスについてもう少し学び、独自のShowishクラスを定義します。-XFlexibleInstances文字列のインスタンスをオーバーライドするには、とを使用-XOverlappingInstancesします。引用符は使用しないでください。
  4. を使用してハックするinit.tail.show $ a
于 2012-10-22T00:39:26.497 に答える
1

これは、GHCiを使用した結果であり、前の結果を示しています。コンパイルされたプログラムでこれを試すか、(GHCiで)実行してみてください。文字列putStrLn (showFoo (Boo "S"))を呼び出すとshow、引用符のセットが1つになることがわかります。

于 2012-10-21T23:02:44.970 に答える