【发布时间】:2016-02-07 21:28:33
【问题描述】:
在 haskell 中,有一个常见的 ADT 习惯用法,例如:
data MyData a = X a | Y a | Z a
...定义函数:
isX (X _) = True
isX _ = False
isY (Y _) = True
isY _ = False
isZ (Z _) = True
isZ _ = False
有没有办法自动生成这些函数?
动机:这可以说是惯用的,或者不是惯用的haskell,这取决于你问谁......标准库本身有isJust,isNothing。
扩展问题的范围,记录语法允许您为数据类型创建函数:
data MyData = A { a1 :: Type1, a2 :: Type2 } | B { b1 :: Type3, b2 :: Type4 }
这些函数有以下类型:
a1 :: MyData -> Type1
a2 :: MyData -> Type2
b1 :: MyData -> Type3
b2 :: MyData -> Type4
虽然这对于只有 1 个构造函数的数据类型无疑是非常有用的,但对于具有多个构造函数的数据类型来说就不是这样了,因为当使用了错误的构造函数时,自动生成的函数会导致错误。
有没有办法用这些类型自动生成函数?
a1 :: MyData -> Maybe Type1
a2 :: MyData -> Maybe Type2
b1 :: MyData -> Maybe Type3
b2 :: MyData -> Maybe Type4
【问题讨论】:
-
为什么要这样的功能? IMO 这是单调的。 布尔盲。直接匹配你需要的构造函数,这就是 Haskell 的方式。
-
首先想到的是 TemplateHaskell(嗯......) - 但我同意 @leftaroundabout
-
这是您的法定警告,因为 ADT 代表“代数数据类型”和“抽象数据类型”,所以它是一个值得避免的首字母缩略词。同时,检查器和选择器将前者视为后者的症状。
-
感谢 cmets!我已经扩展了我的问题......
-
我不同意上面的 cmets:这些函数完全没问题,尤其是选择器。在不需要时避免“布尔盲”是一种反反模式(参见this)。
标签: haskell