1

新しいデータタイプの可能性があるため、通常のコンマ区切り表現ではなく、改行区切り表現が必要です。

newtype SimpleRecord = SimpleRecord ([Char], [Char], Integer)
    deriving (Show)

私はこのインスタンスを書き込もうとしましたShow class

instance  Show [SimpleRecord] where
        show [(SimpleRecord (n, i, c))] = show (SimpleRecord (n, i, c))++['\n']
        show (l:ls) = (show l)++['\n']++(show ls)

GHCは私をひどく侮辱します。

誰かが私に何ができるか説明しようとすることができますか?

4

3 に答える 3

4

まず、このShowクラスはHaskell のソース コードを生成するためのものであると想定Readされており、クラスはそれを読み戻すことができます。人間が読める「きれいな」出力を生成するためのものではありません。

とは言っても、ほとんどの人が後者のためにそれを誤用しており、デバッグの目的で役立つ可能性があります.

したがって、オプションは次のとおりです。

  1. showあなたが望むことをする、呼び出されない関数を書いてください。(AndrewCさんのコメント通り。)

  2. メソッドを使用しshowListます。

と書くderiving Showと、これはコンパイラにすべてのShowメソッドを書くように指示します。自分で書きたい場合は、deriving最初にビットを取り除く必要があります。次に、次のようなインスタンスを作成できます。

instance Show SimpleRecord where
  show (SimpleRecord (x, y, z)) = ...

  showList rs = unlines (map show rs)

余談ですが、これをまだ知らない場合は、次のように書くことができます

mapM_ print records

GHCiプロンプトで、印刷可能なもののリストを1行に1要素で印刷します。


最後に余談ですが、なぜ

newtype SimpleRecord = SimpleRecord ([Char], [Char], Integer)

それよりも

data SimpleRecord = SimpleRecord [Char] [Char] Integer
于 2012-09-12T11:12:28.983 に答える
1

あなたの質問はかなり曖昧です。私が正しく解釈した場合、あなたはのデフォルトShowインスタンスを変更しようとしています[SimpleRecord]

が定義されている場合、GHCはすでにインスタンスを定義しているShow [a] ためShow aFlexibleInstancesのインスタンスを再度定義しようとすると、(拡張子を含めた後)次のエラーが発生しますShow [SimpleRecord]

Matching instances:
      instance Show a => Show [a] -- Defined in `GHC.Show'
      instance Show [SimpleRecord] -- Defined at show.hs:5:11

OverlappingInstancesしたがって、言語拡張を使用してオーバーロードできるようにする必要があります。これは、GHCが最も具体的なインスタンスに一致することを示しています。

FlexibleInstancesまた、インスタンス宣言で任意のネストされた型に言及できる拡張機能を含めることもできます。

{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverlappingInstances #-}
newtype SimpleRecord = SimpleRecord ([Char], [Char], Integer)
    deriving (Show)

instance  Show [SimpleRecord] where
    show [SimpleRecord (n, i, c)] = show (SimpleRecord (n, i, c))++"\n"
    show (l:ls) = show l ++ "\n" ++ show ls

これらの言語拡張機能の詳細については、GHCドキュメントをご覧ください。

タイプのデザインについてのコメントです。タイプを次のように定義することをお勧めします。

data SimpleRecord = SimpleRecord String String Integer 

ここでは、部分的なコンストラクターアプリケーションなどの点でより柔軟性があります。

于 2012-09-11T22:06:57.090 に答える
1

何かが欠けていたのかもしれませんが、うまく表示したいもの、つまりそれらのリストではなく、なぜあなたが (String,String,Integer) を newtyping しているのかが明確ではありませんでした。次に、リストのユニバーサル Show インスタンスを回避します。

newtype SimpleRecords = SimpleRecords [(String, String, Integer)]

instance Show SimpleRecords where
  show (SimpleRecords []) = ""
  show (SimpleRecords ((n, i, c): xs)) = 
       show (n, i, c) ++ "\n" ++ show (SimpleRecords xs)

 -- Prelude Main> let a = words "We hold these truths to be self-evident"
 -- Prelude Main> let b = words "All the best people are using Clorox"
 -- Prelude Main> let c = zip3 a b [1::Integer ..]
 -- Prelude Main> SimpleRecords c
 -- ("We","All",1)
 -- ("hold","the",2)
 -- ("these","best",3)
 -- ("truths","people",4)
 -- ("to","are",5)
 -- ("be","using",6)
 -- ("self-evident","Clorox",7)
于 2012-09-12T02:40:51.047 に答える