7

showが代数型の変数のリストで呼び出されたときに、各行の後に「\n」を挿入する必要があることを haskell に伝えるにはどうすればよいですか?

type Customer = (Int, Int, [Int])

私はこれをやろうとしました:

instance of Show Customer where
show x = x ++ "\n"

しかし、どうやら私は「データ....」のようなものに対してのみそのようなインスタンスを作成できます。どうすればこれを解決できますか?

Customers のリストだけを取得する必要がありShowます。これにより、表示したときに出力が読みやすくなり、1 行に 1 人の顧客が表示されます。

4

2 に答える 2

10

別の行に表示するには、 を変更せずshowに を実行しますunlines (map show customerList)。これにより、それぞれが表示され、改行文字を間に入れて元に戻されます。


ただし、シノニムの表示を変更することについて尋ねたtypeので、そのためのオプションを次に示します。

showデータの基本的なシリアル化用です。何か違うことをしたい場合は、いくつかのオプションがあります。

  1. このインスタンスでそれを行う関数を作成します。
  2. display独自の Display クラスを作成し、その機能でどのようにレイアウトするかを定義します。
  3. a を使用しnewtypeてデータをラップします。
  4. 独自の顧客タイプを宣言します。
  5. 後で改行を追加する

    タイプ Customer = (Int, Int, [Int])

例 1

displayC :: Customer -> String
displayC = (++"\n").show

例 2

{-# LANGUAGE TypeSynonymInstances,  FlexibleInstances #-}
class Display a where
  display :: a -> String

instance Display Customer where
   display x = show x ++ "\n"

instance Display Customer(ではなく言う必要があることに注意してくださいinstance of Display Customer。)

出力例:

*Main> display ((3,4,[5,6])::Customer)
"(3,4,[5,6])\n"

ただし、これらの言語拡張機能は注意して使用する必要があります。

例 3

newtype Cust = Cust Customer
displayCust (Cust c) = show c ++ "\n"

例 4

data CustomerTup = CTup Int Int [Int]
displayCTup (CTup a b cs) = show (a,b,cs) ++ "\n"

またはさらに良い、

data CustomerRec = CRec {custno::Int, custAge::Int, custMeasurements::[Int]}
  deriving Show
displayCRec r = show (custno r,custAge r,custMeasurements r) ++ "\n"

Showインスタンスのやり方に固執することさえあるかもしれません。dataより多くの型の安全性があり、レコード型により、些細な間違った位置の間違いを防ぐことができるため、この方法は良い方法です。

例 5

stuff = unlines $ map show  [(1,2,[3,4]),(5,6,[7,8,9])]

あるいは

morestuff = unlines [show (1,2,[3,4]), 
                     show (5,6,[7,8,9]),
                     "are all more numbery than",
                     show (True,4,False)]
于 2012-11-19T22:45:21.180 に答える
3

AndrewCの優れた回答への小さな追加:

6.クラス内の任意の型のテキスト表現に改行を追加する関数を作成しますShow

display :: Show a => a -> String
display = flip shows "\n"

例えば:

> display (2, 3, [5, 7, 11])
"(2,3,[5,7,11])\n"
于 2012-11-20T01:07:32.573 に答える