你能在Haskell中不导出一个示例吗?

kdfy810k  于 2023-06-30  发布在  其他
关注(0)|答案(1)|浏览(116)

我知道这听起来不合理。我想有比简单地隐藏一个示例更好的方法。
我在做一个关于图像的图书馆。在一个模块中,有一个用于图像大小的枚举类型:

module Sizes (Sizes(..)) where

data Size = Original
          | Regular
          | Small
          | Thumb
          | Mini

现在我需要从字符串中解析大小,特别是以不区分大小写的方式(例如"original""Original""ORIGINAL"都应该解析为Original)。我计划了以下内容:
1.为Size派生Read示例
1.创建另一个函数readSize来解析字符串,使用readreadMaybe
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
h5qlskok

h5qlskok1#

在你的情况下,我更喜欢这样做:
1.派生枚举和显示(非读取)示例

data Size = Original | ...
    deriving (Enum, Show)
  1. Make parse函数
readSize :: String -> Maybe Size
readSize str = lookup (toLower <$> str) size_map
  where
    size_map = [(toLower <$> show size, size) | size <- [Original ..]]

相关问题