例如,我在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。但是,由于引入了library和相关的ghc generics,该问题中提出的generic-deriving library似乎已经过时了。我看过这些,但是它们似乎功能非常强大,我也不知道从哪里开始。
所以我的问题是:如何(如果可能的话)避免为isA
手动编写isB
和MyData
?
答案 0 :(得分:9)
为此可以利用记录语法。
isA :: MyData -> Bool
isA A{} = True
isA _ = False
这不需要扩展,并且无论构造函数A
接受多少参数都可以使用。
(话虽这么说,我认为这样的功能在Haskell中不是有用的。当心“布尔盲”-即在不需要时将信息简化为布尔)。
答案 1 :(得分:0)
因此,避免盲目编写许多类型检查功能的一种方法是使用this library(在发布的Reddit Ry中找到-谢谢!)。
示例代码:
import Data.Generics.Is.TH
-- Cumbersome
printType (A _ _ _ _ _ _) = putStrLn "Is A"
printType (B _ _ _ _ _) = putStrLn "Is B"
-- With library
printType x
| $(is 'A) x = putStrLn "Is A"
| $(is 'B) x = putStrLn "Is B"
您只需编写isA
或isB
即可代替$(is 'A)
和$(is 'B)
,对我来说很好用。