假設我想創建一個新的數據類型並使構造函數可顯示,只能以小寫而不是大寫形式定義。例如:如何以小寫「顯示」構造函數
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,從構造函數名稱獲得一個字符串。
當然,這不起作用(循環定義),因爲ghci不知道如何讓我知道這個區別,因爲這兩個版本都需要被命名爲show,第一個是因爲這是print調用的內容,第二個是因爲它是一個預定義的haskell函數,它可以從構造函數名稱中爲我提供一個String。我試過
show d = strToLower ((showsPrec 0 d) "")
但是這可以歸結爲同一個循環定義,至少這是我從ghci的猜測被陷在一個循環。
我明白爲什麼構造函數名稱需要以大寫字母開頭,但如果顯示小寫字母不應該是個問題,應該如何?我知道我可以單獨爲每個案例定義我的演出功能,例如show Monday = "monday"
show Tuesday = "tuesday"
等,但我只使用星期幾作爲一個例子在這裏,我的真正的數據類型由64個構造函數組成,所以我認爲以不同方式解決它會更優雅。
是否可以挖掘show的haskell定義並修改該代碼的副本?這是我能想到的唯一可能的解決方案,但如果可能的話,我不知道該怎麼做。可能不會。所以其他解決方案也非常受歡迎!
感謝您抽出寶貴的時間,
耶勒(Haskell的初學者)
爲什麼不能寫'showDay day = map toLower。 show'並使用'showDay'而不是'show'? – dave4420
除了其他的答案,它可能是值得回答你的直接問題(我怎樣才能使用派生的'show'來實現我自己的'show'?),答案是「你不能」。 Haskell的一個基本規則是每個類對於一個給定的類型可能具有最多的一個實例。 –