【发布时间】:2019-01-28 02:47:29
【问题描述】:
例如,我在 Haskell 中的一些数据类型最终会有很多记录
data MyData
= A Int Int String Float Int (Char, Char)
| B Int String Float (Char, String) String
为了检查它是什么类型,我最终编写了类似的函数
isA :: MyData -> Bool
isA (A _ _ _ _ _ _) = True
isA _ = False
-- isB and so on
现在这很快就会变得很麻烦,所以我搜索了如何使用derive 或类似于自动生成这些的东西,然后我找到了this。但是,由于引入了ghc generics 和相关的generic-deriving library,该问题中提出的library 似乎已经过时。我看过这些,但它们似乎非常强大,我不知道从哪里开始。
所以我的问题是:您如何(如果可能)避免为MyData 手动编写isA 和isB?
【问题讨论】:
-
相关 Reddit 线程:reddit.com/r/haskell/comments/74r611/deriving_is_functions。虽然……我不确定这些会使你已经发现的图书馆过时吗?
-
它的构建状态为“失败”的事实以及其下方的评论。也许说它“过时”是不准确的,我不确定。
-
如果你这样写会有帮助吗:
data MyData = A (Int, Int, String, Float, Int, (Char, Char)) | B (Int, String, Float, (Char, String), String)? -
切题:虽然这是一个完全合理的问题,但您可能需要仔细检查您是否需要以及多久实际需要布尔测试。例如,
if isA x -- etc.检查通常可以替换为x上的模式匹配(例如,使用case表达式)。
标签: haskell