如何避免编写琐碎的数据类型检查功能

时间:2019-01-27 12:45:43

标签: haskell

例如,我在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手动编写isBMyData

2 个答案:

答案 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"

您只需编写isAisB即可代替$(is 'A)$(is 'B),对我来说很好用。