新しいデータ型を作成し、コンストラクターを大文字の定義ではなく小文字でのみ表示できるようにしたいとします。例えば:
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)
ここで、showの最初の出現は、新しい修正されたshow関数(印刷するたびに呼び出されます)を指定する必要がありますが、2番目の出現では、コンストラクター名から文字列に取得するために、通常派生バージョンのshowを指定します。
もちろん、これは機能しません(循環定義)。ghciには「show」という単語の私の別々の意味の手がかりがないためですが、両方のバージョンにshowという名前を付ける必要があるため、区別を知らせる方法がわかりません。 、1つ目は、printが呼び出すものであり、2つ目は、コンストラクター名から文字列を取得できる事前定義されたhaskell関数であるためです。私はもう試した
show d = strToLower ((showsPrec 0 d) "")
しかし、これは同じ循環定義に帰着します。少なくとも、ghciがループに陥っていることから私が推測することです。
コンストラクター名が大文字で始まる必要がある理由は理解していますが、小文字で表示しても問題はありませんか?たとえば、すべてのケースに対して個別にshow関数を定義できることはわかっていますshow Monday = "monday"
show Tuesday = "tuesday"
が、ここでは曜日のみを例として使用しており、実際のデータ型は64個のコンストラクターで構成されているため、どういうわけか別の方法でそれを解決します。
showのhaskell定義を掘り下げて、そのコードのコピーを変更することは可能ですか?これは私が考えることができる唯一の可能な解決策ですが、それが可能であるとしても、それを行う方法がわかりません。おそらくそうではありません。したがって、他のソリューションも大歓迎です!
お時間を割いていただきありがとうございます、
Jelle(Haskell初心者)