新しいデータ型を作成し、コンストラクタを大文字の代わりに小文字でのみ表示できるようにしたいとします。たとえば、次のように表示導出を追加することによりコンストラクタを小文字で表示する方法
data Day = Monday | Tuesday | Wednesday| Thursday | Friday | Saturday | Sunday
は、GHCiのは「その他...月曜日、火曜日」としてそれらを印刷します
import Data.Char
strToLower :: [Char] -> [Char]
strToLower (x:xs) = toLower x : strToLower xs
strToLower [] = []
instance Show Day where
show d = strToLower (show d)
ショーの最初の発生が呼び出されます私の新しい改正ショーの機能を(指定する必要があります。それは「月曜日、火曜日...などの」表示するために取得するために私がショーの特別なインスタンスを作成しようとしました2回目は通常は派生したshowのものをコンストラクタ名からStringに変換するつもりです。
ghciは私の別の意味「ショー」には手がかりがないので、もちろんこれは機能しませんが(円形の定義)、両方のバージョンが必要とするために彼に区別を知らせる方法がわかりません最初のものはshowと呼ばれ、2番目のものは定義済みのhaskell関数なので、コンストラクタ名からStringを得ることができます。少なくともそれは私がループ内で立ち往生GHCiのから推測するものだ、私は
show d = strToLower ((showsPrec 0 d) "")
を試してみたが、これはダウン同じ循環定義になります。
なぜコンストラクタ名は大文字で始める必要があるのか理解していますが、小文字の場合は問題ではないはずです。私はちょうど私のショー機能をすべてのケースごとに別々に定義できることを知っています。 show Monday = "monday"
show Tuesday = "tuesday"
などがありますが、ここでは例として曜日のみを使用しています。実際のデータ型は64個のコンストラクタで構成されていますので、何とか別の方法でそれを解決するほうがよりエレガントになると思います。
showのhaskell定義を掘り下げて、そのコードのコピーを変更することはできますか?これは私が考えることができる唯一の可能な解決策ですが、それができればそれを行う方法はわかりません。おそらくそうではありません。他のソリューションも非常に歓迎です!
は、お時間を割いていただき、ありがとうございますJelle(Haskellの初心者)
なぜ 'showDay day = map toLower 'を書くことができないのですか? 'show'の代わりに' showDay'を使いますか? – dave4420
他の答えに加えて、あなたの直接の質問に答えることは価値があるかもしれません(私の独自の 'show'を実装するためにどのように派生' show'を使うことができますか?)。 Haskellの基本的な規則は、各クラスが与えられた型のインスタンスを1つ以上持つことです。 –