我知道这听起来不合理。我想有比简单地隐藏一个示例更好的方法。
我在做一个关于图像的图书馆。在一个模块中,有一个用于图像大小的枚举类型:
module Sizes (Sizes(..)) where
data Size = Original
| Regular
| Small
| Thumb
| Mini
现在我需要从字符串中解析大小,特别是以不区分大小写的方式(例如"original"
、"Original"
、"ORIGINAL"
都应该解析为Original
)。我计划了以下内容:
1.为Size
派生Read
示例
1.创建另一个函数readSize
来解析字符串,使用read
和readMaybe
1.对用户隐藏Read
示例化,这样他们就不会在解析"ORIGINAL"
时错误地使用read
或其他东西
够脏了。不管怎样,这是前两步,我不知道如何进行第三步。
data Size = ...
deriving (Read)
readSize :: String -> Maybe Size
readSize s
| (toLower <$> s) `elem` ["original", "regular", "small", "thumb", "mini"] = (read . onlyCapitaliseFirst) s
| otherwise = readMaybe s
where onlyCapitaliseFirst "" = ""
onlyCapitaliseFirst (c:xs) = toUpper c : (toLower <$> xs)
你可能会问,为什么我不自己写这个示例呢?嗯,因为实现这样的readsPrec
太不优雅和令人厌倦了,如果编译器只是使用一些魔法来完成它,那就好得多了。
instance Read Size where
readsPrec _ = \case ('o' : 'r' : 'i' : 'g' : 'i' : 'n' : 'a' : 'l' : xs) -> [(Original, XS)]
... -- it's not even correct, for only considering all lowercase case
1条答案
按热度按时间h5qlskok1#
在你的情况下,我更喜欢这样做:
1.派生枚举和显示(非读取)示例